Autentisera åtkomst till Event Hubs resurser med hjälp av signaturer för delad åtkomst (SAS)
Signatur för delad åtkomst (SAS) ger dig detaljerad kontroll över vilken typ av åtkomst du beviljar till klienterna som har signaturen för delad åtkomst. Här är några av de kontroller som du kan ange i en SAS:
- Intervallet då SAS är giltigt, inklusive starttid och förfallotid.
- De behörigheter som beviljas av SAS. En SAS för ett namnområde Event Hubs kanske ge lyssnande behörighet, men inte behörigheten skicka.
- Endast klienter som har giltiga autentiseringsuppgifter kan skicka data till en händelsehubb.
- En klient kan inte personifiera en annan klient.
- En obehörig klient kan blockeras från att skicka data till en händelsehubb.
Den här artikeln beskriver hur du autentiserar åtkomsten Event Hubs resurser med hjälp av SAS. Mer information om hur du auktoriserar åtkomst Event Hubs resurser med hjälp av SAS finns i den här artikeln.
Anteckning
Microsoft rekommenderar att du använder Azure AD-autentiseringsuppgifter när det är möjligt som bästa säkerhetspraxis, i stället för att använda signaturer för delad åtkomst, som är enklare att komprometteras. Du kan fortsätta att använda signaturer för delad åtkomst (SAS) för att bevilja mer information om dina Event Hubs-resurser, men Azure AD erbjuder liknande funktioner utan att behöva hantera SAS-token eller bekymra dig om att återkalla en komprometterad SAS.
Mer information om Azure AD-integrering i Azure Event Hubs finns i Auktorisera åtkomst till Event Hubs med Azure AD.
Konfigurera för SAS-autentisering
Du kan konfigurera auktoriseringsregeln för delad åtkomst i EventHubs på en Event Hubs namnområde eller en entitet (händelsehubbinstans eller Kafka-ämne i en händelsehubb). Det finns för närvarande inte stöd för att konfigurera en auktoriseringsregel för delad åtkomst för en konsumentgrupp, men du kan använda regler som konfigurerats på ett namnområde eller entitet för att skydda åtkomsten till konsumentgruppen.
Följande bild visar hur auktoriseringsreglerna gäller för exempelentiteter.

I det här exemplet har Event Hubs namnområdet (ExampleNamespace) två entiteter: eh1 och topic1. Auktoriseringsreglerna definieras både på entitetsnivå och på namnområdesnivå.
Auktoriseringsreglerna manageRuleNS, sendRuleNS och listenRuleNS gäller för både händelsehubbinstansen eh1 och ämnet t1. Auktoriseringsreglerna listenRule-eh och sendRule-eh gäller endast för event hub-instansen eh1 och sendRuleT-auktoriseringsregeln gäller endast för topic topic1.
När du använder sendRuleNS-auktoriseringsregeln kan klientprogram skicka till både eh1 och topic1. När sendRuleT-auktoriseringsregeln används, framtvingar den detaljerad åtkomst till endast topic1 och klientprogram som använder den här regeln för åtkomst kan nu inte skicka till eh1, utan endast till topic1.
Generera en token för signatur för delad åtkomst
Alla klienter som har åtkomst till namnet på en auktoriseringsregel och en av dess signeringsnycklar kan generera en SAS-token. Token genereras genom att skapa en sträng i följande format:
se– Token upphör att gälla direkt. Heltal återspeglar sekunder sedan epoken 00:00:00 UTC den 1 januari 1970 (UNIX epok) när token upphör att gällaskn– Namnet på auktoriseringsregeln, det vill säga SAS-nyckelnamnet.sr– URI för resursen som används.sig– Signatur.
Signatursträngen är sha-256-hashen som beräknas över resurs-URI:n (omfång enligt beskrivningen i föregående avsnitt) och strängrepresentationen av tokenutfallonde instant, avgränsad med CRLF.
Hash-beräkningen liknar följande pseudokod och returnerar ett hash-värde på 256 bitar/32 byte.
SHA-256('https://<yournamespace>.servicebus.windows.net/'+'\n'+ 1438205742)
Token innehåller icke-hashvärdena så att mottagaren kan kompilera om hashen med samma parametrar, vilket verifierar att utfärdaren har en giltig signeringsnyckel.
Resurs-URI är den fullständiga URI:en Service Bus resurs som åtkomsten begärts till. Till http://<namespace>.servicebus.windows.net/<entityPath> exempel, sb://<namespace>.servicebus.windows.net/<entityPath> eller det vill säga http://contoso.servicebus.windows.net/eh1 .
URI:en måste vara procentkodad.
Auktoriseringsregeln för delad åtkomst som används för signering måste konfigureras på den entitet som anges av denna URI, eller av någon av dess hierarkiska föräldrar. Till exempel http://contoso.servicebus.windows.net/eh1 eller i föregående http://contoso.servicebus.windows.net exempel.
En SAS-token är giltig för alla resurser med prefixet <resourceURI> som används i signature-strängen.
Anteckning
Du genererar en åtkomsttoken för Event Hubs med hjälp av en princip för delad åtkomst. Mer information finns i Auktoriseringsprincip för delad åtkomst.
Generera en signatur (token) från en princip
Följande avsnitt visar hur du genererar en SAS-token med principer för signatur för delad åtkomst,
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 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;
}
Autentisera Event Hubs utgivare med SAS
En händelseutgivare definierar en virtuell slutpunkt för en händelsehubb. Utgivaren kan bara användas för att skicka meddelanden till en händelsehubb och inte ta emot meddelanden.
En händelsehubb använder vanligtvis en utgivare per klient. Alla meddelanden som skickas till någon av utgivaren av en händelsehubb finns i en i händelsehubben. Utgivare möjliggör mer information om åtkomstkontroll.
Varje Event Hubs tilldelas en unik token som laddas upp till klienten. Token skapas så att varje unik token ger åtkomst till olika unika utgivare. En klient som innehåller en token kan bara skicka till en utgivare och ingen annan utgivare. Om flera klienter delar samma token delar var och en av dem utgivaren.
Alla token tilldelas med SAS-nycklar. Normalt signeras alla token med samma nyckel. Klienterna är inte medvetna om nyckeln, vilket förhindrar klienter från att tillverkningstoken. Klienterna använder samma token tills de upphör att gälla.
Om du till exempel vill definiera auktoriseringsregler begränsade till att endast skicka/publicera till Event Hubs måste du definiera en regel för att skicka auktorisering. Detta kan göras på namnområdesnivå eller ge ett mer detaljerad omfång till en viss entitet (event hubs-instans eller ett ämne). En klient eller ett program som har en sådan detaljerad åtkomst anropas, Event Hubs utgivare. Det gör du på följande sätt:
Skapa en SAS-nyckel för den entitet som du vill publicera för att tilldela omfånget för att skicka på den. Mer information finns i Auktoriseringsprinciper för delad åtkomst.
Generera en SAS-token med en förfallotid för en specifik utgivare med hjälp av nyckeln som genererades i steg 1.
var sasToken = SharedAccessSignatureTokenProvider.GetPublisherSharedAccessSignature( new Uri("Service-Bus-URI"), "eventub-name", "publisher-name", "sas-key-name", "sas-key", TimeSpan.FromMinutes(30));Ange token till utgivarklienten, som bara kan skicka till entiteten och utgivaren som token ger åtkomst till.
När token upphör att gälla förlorar klienten sin åtkomst till att skicka/publicera till entiteten.
Anteckning
Även om det inte rekommenderas är det möjligt att förse enheter med token som beviljar åtkomst till en händelsehubb eller ett namnområde. Alla enheter som innehåller denna token kan skicka meddelanden direkt till den händelsehubben. Dessutom kan enheten inte blockeras från att skicka till den händelsehubben.
Vi rekommenderar alltid att du ger specifika och detaljerade omfång.
Viktigt
När token har skapats etableras varje klient med en egen unik token.
När klienten skickar data till en händelsehubb taggar den sin begäran med token. För att förhindra att en angripare avlyssnar och stjäl token måste kommunikationen mellan klienten och händelsehubben ske via en krypterad kanal.
Om en token blir stulen av en angripare kan angriparen personifiera klienten vars token har blivit stulen. Om en utgivare blockeras blir klienten oanvändbar tills den tar emot en ny token som använder en annan utgivare.
Autentisera Event Hubs med SAS
För att autentisera serverprogram som använder från data som genererats av Event Hubs-producenter kräver Event Hubs-tokenautentisering att dess klienter antingen har hanteringsrättigheterna eller de lyssna-behörigheter som tilldelats till dess Event Hubs-namnområde, händelsehubbinstans eller ämne. Data förbrukas från Event Hubs med konsumentgrupper. Sas-principen ger dig detaljerad omfattning, men det här omfånget definieras endast på entitetsnivå och inte på konsumentnivå. Det innebär att de behörigheter som definierats på namnområdesnivå, händelsehubbinstansen eller ämnesnivån tillämpas på konsumentgrupperna för den entiteten.
Inaktivera autentisering med lokal nyckel/SAS-nyckel
För vissa säkerhetskrav för organisationen kan du behöva inaktivera autentisering med lokal nyckel eller SAS-nyckel helt och förlita dig på Azure Active Directory-baserad autentisering (Azure AD), vilket är det rekommenderade sättet att ansluta till Azure Event Hubs. Du kan inaktivera autentisering med lokal nyckel/SAS Event Hubs på namnområdesnivå med hjälp Azure Portal eller Azure Resource Manager mall.
Inaktivera autentisering med lokal nyckel/SAS-nyckel via portalen
Du kan inaktivera autentisering med lokal nyckel/SAS-nyckel för Event Hubs namnområde med hjälp av Azure Portal.
Som du ser i följande bild klickar du på lokal autentisering i översiktsavsnittet för namnområdet.

Välj sedan alternativet Inaktiverad och klicka på Ok enligt nedan.

Inaktivera autentisering med lokal nyckel/SAS-nyckel med hjälp av en mall
Du kan inaktivera lokal autentisering för ett Event Hubs namnområde genom att ange egenskapen till enligt följande disableLocalAuth true Azure Resource Manager mall (ARM-mall).
"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')]"
}
}
]
}
]
Nästa steg
Se följande artiklar:
- Auktorisera med hjälp av SAS
- Auktorisera med hjälp av rollbaserad åtkomstkontroll i Azure (Azure RBAC)
- Läs mer om Event Hubs
Se följande relaterade artiklar:
- Autentisera begäranden om att Azure Event Hubs från ett program med hjälp av Azure Active Directory
- Autentisera en hanterad identitet med Azure Active Directory åtkomst till Event Hubs resurser
- Auktorisera åtkomst Event Hubs resurser med Azure Active Directory
- Auktorisera åtkomst Event Hubs resurser med signaturer för delad åtkomst