Megosztás a következőn keresztül:


Az Event Hubs-erőforrásokhoz való hozzáférés hitelesítése közös hozzáférésű jogosultságkódokkal (SAS)

A közös hozzáférésű jogosultságkód (SAS) részletes vezérlést biztosít az ügyfeleknek nyújtott hozzáférés típusával kapcsolatban. Az SAS-ben az alábbi vezérlők állíthatók be:

  • Az az intervallum, amely alatt az SAS érvényes, amely magában foglalja a kezdési és a lejárati időt.
  • Az SAS által megadott engedélyek. Egy Event Hubs-névtér sasa például figyelő engedélyt adhat, a küldési engedélyt azonban nem.
  • Csak az érvényes hitelesítő adatokat tartalmazó ügyfelek küldhetnek adatokat egy eseményközpontba.
  • Az ügyfél nem tud megszemélyesíteni egy másik ügyfelet.
  • Egy gazember ügyfél blokkolhatja az adatok eseményközpontba való küldését.

Ez a cikk az Event Hubs-erőforrások SAS használatával történő hozzáférésének hitelesítését ismerteti. Ebből a cikkből megtudhatja, hogyan engedélyezhet hozzáférést az Event Hubs-erőforrásokhoz sas használatával.

Feljegyzés

Javasoljuk, hogy ha lehetséges, használja a Microsoft Entra hitelesítő adatait biztonsági ajánlott eljárásként a közös hozzáférésű jogosultságkódok használata helyett, amelyek könnyebben sérülhetnek. Bár továbbra is használhat közös hozzáférésű jogosultságkódokat (SAS) az Event Hubs-erőforrásokhoz való részletes hozzáférés biztosításához, a Microsoft Entra ID hasonló képességeket kínál anélkül, hogy kezelnie kellene az SAS-jogkivonatokat, vagy aggódnia kellene a feltört SAS visszavonása miatt.

További információ a Microsoft Entra Azure Event Hubsban való integrációjáról: Az Event Hubshoz való hozzáférés engedélyezése a Microsoft Entra ID használatával.

SAS-hitelesítés konfigurálása

SAS-szabályt konfigurálhat egy Event Hubs-névtéren vagy egy entitáson (eseményközponton vagy Kafka-témakörön). Az SAS-szabály fogyasztói csoportokon való konfigurálása jelenleg nem támogatott, de a névtéren vagy entitáson konfigurált szabályokkal biztonságossá teheti a fogyasztói csoporthoz való hozzáférést. Az alábbi kép bemutatja, hogyan vonatkoznak az engedélyezési szabályok a mintaentitásokra.

Az eseményközpontokat figyelő, küldési és kezelési szabályokkal rendelkező eseményközpontokat bemutató ábra.

Ebben a példában a minta Event Hubs-névtér (ExampleNamespace) két entitással rendelkezik: eh1 és Kafka topic1. Az engedélyezési szabályok az entitás szintjén és a névtér szintjén is definiálva vannak.

A ManageRuleNS, a sendRuleNS és a listenRuleNS engedélyezési szabályok mind az eh1, mind a témakör1 esetében érvényesek. A listenRule-eh és a sendRule-eh engedélyezési szabályok csak az eh1-re vonatkoznak, a sendRuleT engedélyezési szabály pedig csak az 1. témakörre vonatkozik.

A sendRuleNS engedélyezési szabály használatakor az ügyfélalkalmazások az eh1 és a topic1 címre is küldhetnek. A SendRuleT engedélyezési szabály használata esetén csak a témakör1-hez való részletes hozzáférést kényszeríti ki, ezért a szabályt használó ügyfélalkalmazások mostantól nem küldhetnek az eh1-be, csak a témakör1-be.

Közös hozzáférésű jogosultságkód jogkivonat létrehozása

Bármely ügyfél, amely hozzáféréssel rendelkezik egy engedélyezési szabály nevének nevéhez és annak egyik aláíró kulcsához, létrehozhat egy SAS-jogkivonatot. A jogkivonat egy sztring a következő formátumban történő létrehozásához jön létre:

  • se – A jogkivonat lejárati ideje azonnali. Az 1970. január 1-jén (UNIX)00:00:00 (UTC) óta eltelt másodperceket tükröző egész szám, amikor a jogkivonat lejár
  • skn – Az engedélyezési szabály neve, amely az SAS-kulcs neve.
  • sr – A hozzáférés alatt álló erőforrás URI-ja.
  • sig –Aláírás.

Az aláírási sztring az erőforrás URI-ján (az előző szakaszban ismertetett hatókörön) kiszámított SHA-256 kivonat, valamint a jogkivonat lejárati pillanatának sztring-ábrázolása, amelyet kocsivissza- és sorbetöltés (CRLF) választ el egymástól. A kivonatszámítás a következő pszeudokódhoz hasonlóan néz ki, és egy 256 bites/32 bájtos kivonatértéket ad vissza.

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

A jogkivonat tartalmazza a nem kivonatolt értékeket, hogy a címzett ugyanazokkal a paraméterekkel újrafordítsa a kivonatot, és ellenőrizze, hogy a kiállító rendelkezik-e érvényes aláírási kulccsal.

Az erőforrás URI-ja annak a Service Bus-erőforrásnak a teljes URI-ja, amelyhez a hozzáférés igényelve van. Például, http://<namespace>.servicebus.windows.net/<entityPath> vagy sb://<namespace>.servicebus.windows.net/<entityPath> ez az. http://contoso.servicebus.windows.net/eh1

Az URI-nak százalékkódoltnak kell lennie.

Az aláíráshoz használt SAS-szabályt az URI által megadott entitáson vagy annak egyik hierarchikus szülőjénél kell konfigurálni. Például, http://contoso.servicebus.windows.net/eh1 vagy http://contoso.servicebus.windows.net az előző példában.

Az SAS-jogkivonat az aláírási sztringben <resourceURI> használt összes erőforrásra érvényes.

Feljegyzés

Hozzáférési jogkivonatot hoz létre az Event Hubs számára megosztott hozzáférési szabályzat használatával. További információ: Megosztott hozzáférés engedélyezési szabályzata.

Aláírás(jogkivonat) létrehozása szabályzatból

Az alábbi szakasz azt mutatja be, hogy sas-jogkivonatot hoz létre közös hozzáférésű jogosultságkód-szabályzatokkal,

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; 
}

Ha egy szabályzatnevet és egy kulcsértéket szeretne használni egy eseményközponthoz való csatlakozáshoz, használja a EventHubProducerClient paramétert használó konstruktort AzureNamedKeyCredential .

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

Ehhez hozzá kell adnia egy hivatkozást.AzureNamedKeyCredential

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

A kóddal létrehozott SAS-jogkivonat használatához használja a EventHubProducerClient paramétert használó konstruktort AzureSASCredential .

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

Ehhez hozzá kell adnia egy hivatkozást.AzureSASCredential

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

JÁVA

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

Erősen megüt

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"
}

Event Hubs-közzétevők hitelesítése SAS-vel

Az esemény közzétevője egy eseményközpont virtuális végpontját határozza meg. A közzétevő csak arra használható, hogy üzeneteket küldjön egy eseményközpontba, és ne fogadjon üzeneteket.

Az eseményközpontok általában ügyfélenként egy közzétevőt használnak. Az eseményközpont közzétevőinek küldött összes üzenet az eseményközponton belül lesz leküldve. A közzétevők lehetővé teszik a részletes hozzáférés-vezérlést.

Minden Event Hubs-ügyfélhez egyedi jogkivonat van hozzárendelve, amelyet a rendszer feltölt az ügyfélre. A jogkivonatok úgy jönnek létre, hogy minden egyedi jogkivonat hozzáférést biztosít a különböző egyedi közzétevőkhöz. A jogkivonatot tartalmazó ügyfél csak egy közzétevőnek küldhet, más közzétevőnek pedig nem. Ha több ügyfél is ugyanazt a jogkivonatot használja, mindegyik megosztja a közzétevőt.

Minden jogkivonat SAS-kulcsokkal van hozzárendelve. Általában minden jogkivonat ugyanazzal a kulccsal van aláírva. Az ügyfelek nem ismerik a kulcsot, ami megakadályozza, hogy az ügyfelek tokeneket gyártanak. Az ügyfelek ugyanazokon a jogkivonatokon működnek, amíg el nem járnak.

Ha például csak az Event Hubsban történő küldésre/közzétételre vonatkozó engedélyezési szabályokat szeretne meghatározni, meg kell határoznia egy küldési engedélyezési szabályt. Elvégezhető névtérszinten, vagy részletesebb hatókört adhat egy adott entitásnak (eseményközpont-példány vagy témakör). Az ilyen részletes hozzáféréssel rendelkező ügyfél vagy alkalmazás neve Event Hubs-közzétevő. Ehhez kövesse az alábbi lépéseket:

  1. Hozzon létre egy SAS-kulcsot azon az entitáson, amelyet közzé szeretne tenni a küldési hatókör hozzárendeléséhez. További információ: Megosztott hozzáférés-engedélyezési szabályzatok.

  2. Hozzon létre egy SAS-jogkivonatot egy adott közzétevő lejárati idejével az 1. lépésben létrehozott kulccsal. A mintakódért lásd : Aláírás(jogkivonat) létrehozása szabályzatból.

  3. Adja meg a jogkivonatot a közzétevő ügyfélnek, amely csak az entitásnak küldhető el, és az a közzétevő, amelyhez a jogkivonat hozzáférést biztosít.

    A jogkivonat lejárata után az ügyfél elveszíti a hozzáférést az entitásnak való küldéshez/közzétételhez.

Feljegyzés

Bár nem javasoljuk, az eszközök olyan jogkivonatokkal is elláthatók, amelyek hozzáférést biztosítanak egy eseményközponthoz vagy egy névtérhez. A jogkivonatot tartalmazó eszközök közvetlenül az adott eseményközpontba küldhetnek üzeneteket. Ezenkívül az eszköz nem tiltható le az adott eseményközpontba való küldésben.

Javasoljuk, hogy adjon meg konkrét és részletes hatóköröket.

Fontos

A jogkivonatok létrehozása után minden ügyfél saját egyedi jogkivonattal lesz kiépítve.

Amikor az ügyfél adatokat küld egy eseményközpontba, a jogkivonattal címkézi a kérését. Ha meg szeretné akadályozni, hogy a támadó lehallgatja és ellopja a jogkivonatot, az ügyfél és az eseményközpont közötti kommunikációnak titkosított csatornán keresztül kell történnie.

Ha egy támadó ellop egy jogkivonatot, a támadó megszemélyesítheti azt az ügyfelet, akinek a jogkivonatát ellopták. Egy közzétevő letiltásával az ügyfél használhatatlanná válik, amíg nem kap egy másik közzétevőt használó új jogkivonatot.

Event Hubs-felhasználók hitelesítése SAS-vel

Az Event Hubs-gyártók által létrehozott adatokból felhasznált háttéralkalmazások hitelesítéséhez az Event Hubs-jogkivonat-hitelesítés megköveteli, hogy az ügyfelei rendelkezzenek az Event Hubs-névtérhez vagy eseményközpont-példányhoz vagy témakörhöz rendelt felügyeleti jogosultságokkal vagy figyelési jogosultságokkal. Az adatokat az Event Hubs fogyasztói csoportok használatával használja fel. Bár az SAS-szabályzat részletes hatókört biztosít, ez a hatókör csak az entitás szintjén van definiálva, a fogyasztói szinten nem. Ez azt jelenti, hogy a névtér szintjén vagy az eseményközpont vagy a témakör szintjén definiált jogosultságok az entitás fogyasztói csoportjaira lesznek alkalmazva.

Helyi/SAS-kulcs hitelesítésének letiltása

Bizonyos szervezeti biztonsági követelmények esetén teljes mértékben le szeretné tiltani a helyi/SAS-kulcsos hitelesítést, és a Microsoft Entra ID-alapú hitelesítésre kell támaszkodnia, amely az Azure Event Hubshoz való csatlakozás ajánlott módja. Az Event Hubs-névtér szintjén letilthatja a helyi/SAS-kulcsos hitelesítést az Azure Portal vagy az Azure Resource Manager-sablon használatával.

Helyi/SAS-kulcs hitelesítésének letiltása a portálon keresztül

Az Azure Portal használatával letilthatja egy adott Event Hubs-névtér helyi/SAS-kulcsos hitelesítését.

  1. Lépjen az Event Hubs-névtérre az Azure Portalon.

  2. Az Áttekintés lapon válassza az Engedélyezve a helyi hitelesítéshez lehetőséget az alábbi képen látható módon.

    Képernyőkép a kiválasztott helyi hitelesítésről.

  3. A Helyi hitelesítés előugró ablakban válassza a Letiltva, majd az OK gombot.

    Képernyőkép a Helyi hitelesítés előugró ablakról, amelyen a Letiltva lehetőség van kiválasztva.

Helyi/SAS-kulcs hitelesítésének letiltása sablon használatával

Egy adott Event Hubs-névtér helyi hitelesítését úgy tilthatja le, hogy a tulajdonságot az alábbi Azure Resource Manager-sablonban (ARM-sablonban) látható módon true állítja bedisableLocalAuth.

"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": true
      },
      "resources": [
        {
          "apiVersion": "2017-04-01",
          "name": "[parameters('eventHubName')]",
          "type": "EventHubs",
          "dependsOn": [
            "[concat('Microsoft.EventHub/namespaces/', parameters('eventHubNamespaceName'))]"
          ],
          "properties": {
            "messageRetentionInDays": "[parameters('messageRetentionInDays')]",
            "partitionCount": "[parameters('partitionCount')]"
          }

        }
      ]
    }
  ]

Példák

  • Ebben a GitHub-helyen található .NET-minta 6. részében megtudhatja, hogyan tehet közzé eseményeket egy eseményközpontban megosztott hozzáférési hitelesítő adatokkal vagy az alapértelmezett Azure hitelesítő adatokkal.
  • Ebben a GitHub-helyen az 5. .NET-minta segítségével megtudhatja, hogyan használhatja fel vagy dolgozhatja fel az eseményeket megosztott hozzáférési hitelesítő adatokkal vagy az alapértelmezett Azure hitelesítő adatokkal.

Következő lépések

Tekintse meg az alábbi cikkeket:

Lásd a következő kapcsolódó cikkeket: