Toegang tot uw Event Hubs verifiëren met behulp van Shared Access Signatures (SAS)

Shared Access Signature (SAS) geeft u gedetailleerde controle over het type toegang dat u verleent aan de clients die de Shared Access Signature hebben. Hier ziet u enkele van de besturingselementen die u kunt instellen in een SAS:

  • Het interval waarover de SAS geldig is, inclusief de begintijd en verlooptijd.
  • De machtigingen die worden verleend door de SAS. Een SAS voor een Event Hubs naamruimte kan bijvoorbeeld de luistermachtiging verlenen, maar niet de verzendmachtiging.
  • Alleen clients die geldige referenties presenteren, kunnen gegevens verzenden naar een Event Hub.
  • Een client kan geen andere client imiteren.
  • Een rogue client kan worden geblokkeerd voor het verzenden van gegevens naar een Event Hub.

Dit artikel gaat over het authenticeren van de toegang tot Event Hubs resources met behulp van SAS. Zie dit artikel voor meer informatie over het autoriseren Event Hubs toegang tot uw resources met behulp vanSAS.

Notitie

Microsoft raadt u aan om waar mogelijk Azure AD-referenties te gebruiken als beveiligings-best practice, in plaats van de handtekeningen voor gedeelde toegang te gebruiken, die gemakkelijker kunnen worden aangetast. Hoewel u shared access signatures (SAS) kunt blijven gebruiken om fijnkeurige toegang te verlenen tot uw Event Hubs-resources, biedt Azure AD vergelijkbare mogelijkheden zonder dat u SAS-tokens hoeft te beheren of u zich zorgen hoeft te maken over het inroepen van een aangetaste SAS.

Zie Toegang tot azure-Azure Event Hubs met Azure AD Event Hubs meer informatie over Azure AD-integratiein azure.

Configureren voor SAS-verificatie

U kunt de eventhubs-autorisatieregel voor gedeelde toegang configureren voor een Event Hubs-naamruimte of een entiteit (event hub-exemplaar of Kafka-onderwerp in een Event Hub). Het configureren van een autorisatieregel voor gedeelde toegang voor een consumentengroep wordt momenteel niet ondersteund, maar u kunt regels gebruiken die zijn geconfigureerd voor een naamruimte of entiteit om de toegang tot de consumentengroep te beveiligen.

In de volgende afbeelding ziet u hoe de autorisatieregels van toepassing zijn op voorbeeldentiteiten.

Autorisatieregel configureren

In dit voorbeeld heeft de Event Hubs -naamruimte (ExampleNamespace) twee entiteiten: eh1 en topic1. De autorisatieregels worden zowel op entiteitsniveau als op naamruimteniveau gedefinieerd.

De autorisatieregels manageRuleNS, sendRuleNS en listenRuleNS zijn van toepassing op zowel event hub instance eh1 als topic t1. De autorisatieregels listenRule-eh en sendRule-eh zijn alleen van toepassing op event hub instance eh1 en de sendRuleT-autorisatieregel is alleen van toepassing op onderwerp topic1.

Wanneer u de sendRuleNS-autorisatieregel gebruikt, kunnen clienttoepassingen verzenden naar zowel eh1 als topic1. Wanneer de sendRuleT-autorisatieregel wordt gebruikt, wordt gedetailleerde toegang tot topic1 afgedwongen. Clienttoepassingen die deze regel gebruiken voor toegang kunnen nu niet verzenden naar eh1, maar alleen tot topic1.

Een Shared Access Signature token genereren

Elke client die toegang heeft tot de naam van een autorisatieregel en een van de ondertekeningssleutels, kan een SAS-token genereren. Het token wordt gegenereerd door een tekenreeks in de volgende indeling te maken:

  • se – Token verloopt direct. Geheel getal dat seconden na epoche 00:00:00 UTC op 1 januari 1970 (UNIX epoche) weerspiegelt wanneer het token verloopt
  • skn – Naam van de autorisatieregel, dat wil zeggen de naam van de SAS-sleutel.
  • sr – URI van de resource die wordt gebruikt.
  • sig – Handtekening.

De handtekeningreeks is de SHA-256-hash die wordt berekend via de resource-URI (bereik zoals beschreven in de vorige sectie) en de tekenreeksweergave van het token expiry instant, gescheiden door CRLF.

De hash-berekening lijkt op de volgende pseudocode en retourneert een hashwaarde van 256-bits/32 byte.

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

Het token bevat de niet-gehashte waarden, zodat de ontvanger de hash opnieuw kancompute met dezelfde parameters, om te controleren of de vergever in bezit is van een geldige ondertekeningssleutel.

De resource-URI is de volledige URI van de Service Bus resource waarvoor toegang wordt geclaimd. Of http://<namespace>.servicebus.windows.net/<entityPath> dat sb://<namespace>.servicebus.windows.net/<entityPath> wil zeggen, http://contoso.servicebus.windows.net/eh1 .

De URI moet in procenten zijn gecodeerd.

De regel voor autorisatie voor gedeelde toegang die wordt gebruikt voor ondertekening, moet worden geconfigureerd op de entiteit die is opgegeven door deze URI of door een van de hiërarchische boven- en boven- en achternaam. Bijvoorbeeld of http://contoso.servicebus.windows.net/eh1 http://contoso.servicebus.windows.net in het vorige voorbeeld.

Een SAS-token is geldig voor alle resources met het voorvoegsel <resourceURI> dat wordt gebruikt in de handtekeningreeks.

Notitie

U genereert een toegangs token voor Event Hubs met behulp van beleid voor gedeelde toegang. Zie Autorisatiebeleid voor gedeelde toegang voor meer informatie.

Een handtekening (token) genereren van een beleid

In de volgende sectie ziet u hoe u een SAS-token genereert met behulp van shared access signature-beleid,

Node.js

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 signatureUTF8 = utf8.encode(signature); 
    var hash = crypto.createHmac('sha256', saKey).update(signatureUTF8).digest('base64'); 
    return 'SharedAccessSignature sr=' + encoded + '&sig=' +  
        encodeURIComponent(hash) + '&se=' + ttl + '&skn=' + saName; 

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

Uitgevers Event Hubs met SAS

Een gebeurtenisuitgever definieert een virtueel eindpunt voor een Event Hub. De uitgever kan alleen worden gebruikt om berichten naar een Event Hub te verzenden en geen berichten te ontvangen.

Normaal gesproken maakt een Event Hub gebruik van één uitgever per client. Alle berichten die naar een van de uitgevers van een Event Hub worden verzonden, worden in die Event Hub in de enqueu bevraagd. Uitgevers maken fijnf mogelijk toegangsbeheer.

Aan Event Hubs client wordt een uniek token toegewezen, dat wordt geüpload naar de client. De tokens worden zo geproduceerd dat elk uniek token toegang verleent aan een andere unieke uitgever. Een client die een token bevat, kan slechts naar één uitgever verzenden en geen andere uitgever. Als meerdere clients hetzelfde token delen, delen ze allemaal de uitgever.

Alle tokens worden toegewezen met SAS-sleutels. Normaal gesproken worden alle tokens ondertekend met dezelfde sleutel. Clients zijn niet op de hoogte van de sleutel, waardoor clients geen productietokens kunnen maken. Clients werken op dezelfde tokens totdat ze verlopen.

Als u bijvoorbeeld autorisatieregels wilt definiëren die zijn beperkt tot alleen verzenden/publiceren naar Event Hubs, moet u een autorisatieregel voor verzenden definiëren. Dit kan worden gedaan op naamruimteniveau of een specifieke entiteit een gedetailleerder bereik geven (exemplaar van Event Hubs of een onderwerp). Een client of een toepassing met een dergelijke gedetailleerde toegang wordt aangeroepen, Event Hubs uitgever. Voer hiervoor de volgende stappen uit:

  1. Maak een SAS-sleutel voor de entiteit die u wilt publiceren om het verzendbereik toe te wijzen. Zie Autorisatiebeleid voor gedeelde toegang voor meer informatie.

  2. Genereer een SAS-token met een verlooptijd voor een specifieke uitgever met behulp van de sleutel die is gegenereerd in stap 1.

    var sasToken = SharedAccessSignatureTokenProvider.GetPublisherSharedAccessSignature(
                new Uri("Service-Bus-URI"),
                "eventub-name",
                "publisher-name",
                "sas-key-name",
                "sas-key",
                TimeSpan.FromMinutes(30));
    
  3. Geef het token op aan de uitgeverclient, die alleen kan verzenden naar de entiteit en de uitgever waaraan dat token toegang verleent.

    Zodra het token is verlopen, verliest de client de toegang tot verzenden/publiceren naar de entiteit.

Notitie

Hoewel dit niet wordt aanbevolen, is het mogelijk om apparaten te voorzien van tokens die toegang verlenen tot een Event Hub of een naamruimte. Elk apparaat dat dit token bevat, kan berichten rechtstreeks naar die Event Hub verzenden. Bovendien kan het apparaat niet worden geblokkeerd voor verzending naar die Event Hub.

Het wordt altijd aanbevolen om specifieke en gedetailleerde scopes te geven.

Belangrijk

Zodra de tokens zijn gemaakt, wordt elke client ingericht met een eigen unieke token.

Wanneer de client gegevens naar een Event Hub verzendt, wordt de aanvraag met het token gelabeld. Om te voorkomen dat een aanvaller het token meeluistert en steelt, moet de communicatie tussen de client en de Event Hub plaatsvinden via een versleuteld kanaal.

Als een token wordt gestolen door een aanvaller, kan de aanvaller de client imiteren waarvan het token is gestolen. Als u een uitgever blokkeert, wordt die client onbruikbaar totdat deze een nieuw token ontvangt dat gebruikmaakt van een andere uitgever.

Gebruikers Event Hubs met SAS

Voor het verifiëren van back-endtoepassingen die verbruiken van de gegevens die worden gegenereerd door Event Hubs-producenten, moeten de clients voor Event Hubs-tokenverificatie beschikken over de beheerrechten of de listen-bevoegdheden die zijn toegewezen aan de Event Hubs-naamruimte of het event hub-exemplaar of -onderwerp. Gegevens worden uit een Event Hubs met behulp van consumentengroepen. Hoewel sas-beleid een gedetailleerd bereik biedt, wordt dit bereik alleen gedefinieerd op entiteitsniveau en niet op consumentenniveau. Dit betekent dat de bevoegdheden die zijn gedefinieerd op het niveau van de naamruimte of het event hub-exemplaar of onderwerpniveau worden toegepast op de consumentengroepen van die entiteit.

Verificatie met lokale/SAS-sleutel uitschakelen

Voor bepaalde beveiligingsvereisten van organisaties moet u mogelijk de verificatie van lokale/SAS-sleutels volledig uitschakelen en afhankelijk zijn van de verificatie op basis van Azure Active Directory (Azure AD). Dit is de aanbevolen manier om verbinding te maken met Azure Event Hubs. U kunt verificatie van lokale/SAS-sleutels op Event Hubs niveau van de naamruimte uitschakelen met behulp Azure Portal of Azure Resource Manager sjabloon.

Verificatie met lokale/SAS-sleutel uitschakelen via de portal

U kunt lokale/SAS-sleutelverificatie voor een bepaalde Event Hubs uitschakelen met behulp van de Azure Portal.

Zoals u in de volgende afbeelding kunt zien, klikt u in de sectie overzicht van de naamruimte op Lokale verificatie.

Overzicht van naamruimte voor het uitschakelen van lokale auth

Selecteer vervolgens de optie Uitgeschakeld en klik op OK, zoals hieronder wordt weergegeven. Lokale auth uitschakelen

Verificatie met lokale/SAS-sleutel uitschakelen met behulp van een sjabloon

U kunt lokale verificatie voor een bepaalde Event Hubs uitschakelen door de eigenschap in te stellen op , zoals wordt weergegeven disableLocalAuth in de Azure Resource Manager sjabloon true (ARM-sjabloon).

"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')]"
          }

        }
      ]
    }
  ]

Volgende stappen

Zie de volgende artikelen:

Zie de volgende verwante artikelen: