Paylaşılan erişim imzalarını (SAS) Event Hubs kaynaklara erişimin kimliğini doğrulama
Paylaşılan erişim imzası (SAS), paylaşılan erişim imzasını olan istemcilere vermek istediğiniz erişim türü üzerinde ayrıntılı denetim sağlar. SAS'de ayarlayabilirsiniz denetimlerden bazıları aşağıdaki gibidir:
- Başlangıç saati ve sona erme zamanı da dahil olmak üzere SAS'nin geçerli olduğu aralık.
- SAS tarafından verilen izinler. Örneğin, bir Event Hubs ad alanı için SAS dinleme iznini verir, ancak gönderme iznini veramaz.
- Yalnızca geçerli kimlik bilgilerine sahip istemciler bir olay hub' a veri gönderebilir.
- bir istemci başka bir istemcinin kimliğine bürünemez.
- Kötü niyetli bir istemcinin bir olay hub' na veri göndermesi engellenmiş olabilir.
Bu makale, SAS kullanarak Event Hubs kimlik doğrulamayı kapsar. SAS kullanarak farklı kaynaklara erişim Event Hubs hakkında bilgi edinmek için bu makaleye bakın.
Not
Microsoft, güvenliğin daha kolay tehlikeye atılması için paylaşılan erişim imzalarını kullanmak yerine mümkün olduğunca en iyi güvenlik uygulaması olarak Azure AD kimlik bilgilerini kullanmalarını önermektedir. Event Hubs kaynaklarınıza daha fazla erişim vermek için paylaşılan erişim imzalarını (SAS) kullanmaya devam ederken Azure AD, SAS belirteçlerini yönetmeye veya güvenliği tehlikeye atılmış sas'ı iptal etme konusunda endişelenmeye gerek kalmadan benzer özellikler sunar.
Azure AD tümleştirmesi hakkında daha fazla bilgi Azure Event Hubs bkz. Azure AD kullanarak Event Hubs erişimi yetkilendirme.
SAS kimlik doğrulaması için yapılandırma
EventHubs paylaşılan erişim yetkilendirme kuralını bir Event Hubs veya bir varlığa (olay hub'larında olay hub'ı örneği veya Kafka Konusu) yapılandırabilirsiniz. Bir tüketici grubunda paylaşılan erişim yetkilendirme kuralının yapılandırılması şu anda desteklenmiyor, ancak tüketici grubuna erişimin güvenliğini sağlamak için ad alanı veya varlık üzerinde yapılandırılmış kuralları kullanabilirsiniz.
Aşağıdaki görüntüde, yetkilendirme kurallarının örnek varlıklara nasıl uygulanarak uygulanaları gösterir.

Bu örnekte, örnek ad Event Hubs (ExampleNamespace) iki varlık içerir: eh1 ve topic1. Yetkilendirme kuralları hem varlık düzeyinde hem de ad alanı düzeyinde tanımlanır.
manageRuleNS, sendRuleNS ve listenRuleNS yetkilendirme kuralları hem olay hub'ı örneği eh1 hem de t1 konusu için geçerlidir. listenRule-eh ve sendRule-eh yetkilendirme kuralları yalnızca olay hub'ı örneği eh1 için geçerlidir ve sendRuleT yetkilendirme kuralı yalnızca konu1 konusu için geçerlidir.
sendRuleNS yetkilendirme kuralı kullanılırken, istemci uygulamaları hem eh1 hem de topic1'e gönderebilir. sendRuleT yetkilendirme kuralı kullanılırken, yalnızca topic1'e ayrıntılı erişim zorlar ve bu nedenle erişim için bu kuralı kullanan istemci uygulamaları artık eh1'e ancak yalnızca topic1'e gönderememektedir.
Paylaşılan Erişim İmzası belirteci oluşturma
Yetkilendirme kuralı adına ve imzalama anahtarlarından biri adına erişimi olan herhangi bir istemci bir SAS belirteci oluştur olabilir. Belirteç, aşağıdaki biçimde bir dize oluşturularak oluşturulur:
se– Belirteç süre sonu anında. Belirteci sona erdiğinde 1 Ocak 1970'te (UNIX dönemi) 00:00:00 UTC'den bu yana geçen saniyeleri yansıtan tamsayıskn– Yetkilendirme kuralının adı, yani SAS anahtarı adı.sr– Erişilen kaynağın URI'si.sig– İmza.
signature-string, kaynak URI'si (önceki bölümde açıklandığı gibi kapsam) üzerinden hesaplanan SHA-256 karması ve CRLF ile ayrılmış belirteç süre sonu anında dize gösterimidir.
Karma hesaplama aşağıdaki sahte koda benzer ve 256 bit/32 bit karma değeri döndürür.
SHA-256('https://<yournamespace>.servicebus.windows.net/'+'\n'+ 1438205742)
Belirteç, alıcının karmayı aynı parametrelerle yeniden tamamlayarak sertifikayı gönderenin geçerli bir imzalama anahtarına sahip olduğunu doğrulayarak karma olmayan değerleri içerir.
Kaynak URI'sı, erişimin talep Service Bus kaynağın tam URI'dir. Örneğin, http://<namespace>.servicebus.windows.net/<entityPath> veya sb://<namespace>.servicebus.windows.net/<entityPath> başka bir ifadeyle http://contoso.servicebus.windows.net/eh1 .
URI yüzde kodlanmış olması gerekir.
İmzalama için kullanılan paylaşılan erişim yetkilendirme kuralı, bu URI tarafından belirtilen varlığa veya hiyerarşik verilerinden biri tarafından yapılandırılacaktır. Örneğin, http://contoso.servicebus.windows.net/eh1 veya http://contoso.servicebus.windows.net önceki örnekte.
SAS belirteci, signature-string içinde kullanılan ön <resourceURI> ekli tüm kaynaklar için geçerlidir.
Not
Paylaşılan erişim ilkesi kullanarak Event Hubs belirteci oluşturulur. 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,
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;
}
SAS ile Event Hubs yayımcıların kimliklerini doğrulama
Olay yayımcısı, bir olay hub'ı için sanal uç nokta tanımlar. Yayımcı yalnızca bir olay hub' a ileti göndermek ve ileti almak için kullanılabilir.
Genellikle, bir olay hub'ı istemci başına bir yayımcıdan işe gelir. Bir olay hub'larının yayımcılarının herhangi biri için gönderilen tüm iletiler bu olay hub'ı içinde yer almaktadır. Yayımcılar, daha ince erişim denetimi sağlar.
Her Event Hubs istemciye, istemciye yüklenen benzersiz bir belirteç atanır. Belirteçler, her benzersiz belirteci farklı benzersiz yayımcıya erişim izni vermek için üretilmiştir. Belirteci tutan bir istemci yalnızca bir yayımcıya gönderebilir ve başka yayımcı göndermez. Birden çok istemci aynı belirteci paylaşıyorsa, her biri yayımcıyı paylaşır.
Tüm belirteçler SAS anahtarları ile atanır. Genellikle, tüm belirteçler aynı anahtarla imzalanmıştır. İstemciler anahtarın farkında değil ve bu da istemcilerin belirteç üretmesini önler. İstemciler süresi dolana kadar aynı belirteçler üzerinde çalışır.
Örneğin, kapsamı yalnızca belirli bir kaynakta gönderme/yayımlama olarak Event Hubs yetkilendirme kurallarını tanımlamak için bir gönderme yetkilendirme kuralı tanımlamanız gerekir. Bu, ad alanı düzeyinde yapılabilir veya belirli bir varlığa (event hubs örneği veya konu başlığı) daha ayrıntılı bir kapsam verebiliyor. Bu tür ayrıntılı erişim kapsamına sahip bir istemci veya uygulama, yayımcı olarak Event Hubs çağrılır. Bunu yapmak için aşağıdaki adımları izleyin:
Yayımlamak istediğiniz varlık üzerinde gönderme kapsamını atamak için bir SAS anahtarı oluşturun. Daha fazla bilgi için bkz. Paylaşılan erişim yetkilendirme ilkeleri.
-
- adımda oluşturulan anahtarı kullanarak belirli bir yayımcı için süre sonu süresine sahip bir SAS belirteci oluşturma.
var sasToken = SharedAccessSignatureTokenProvider.GetPublisherSharedAccessSignature( new Uri("Service-Bus-URI"), "eventub-name", "publisher-name", "sas-key-name", "sas-key", TimeSpan.FromMinutes(30)); Belirteci, yalnızca varlığa ve belirteci izin verilen yayımcıya gönderen yayımcı istemcisine sağlar.
Belirteci süresi dolsa da istemci, varlığa gönderme/yayımlama erişimini kaybeder.
Not
Önerilmez, ancak cihazları bir olay hub'ını veya ad alanına erişim izni olan belirteçlerle donatmak mümkündür. Bu belirteci tutan herhangi bir cihaz doğrudan bu olay hub'larına ileti gönderebilir. Ayrıca cihazın bu olay hub'ine gönderilmesi engellenmiş olamaz.
Belirli ve ayrıntılı kapsamlar her zaman önerilir.
Önemli
Belirteçler oluşturulduktan sonra her istemciye kendi benzersiz belirteci sağlandı.
İstemci bir olay hub'ını veri gönderdiğinde, isteğini belirteci ile etiketler. Bir saldırganın belirteci dinlemesini ve ç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ünebiliyor. Yayımcıyı engellenenler listesi, farklı bir yayımcı kullanan yeni bir belirteç alana kadar bu istemciyi kullanılamaz hale getirebilir.
SAS ile Event Hubs 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 Event Hubs ad alanına veya olay hub'ı örneğine ya da konu başlığına atanmış yönetim haklarına veya dinleme ayrıcalıklarına sahip olması gerekir. Veriler tüketici grupları Event Hubs verilerden tüketilir. SAS ilkesi size ayrıntılı kapsam sağlar ancak 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 ya da konu düzeyinde tanımlanan ayrıcalıkların o varlığın tüketici gruplarına uygulanacak olduğu anlamına gelir.
Yerel/SAS Anahtarı kimlik doğrulamasını devre dışı bırakma
Bazı kurumsal güvenlik gereksinimleri için yerel/SAS anahtarı kimlik doğrulamasını tamamen devre dışı bırakmanız ve Azure Active Directory (Azure AD) tabanlı kimlik doğrulamasına güvenmeniz gerekir. Bu, Azure Event Hubs. Azure portal veya Azure Resource Manager şablonu kullanarak Event Hubs alanı düzeyinde yerel/SAS Azure Resource Manager devre dışı abilirsiniz.
Portal aracılığıyla Yerel/SAS Anahtarı kimlik doğrulamasını devre dışı bırakma
Belirli bir ad alanı için yerel/SAS anahtarı Event Hubs kimlik doğrulamasını devre dışı bırakmak için Azure portal.
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ın üzerine tıklayın.

Ardından Devre Dışı seçeneğini belirleyin ve aşağıda gösterildiği gibi Tamam'a tıklayın.

Şablon kullanarak Yerel/SAS Anahtarı kimlik doğrulamasını devre dışı bırakma
Belirli bir ad alanı için yerel kimlik doğrulamasını devre Event Hubs özelliğini aşağıdaki şablonda gösterildiği gibi disableLocalAuth true Azure Resource Manager (ARM Şablonu) olarak ayarlarsınız.
"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')]"
}
}
]
}
]
Sonraki adımlar
Aşağıdaki makalelere bakın:
- SAS kullanarak yetkilendirme
- Azure rol tabanlı erişim denetimi (Azure RBAC) kullanarak yetkilendirme
- Daha fazla bilgi Event Hubs
Aşağıdaki ilgili makalelere bakın:
- Azure Active Directory kullanarak Azure Event Hubs bir uygulamanın kimlik doğrulamasını Azure Active Directory
- Event Hubs Resources'a erişmek için Azure Active Directory kimlik doğrulaması
- Azure Active Directory kullanarak Event Hubs erişim yetkisi Azure Active Directory
- Paylaşılan Erişim İmzaları Event Hubs kaynaklara erişim yetkisi verme