Paylaşılan erişim imzalarını (SAS) kullanarak Event Hubs kaynaklarına erişimin kimliğini doğrulama

Paylaşılan erişim imzası (SAS), istemcilere sağladığınız erişim türü üzerinde ayrıntılı denetim sağlar. Sas içinde ayarlayabileceğiniz denetimlerden bazıları şunlardır:

  • SAS'nin geçerli olduğu ve başlangıç zamanını ve bitiş zamanını içeren aralık.
  • SAS tarafından verilen izinler. Örneğin, Event Hubs ad alanı için SAS dinleme izni verebilir, ancak gönderme iznini vermeyebilir.
  • Yalnızca geçerli kimlik bilgileri sunan istemciler bir olay hub'ına veri gönderebilir.
  • İstemci başka bir istemcinin kimliğine bürünemez.
  • Düzenbaz bir istemcinin bir olay hub'ına veri göndermesi engellenebilir.

Bu makale, SAS kullanarak Event Hubs kaynaklarına erişimin kimliğini doğrulamayı kapsar. SAS kullanarak Event Hubs kaynaklarına erişim yetkisi verme hakkında bilgi edinmek için bu makaleye bakın.

Not

Microsoft, daha kolay ele geçirilebilen paylaşılan erişim imzalarını kullanmak yerine mümkün olduğunda en iyi güvenlik uygulaması olarak Microsoft Entra kimlik bilgilerini kullanmanızı önerir. Event Hubs kaynaklarınıza ayrıntılı erişim vermek için paylaşılan erişim imzalarını (SAS) kullanmaya devam edebilirsiniz ancak Microsoft Entra ID, SAS belirteçlerini yönetmeye veya güvenliği aşılmış SAS'yi iptal etme konusunda endişelenmeye gerek kalmadan benzer özellikler sunar.

Azure Event Hubs'da Microsoft Entra tümleştirmesi hakkında daha fazla bilgi için bkz . Microsoft Entra Id kullanarak Event Hubs'a erişimi yetkilendirme.

SAS kimlik doğrulaması için yapılandırma

Bir Event Hubs ad alanında veya varlıkta (olay hub'ı örneği veya olay hub'ında Kafka Konusu) SAS kuralı yapılandırabilirsiniz. Bir tüketici grubunda SAS kuralı yapılandırma şu anda desteklenmiyor, ancak tüketici grubuna erişimin güvenliğini sağlamak için ad alanında veya varlıkta yapılandırılmış kuralları kullanabilirsiniz.

Aşağıdaki görüntüde, yetkilendirme kurallarının örnek varlıklara nasıl uygulandığı gösterilmektedir.

Yetkilendirme kuralını yapılandırma

Bu örnekte örnek Event Hubs ad alanının (ExampleNamespace) iki varlığı vardır: eh1 ve Kafka konu1. Yetkilendirme kuralları hem varlık düzeyinde hem de ad alanı düzeyinde tanımlanır.

manageRuleNS, sendRuleNS ve listenRuleNS yetkilendirme kuralları hem eh1 hem de t1 için geçerlidir. listenRule-eh ve sendRule-eh yetkilendirme kuralları yalnızca eh1 için geçerlidir ve sendRuleT yetkilendirme kuralı yalnızca konu1 için geçerlidir.

sendRuleNS yetkilendirme kuralını kullandığınızda, istemci uygulamaları hem eh1 hem de konu1'e gönderebilir. sendRuleT yetkilendirme kuralı kullanıldığında, yalnızca konu1'e ayrıntılı erişim uygular ve bu nedenle erişim için bu kuralı kullanan istemci uygulamaları artık eh1'e gönderemez, yalnızca konu1'e gönderemez.

Paylaşılan Erişim İmzası belirteci oluşturma

Yetkilendirme kuralı adı ve imzalama anahtarlarından birine erişimi olan tüm istemciler sas belirteci oluşturabilir. Belirteç, aşağıdaki biçimde bir dize oluşturularak oluşturulur:

  • se – Belirteç süre sonu anında. Belirtecin süresi dolduğunda 1 Ocak 1970 (UNIX dönemi) tarihinde 00:00:00 UTC saatinden bu yana geçen saniyeleri yansıtan tamsayı
  • skn – SAS anahtarı adı olan yetkilendirme kuralının adı.
  • sr – Erişilmekte olan kaynağın URI'sini.
  • sig –Imza.

İmza dizesi, kaynak URI'sinin (önceki bölümde açıklandığı gibi kapsam) sha-256 karması ve crlf ile ayrılmış belirtecin dize gösterimidir. Karma hesaplama aşağıdaki sahte koda benzer ve 256 bit/32 bayt karma değeri döndürür.

SHA-256('https://<yournamespace>.servicebus.windows.net/'+'\n'+ 1438205742)

Belirteç, karma olmayan değerleri içerir, böylece alıcı karmayı aynı parametrelerle yeniden derleyebilir ve verenin geçerli bir imzalama anahtarına sahip olduğunu doğrular.

Kaynak URI'si, erişim talep edilen Service Bus kaynağının tam URI'sini oluşturur. Örneğin, http://<namespace>.servicebus.windows.net/<entityPath> veya sb://<namespace>.servicebus.windows.net/<entityPath> diğer bir ifadeyle. http://contoso.servicebus.windows.net/eh1

URI yüzde kodlanmış olmalıdır.

İmzalama için kullanılan SAS kuralı, bu URI tarafından belirtilen varlıkta veya hiyerarşik üst öğelerinden biri tarafından yapılandırılmalıdır. Örneğin, http://contoso.servicebus.windows.net/eh1 veya http://contoso.servicebus.windows.net önceki örnekte.

SAS belirteci, imza dizesinde kullanılan ile <resourceURI> önekli tüm kaynaklar için geçerlidir.

Not

Paylaşılan erişim ilkesini kullanarak Event Hubs için bir erişim belirteci oluşturursunuz. Daha fazla bilgi için bkz . Paylaşılan erişim yetkilendirme ilkesi.

İlkeden imza (belirteç) oluşturma

Aşağıdaki bölümde paylaşılan erişim imzası ilkelerini kullanarak SAS belirteci oluşturma gösterilmektedir.

NodeJS

function createSharedAccessToken(uri, saName, saKey) { 
  if (!uri || !saName || !saKey) { 
          throw "Missing required parameter"; 
      } 
  var encoded = encodeURIComponent(uri); 
  var now = new Date(); 
  var week = 60*60*24*7;
  var ttl = Math.round(now.getTime() / 1000) + week;
  var signature = encoded + '\n' + ttl; 
  var hash = crypto.createHmac('sha256', saKey).update(signature, 'utf8').digest('base64'); 
  return 'SharedAccessSignature sr=' + encoded + '&sig=' +  
      encodeURIComponent(hash) + '&se=' + ttl + '&skn=' + saName; 
}

Bir olay hub'ına bağlanmak için bir ilke adı ve anahtar değeri kullanmak için parametresini EventHubProducerClient alan oluşturucuyu AzureNamedKeyCredential kullanın.

const producer = new EventHubProducerClient("NAMESPACE NAME.servicebus.windows.net", eventHubName, new AzureNamedKeyCredential("POLICYNAME", "KEYVALUE"));

öğesine bir başvuru AzureNamedKeyCredentialeklemeniz gerekir.

const { AzureNamedKeyCredential } = require("@azure/core-auth");

Kodu kullanarak oluşturduğunuz bir SAS belirtecini kullanmak için parametresini EventHubProducerClient alan oluşturucuyu AzureSASCredential kullanın.

var token = createSharedAccessToken("https://NAMESPACENAME.servicebus.windows.net", "POLICYNAME", "KEYVALUE");
const producer = new EventHubProducerClient("NAMESPACENAME.servicebus.windows.net", eventHubName, new AzureSASCredential(token));

öğesine bir başvuru AzureSASCredentialeklemeniz gerekir.

const { AzureSASCredential } = require("@azure/core-auth");

JAVA

private static String GetSASToken(String resourceUri, String keyName, String key)
  {
      long epoch = System.currentTimeMillis()/1000L;
      int week = 60*60*24*7;
      String expiry = Long.toString(epoch + week);

      String sasToken = null;
      try {
          String stringToSign = URLEncoder.encode(resourceUri, "UTF-8") + "\n" + expiry;
          String signature = getHMAC256(key, stringToSign);
          sasToken = "SharedAccessSignature sr=" + URLEncoder.encode(resourceUri, "UTF-8") +"&sig=" +
                  URLEncoder.encode(signature, "UTF-8") + "&se=" + expiry + "&skn=" + keyName;
      } catch (UnsupportedEncodingException e) {

          e.printStackTrace();
      }

      return sasToken;
  }


public static String getHMAC256(String key, String input) {
    Mac sha256_HMAC = null;
    String hash = null;
    try {
        sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        Encoder encoder = Base64.getEncoder();

        hash = new String(encoder.encode(sha256_HMAC.doFinal(input.getBytes("UTF-8"))));

    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
   } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return hash;
}

PHP

function generateSasToken($uri, $sasKeyName, $sasKeyValue) 
{ 
    $targetUri = strtolower(rawurlencode(strtolower($uri))); 
    $expires = time(); 	
    $expiresInMins = 60; 
    $week = 60*60*24*7;
    $expires = $expires + $week; 
    $toSign = $targetUri . "\n" . $expires; 
    $signature = rawurlencode(base64_encode(hash_hmac('sha256', 			
     $toSign, $sasKeyValue, TRUE))); 
    
    $token = "SharedAccessSignature sr=" . $targetUri . "&sig=" . $signature . "&se=" . $expires . 		"&skn=" . $sasKeyName; 
    return $token; 
}

C#

private static string createToken(string resourceUri, string keyName, string key)
{
    TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
    var week = 60 * 60 * 24 * 7;
    var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + week);
    string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;
    using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key)))
    {
        var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
        var sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}", HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName);
        return sasToken;
    }
}

PowerShell

[Reflection.Assembly]::LoadWithPartialName("System.Web")| out-null
$URI="myNamespace.servicebus.windows.net/myEventHub/"
$Access_Policy_Name="RootManageSharedAccessKey"
$Access_Policy_Key="myPrimaryKey"
#Token expires now+300
$Expires=([DateTimeOffset]::Now.ToUnixTimeSeconds())+300
$SignatureString=[System.Web.HttpUtility]::UrlEncode($URI)+ "`n" + [string]$Expires
$HMAC = New-Object System.Security.Cryptography.HMACSHA256
$HMAC.key = [Text.Encoding]::ASCII.GetBytes($Access_Policy_Key)
$Signature = $HMAC.ComputeHash([Text.Encoding]::ASCII.GetBytes($SignatureString))
$Signature = [Convert]::ToBase64String($Signature)
$SASToken = "SharedAccessSignature sr=" + [System.Web.HttpUtility]::UrlEncode($URI) + "&sig=" + [System.Web.HttpUtility]::UrlEncode($Signature) + "&se=" + $Expires + "&skn=" + $Access_Policy_Name
$SASToken

BASH

get_sas_token() {
    local EVENTHUB_URI='EVENTHUBURI'
    local SHARED_ACCESS_KEY_NAME='SHAREDACCESSKEYNAME'
    local SHARED_ACCESS_KEY='SHAREDACCESSKEYVALUE'
    local EXPIRY=${EXPIRY:=$((60 * 60 * 24))} # Default token expiry is 1 day

    local ENCODED_URI=$(echo -n $EVENTHUB_URI | jq -s -R -r @uri)
    local TTL=$(($(date +%s) + $EXPIRY))
    local UTF8_SIGNATURE=$(printf "%s\n%s" $ENCODED_URI $TTL | iconv -t utf8)

    local HASH=$(echo -n "$UTF8_SIGNATURE" | openssl sha256 -hmac $SHARED_ACCESS_KEY -binary | base64)
    local ENCODED_HASH=$(echo -n $HASH | jq -s -R -r @uri)

    echo -n "SharedAccessSignature sr=$ENCODED_URI&sig=$ENCODED_HASH&se=$TTL&skn=$SHARED_ACCESS_KEY_NAME"
}

SAS ile Event Hubs yayımcılarının kimliğini doğrulama

Olay yayımcısı, bir olay hub'ı için sanal uç nokta tanımlar. Yayımcı yalnızca bir olay hub'ına ileti göndermek ve ileti almak için kullanılabilir.

Genellikle bir olay hub'ı istemci başına bir yayımcıyı devreye alır. Bir olay hub'ının yayımcılarından herhangi birine gönderilen tüm iletiler bu olay hub'ının içinde sıralanır. Yayımcılar ayrıntılı erişim denetimini etkinleştirir.

Her Event Hubs istemcisine, istemciye yüklenen benzersiz bir belirteç atanır. Belirteçler, her benzersiz belirtecin farklı benzersiz yayımcıya erişim izni vermesi için oluşturulur. Belirteci tutan bir istemci yalnızca bir yayımcıya gönderebilir ve başka yayımcıya gönderemez. Birden çok istemci aynı belirteci paylaşıyorsa, her biri yayımcıyı paylaşır.

Tüm belirteçler SAS anahtarlarıyla atanır. Genellikle tüm belirteçler aynı anahtarla imzalı olur. İstemciler anahtarın farkında değildir ve bu da istemcilerin belirteç üretmesini engeller. İstemciler süresi dolana kadar aynı belirteçlerde çalışır.

Örneğin, kapsamı yalnızca Event Hubs'a gönderme/yayımlama olarak belirlenmiş yetkilendirme kurallarını tanımlamak için bir gönderme yetkilendirme kuralı tanımlamanız gerekir. Ad alanı düzeyinde yapılabilir veya belirli bir varlığa (event hubs örneği veya konu başlığı) daha ayrıntılı kapsam verebilir. Bu tür ayrıntılı erişimle kapsamı belirlenmiş bir istemci veya uygulama Event Hubs yayımcısı olarak adlandırılır. Bunu yapmak için aşağıdaki adımları izleyin:

  1. Yayımlamak istediğiniz varlıkta, gönderme kapsamını atamak için bir SAS anahtarı oluşturun. Daha fazla bilgi için bkz . Paylaşılan erişim yetkilendirme ilkeleri.

  2. 1. adımda oluşturulan anahtarı kullanarak belirli bir yayımcı için süre sonu süresine sahip bir SAS belirteci oluşturun. Örnek kod için bkz . İlkeden imza (belirteç) oluşturma.

  3. Yalnızca varlığa ve belirtecin erişim izni veren yayımcıya gönderebilen yayımcı istemcisine belirteci sağlayın.

    Belirtecin süresi dolduğunda, istemci varlığa gönderme/yayımlama erişimini kaybeder.

Not

Önerilmez, ancak cihazları bir olay hub'ına veya ad alanına erişim veren belirteçlerle donatmak mümkündür. Bu belirteci barındıran tüm cihazlar doğrudan bu olay hub'ına ileti gönderebilir. Ayrıca, cihazın bu olay hub'ına gönderilmesi engellenemez.

Her zaman belirli ve ayrıntılı kapsamlar vermeniz önerilir.

Önemli

Belirteçler oluşturulduktan sonra, her istemci kendi benzersiz belirteci ile sağlanır.

İstemci bir olay hub'ına veri gönderdiğinde, isteğini belirteçle etiketler. Bir saldırganın gizlice dinlemesini ve belirteci çalmasını önlemek için istemci ile olay hub'ı arasındaki iletişimin şifrelenmiş bir kanal üzerinden gerçekleşmesi gerekir.

Bir belirteç bir saldırgan tarafından çalınırsa, saldırgan belirteci çalınan istemcinin kimliğine bürünebilir. Bir yayımcının engellenmesi, farklı bir yayımcı kullanan yeni bir belirteç alınana kadar bu istemciyi kullanılamaz hale getirir.

SAS ile Event Hubs tüketicilerinin kimliğini doğrulama

Event Hubs üreticileri tarafından oluşturulan verilerden tüketen arka uç uygulamalarının kimliğini doğrulamak için Event Hubs belirteci kimlik doğrulaması, istemcilerinin yönetme haklarına veya Event Hubs ad alanına ya da olay hub'ı örneğine ya da konusuna atanmış dinleme ayrıcalıklarına sahip olmasını gerektirir. Veriler Event Hubs'dan tüketici grupları kullanılarak kullanılır. SAS ilkesi size ayrıntılı kapsam sağlarken, bu kapsam tüketici düzeyinde değil yalnızca varlık düzeyinde tanımlanır. Bu, ad alanı düzeyinde veya olay hub'ı örneği veya konu düzeyinde tanımlanan ayrıcalıkların söz konusu varlığın tüketici gruplarına uygulanacağı anlamına gelir.

Yerel/SAS Anahtarı kimlik doğrulamasını devre dışı bırakma

Belirli kurumsal güvenlik gereksinimleri için yerel/SAS anahtarı kimlik doğrulamasını tamamen devre dışı bırakmak ve Azure Event Hubs'a bağlanmanın önerilen yolu olan Microsoft Entra ID tabanlı kimlik doğrulamasına güvenmek istiyorsunuz. Azure portalını veya Azure Resource Manager şablonunu kullanarak Event Hubs ad alanı düzeyinde yerel/SAS anahtarı kimlik doğrulamasını devre dışı bırakabilirsiniz.

Portal aracılığıyla Yerel/SAS Anahtarı kimlik doğrulamasını devre dışı bırakma

Azure portalını kullanarak belirli bir Event Hubs ad alanı için yerel/SAS anahtarı kimlik doğrulamasını devre dışı bırakabilirsiniz.

Aşağıdaki görüntüde gösterildiği gibi, ad alanına genel bakış bölümünde Yerel Kimlik Doğrulaması'nı seçin.

Yerel kimlik doğrulamasını devre dışı bırakmak için ad alanına genel bakış

Ardından Devre Dışı seçeneğini belirleyin ve aşağıdaki görüntüde gösterildiği gibi Tamam'ı seçin. Yerel kimlik doğrulamayı devre dışı bırakma

Şablon kullanarak Yerel/SAS Anahtarı kimlik doğrulamasını devre dışı bırakma

Aşağıdaki Azure Resource Manager şablonunda (ARM Şablonu) gösterildiği gibi özelliğini true olarak ayarlayarak disableLocalAuth belirli bir Event Hubs ad alanı için yerel kimlik doğrulamasını devre dışı bırakabilirsiniz.

"resources":[
      {
         "apiVersion":"[variables('ehVersion')]",
         "name":"[parameters('eventHubNamespaceName')]",
         "type":"Microsoft.EventHub/Namespaces",
         "location":"[variables('location')]",
         "sku":{
            "name":"Standard",
            "tier":"Standard"
         },
         "resources": [
    {
      "apiVersion": "2017-04-01",
      "name": "[parameters('eventHubNamespaceName')]",
      "type": "Microsoft.EventHub/Namespaces",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard"
      },
      "properties": {
        "isAutoInflateEnabled": "true",
        "maximumThroughputUnits": "7", 
        "disableLocalAuth": false
      },
      "resources": [
        {
          "apiVersion": "2017-04-01",
          "name": "[parameters('eventHubName')]",
          "type": "EventHubs",
          "dependsOn": [
            "[concat('Microsoft.EventHub/namespaces/', parameters('eventHubNamespaceName'))]"
          ],
          "properties": {
            "messageRetentionInDays": "[parameters('messageRetentionInDays')]",
            "partitionCount": "[parameters('partitionCount')]"
          }

        }
      ]
    }
  ]

Örnekler

Sonraki adımlar

Aşağıdaki makalelere bakın:

Aşağıdaki ilgili makalelere bakın: