Paylaşılan erişim imzalarıyla IoT Hub'a erişimi denetleme
IoT Hub, anahtarların kabloda gönderilmesini önlemek için cihazların ve hizmetlerin kimliğini doğrulamak için paylaşılan erişim imzası (SAS) belirteçleri kullanır. IoT Hub'daki belirli işlevlere cihazlara ve hizmetlere zamana bağlı erişim vermek için SAS belirteçlerini kullanırsınız. IoT Hub'a bağlanma yetkisi almak için cihazların ve hizmetlerin paylaşılan erişim veya simetrik anahtarla imzalanan SAS belirteçleri göndermesi gerekir. Simetrik anahtarlar, kimlik kayıt defterinde bir cihaz kimliğiyle depolanır.
Bu makale şunları tanıtır:
- Bir istemciye IoT hub'ınıza erişmesi için verebileceğiniz farklı izinler.
- IoT Hub'ın izinleri doğrulamak için kullandığı belirteçler.
- Belirli kaynaklara erişimi sınırlamak için kimlik bilgilerini kapsama.
- Mevcut cihaz kimlik kayıt defterlerini veya kimlik doğrulama düzenlerini kullanan özel cihaz kimlik doğrulama mekanizmaları.
Not
Buluttan cihaza mesajlaşma, cihaz ikizleri ve cihaz yönetimi gibi bu makalede bahsedilen özelliklerden bazıları yalnızca IoT Hub'ın standart katmanında kullanılabilir. Temel ve standart/ücretsiz IoT Hub katmanları hakkında daha fazla bilgi için bkz. Çözümünüz için doğru IoT Hub katmanını seçme.
IoT Hub, her IoT hub uç noktasına erişim vermek için izinleri kullanır. İzinler, işlevlere göre IoT hub'ına erişimi sınırlar. IoT Hub uç noktalarına erişmek için uygun izinlere sahip olmanız gerekir. Örneğin, bir cihazın IoT Hub'a gönderdiği her iletiyle birlikte güvenlik kimlik bilgilerini içeren bir belirteç içermesi gerekir. Ancak, cihaz simetrik anahtarları gibi imzalama anahtarları hiçbir zaman kablo üzerinden gönderilmez.
Kimlik doğrulaması ve yetkilendirme
Kimlik doğrulaması , dediğiniz kişi olduğunuzu kanıtlama işlemidir. Kimlik doğrulaması, ioT Hub'a bir kullanıcının veya cihazın kimliğini doğrular. Bazen AuthN olarak kısaltılır. Yetkilendirme , IoT Hub'da kimliği doğrulanmış bir kullanıcı veya cihaz için izinleri onaylama işlemidir. Erişim iznine sahip olduğunuz kaynakları ve komutları ve bu kaynak ve komutlarla neler yapabileceğinizi belirtir. Yetkilendirme bazen AuthZ olarak kısaltılır.
Bu makalede, izinleri gruplandırmanıza ve erişim anahtarları ve imzalı güvenlik belirteçleri kullanarak uygulamalara vermenizi sağlayan Paylaşılan erişim imzalarını kullanarak kimlik doğrulaması ve yetkilendirme açıklanmaktadır. IoT Hub ile bir cihazın kimliğini doğrulamak için simetrik anahtarları veya paylaşılan erişim anahtarlarını da kullanabilirsiniz. SAS belirteçleri, cihaz tarafından IoT Hub'a yapılan her çağrı için simetrik anahtarı her çağrıyla ilişkilendirerek kimlik doğrulaması sağlar.
Erişim denetimi ve izinler
IoT hub düzeyinde erişim için paylaşılan erişim ilkelerini kullanın ve yalnızca bu cihaza erişimi kapsamak için tek tek cihaz kimlik bilgilerini kullanın.
IoT hub düzeyinde paylaşılan erişim ilkeleri
Paylaşılan erişim ilkeleri, izinlerin herhangi bir bileşimini verebilir. İlkeleri Azure portalında IoT Hub Kaynak REST API'lerini veya Azure CLI az iot hub ilke komutunu kullanarak program aracılığıyla tanımlayabilirsiniz. Yeni oluşturulan bir IoT hub'ı aşağıdaki varsayılan ilkelere sahiptir:
Paylaşılan Erişim İlkesi | İzinler |
---|---|
iothubowner | Tüm izinler |
service | ServiceConnect izinleri |
device | DeviceConnect izinleri |
registryRead | RegistryRead izinleri |
registryReadWrite | RegistryRead ve RegistryWrite izinleri |
IoT hub'ınıza erişimi denetlemek için aşağıdaki izinleri kullanabilirsiniz:
ServiceConnect izni arka uç bulut hizmetleri tarafından kullanılır ve aşağıdaki erişimi verir:
- Bulut hizmetine yönelik iletişim ve izleme uç noktalarına erişim.
- Cihazdan buluta iletileri alın, buluttan cihaza iletiler gönderin ve ilgili teslim onaylarını alın.
- Dosya yüklemeleri için teslim bildirimleri alın.
- Etiketleri ve istenen özellikleri güncelleştirmek, bildirilen özellikleri almak ve sorguları çalıştırmak için ikizlere erişin.
DeviceConnect izni cihazlar tarafından kullanılır ve aşağıdaki erişimi verir:
- Cihaza yönelik uç noktalara erişim.
- Cihazdan buluta iletiler gönderin ve buluttan cihaza iletiler alın.
- Dosya yükleme işlemini gerçekleştirin.
- Cihaz ikizi istenen özellik bildirimlerini alın ve cihaz ikizi bildirilen özelliklerini güncelleştirin.
RegistryRead izni arka uç bulut hizmetleri tarafından kullanılır ve aşağıdaki erişimi verir:
- Kimlik kayıt defterine okuma erişimi. Daha fazla bilgi için bkz . Kimlik kayıt defteri.
RegistryReadWrite izni arka uç bulut hizmetleri tarafından kullanılır ve aşağıdaki erişimi verir:
- Kimlik kayıt defterine okuma ve yazma erişimi. Daha fazla bilgi için bkz . Kimlik kayıt defteri.
Cihaz başına güvenlik kimlik bilgileri
Her IoT hub'ına bağlanmak için izin verilen cihazlar ve modüller hakkındaki bilgileri depolayan bir kimlik kayıt defteri vardır. Bir cihazın veya modülün bağlanabilmesi için ioT hub'ında kimlik kayıt defterinde bu cihaz veya modül için bir giriş olması gerekir. Bir cihaz veya modül, kimlik kayıt defterinde depolanan kimlik bilgilerine göre IoT hub'ı ile kimlik doğrulaması yapar.
SAS belirteci kimlik doğrulamasını kullanmak için bir cihaz kaydettiğinizde, bu cihaz iki simetrik anahtar alır. Simetrik anahtarlar, ilişkili cihaz kimliği için DeviceConnect izni verir.
Hizmetlerden SAS belirteçleri kullanma
Hizmetler, daha önce Erişim denetimi ve izinleri bölümünde açıklandığı gibi uygun izinleri tanımlayan bir paylaşılan erişim ilkesi kullanarak SAS belirteçleri oluşturabilir.
Örneğin, registryRead adlı önceden oluşturulmuş paylaşılan erişim ilkesini kullanan bir hizmet aşağıdaki parametrelere sahip bir belirteç oluşturur:
- kaynak URI'si:
{IoT hub name}.azure-devices.net
, - imzalama anahtarı: ilkenin anahtarlarından
registryRead
biri, - ilke adı:
registryRead
, - herhangi bir süre sonu.
Örneğin, aşağıdaki kod Node.js bir SAS belirteci oluşturur:
var endpoint = "myhub.azure-devices.net";
var policyName = 'registryRead';
var policyKey = '...';
var token = generateSasToken(endpoint, policyKey, policyName, 60);
Kimlik kayıt defterindeki tüm cihaz kimliklerini okuma erişimi veren sonuç şöyle olacaktır:
SharedAccessSignature sr=myhub.azure-devices.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=registryRead
Daha fazla örnek için bkz . SAS belirteçleri oluşturma.
Hizmetler için SAS belirteçleri yalnızca IoT Hub düzeyinde izinler verir. Diğer bir ifadeyle, hizmet ilkesini temel alan bir belirteçle kimlik doğrulaması yapan bir hizmet, ServiceConnect izni tarafından verilen tüm işlemleri gerçekleştirebilir. Bu işlemler cihazdan buluta iletileri almayı, buluttan cihaza iletileri göndermeyi vb. içerir. Hizmetlerinize daha ayrıntılı erişim vermek istiyorsanız ( örneğin, bir hizmeti yalnızca buluttan cihaza ileti göndermeyle sınırlandırmak) Microsoft Entra Id kullanabilirsiniz. Daha fazla bilgi için bkz . Microsoft Entra Id ile kimlik doğrulaması.
Cihazlardan SAS belirteçleri kullanma
SAS belirteçleriyle IoT Hub ile DeviceConnect izinlerini almanın iki yolu vardır: kimlik kayıt defterinden simetrik bir cihaz anahtarı kullanın veya paylaşılan erişim anahtarı kullanın.
Cihazlardan erişilebilen tüm işlevler, ön ekiyle /devices/{deviceId}
uç noktalarda tasarım gereği kullanıma sunulur.
Cihaza yönelik uç noktalar şunlardır (protokolden bağımsız olarak):
Uç nokta | İşlev |
---|---|
{iot hub name}/devices/{deviceId}/messages/events |
Cihazdan buluta iletiler gönderin. |
{iot hub name}/devices/{deviceId}/messages/devicebound |
Buluttan cihaza iletileri alma. |
Kimlik kayıt defterinde simetrik anahtar kullanma
Belirteç oluşturmak için cihaz kimliğinin simetrik anahtarını kullanırken belirtecin policyName (skn
) öğesi atlanır.
Örneğin, tüm cihaz işlevlerine erişmek için oluşturulan bir belirteç aşağıdaki parametrelere sahip olmalıdır:
- kaynak URI'si:
{IoT hub name}.azure-devices.net/devices/{device id}
, - imzalama anahtarı: kimlik için
{device id}
herhangi bir simetrik anahtar, - ilke adı yok,
- herhangi bir süre sonu.
Örneğin, aşağıdaki kod Node.js bir SAS belirteci oluşturur:
var endpoint ="myhub.azure-devices.net/devices/device1";
var deviceKey ="...";
var token = generateSasToken(endpoint, deviceKey, null, 60);
Device1 için tüm işlevlere erişim sağlayan sonuç şu şekilde olacaktır:
SharedAccessSignature sr=myhub.azure-devices.net%2fdevices%2fdevice1&sig=13y8ejUk2z7PLmvtwR5RqlGBOVwiq7rQR3WZ5xZX3N4%3D&se=1456971697
Daha fazla örnek için bkz . SAS belirteçleri oluşturma.
Cihaz adına erişmek için paylaşılan erişim ilkesi kullanma
Paylaşılan erişim ilkesinden belirteç oluşturduğunuzda, alanı ilkenin adı olarak ayarlayın skn
. Bu ilke DeviceConnect izni vermelidir.
Cihaz işlevselliğine erişmek için paylaşılan erişim ilkelerini kullanmaya yönelik iki ana senaryo şunlardır:
- bulut protokolü ağ geçitleri,
- özel kimlik doğrulama düzenlerini uygulamak için kullanılan belirteç hizmetleri .
Paylaşılan erişim ilkesi herhangi bir cihaz olarak bağlanmak için erişim izni verebileceğinden, SAS belirteçleri oluştururken doğru kaynak URI'sini kullanmak önemlidir. Bu ayar özellikle belirteci kaynak URI'sini kullanarak belirli bir cihazla kapsaması gereken belirteç hizmetleri için önemlidir. Tüm cihazlar için zaten trafiğe aracılık ettikleri için bu nokta protokol ağ geçitleri için daha az uygundur.
Örneğin, cihaz adlı önceden oluşturulmuş paylaşılan erişim ilkesini kullanan bir belirteç hizmeti aşağıdaki parametrelere sahip bir belirteç oluşturur:
- kaynak URI'si:
{IoT hub name}.azure-devices.net/devices/{device id}
, - imzalama anahtarı: ilkenin anahtarlarından
device
biri, - ilke adı:
device
, - herhangi bir süre sonu.
Örneğin, aşağıdaki kod Node.js bir SAS belirteci oluşturur:
var endpoint ="myhub.azure-devices.net/devices/device1";
var policyName = 'device';
var policyKey = '...';
var token = generateSasToken(endpoint, policyKey, policyName, 60);
Device1 için tüm işlevlere erişim sağlayan sonuç şu şekilde olacaktır:
SharedAccessSignature sr=myhub.azure-devices.net%2fdevices%2fdevice1&sig=13y8ejUk2z7PLmvtwR5RqlGBOVwiq7rQR3WZ5xZX3N4%3D&se=1456971697&skn=device
Bir protokol ağ geçidi, kaynak URI'sini myhub.azure-devices.net/devices
olarak ayarlayarak tüm cihazlar için aynı belirteci kullanabilir.
Daha fazla örnek için bkz . SAS belirteçleri oluşturma.
Mevcut cihazları tümleştirmek için belirteç hizmeti oluşturma
Belirteçleri kullanarak cihaz başına veya modül başına güvenlik kimlik bilgilerini ve erişim denetimini yapılandırmak için IoT Hub kimlik kayıt defterini kullanabilirsiniz. Bir IoT çözümünün özel kimlik kayıt defteri ve/veya kimlik doğrulama şeması zaten varsa, bu altyapıyı IoT Hub ile tümleştirmek için bir belirteç hizmeti oluşturmayı göz önünde bulundurun. Bu şekilde, çözümünüzdeki diğer IoT özelliklerini kullanabilirsiniz.
Belirteç hizmeti özel bir bulut hizmetidir. Cihaz kapsamlı veya modül kapsamlı belirteçler oluşturmak için DeviceConnect iznine sahip bir IoT Hub paylaşılan erişim ilkesi kullanır. Bu belirteçler bir cihazın veya modülün IoT hub'ınıza bağlanmasına olanak tanır.
Belirteç hizmeti düzeninin ana adımları şunlardır:
IoT hub'ınız için DeviceConnect iznine sahip bir IoT Hub paylaşılan erişim ilkesi oluşturun. Bu ilkeyi Azure portalında veya program aracılığıyla oluşturabilirsiniz. Belirteç hizmeti, oluşturduğu belirteçleri imzalamak için bu ilkeyi kullanır.
Bir cihaz veya modülün IoT hub'ınıza erişmesi gerektiğinde belirteç hizmetinizden imzalı bir belirteç ister. Cihaz, belirteç hizmetinin belirteci oluşturmak için kullandığı cihaz/modül kimliğini belirlemek için özel kimlik kayıt defterinizle/kimlik doğrulama düzeninizle kimlik doğrulaması yapabilir.
Belirteç hizmeti bir belirteç döndürür. Belirteç, cihazın kimliği doğrulanmış ve modülün kimliği doğrulanmış
moduleId
olarak veyaresourceURI
deviceId
/devices/{deviceId}/modules/{moduleId}
olarak kullanılarak/devices/{deviceId}
oluşturulur. Belirteç hizmeti, belirteci oluşturmak için paylaşılan erişim ilkesini kullanır.Cihaz/modül, belirteci doğrudan IoT hub'ı ile birlikte kullanır.
Not
Belirteç hizmetinizde belirteç oluşturmak için .NET sınıfı SharedAccessSignatureBuilder veya Java sınıfı IotHubServiceSasToken kullanabilirsiniz.
Belirteç hizmeti, belirteç süre sonunu istediğiniz gibi ayarlayabilir. Belirtecin süresi dolduğunda IoT hub'ı cihaz/modül bağlantısını keser. Ardından cihazın/modülün belirteç hizmetinden yeni bir belirteç istemesi gerekir. Kısa süre sonu süresi hem cihaz/modül hem de belirteç hizmeti üzerindeki yükü artırır.
Bir cihazın/modülün hub'ınıza bağlanabilmesi için, bağlanmak için anahtar değil belirteç kullanıyor olsa bile cihazı IoT Hub kimlik kayıt defterine eklemeniz gerekir. Bu nedenle, kimlik kayıt defterinde cihaz/modül kimliklerini etkinleştirerek veya devre dışı bırakarak cihaz/modül başına erişim denetimini kullanmaya devam edebilirsiniz. Bu yaklaşım, süresi uzun olan belirteçleri kullanma risklerini azaltır.
Özel ağ geçidiyle karşılaştırma
Belirteç hizmeti düzeni, IoT Hub ile özel kimlik kayıt defteri/kimlik doğrulama şeması uygulamak için önerilen yoldur. IoT Hub çözüm trafiğinin çoğunu işlemeye devam ettiğinden bu desen önerilir. Ancak, özel kimlik doğrulama düzeni protokolle bu kadar iç içeyse, tüm trafiği işlemek için özel bir ağ geçidi gerekebilir. Bu tür bir senaryoya örnek olarak Aktarım Katmanı Güvenliği (TLS) ve önceden paylaşılan anahtarlar (PSK) kullanılır. Daha fazla bilgi için bkz . IoT Edge cihazı ağ geçidi olarak nasıl kullanılabilir?
SAS belirteçleri oluşturma
Azure IoT SDK'ları otomatik olarak belirteç oluşturur, ancak bazı senaryolar sas belirteçlerini doğrudan oluşturmanızı ve kullanmanızı gerektirir, örneğin:
MQTT, AMQP veya HTTPS yüzeylerinin doğrudan kullanımı.
Belirteç hizmeti oluşturma bölümünde açıklandığı gibi belirteç hizmeti düzeninin uygulanması.
Paylaşılan erişim anahtarıyla imzalanan belirteç, paylaşılan erişim ilkesi izinleri ile ilişkili tüm işlevlere erişim verir. Cihaz kimliğinin simetrik anahtarıyla imzalanan belirteç yalnızca ilişkili cihaz kimliği için DeviceConnect izni verir.
Bu bölümde, farklı kod dillerinde SAS belirteçleri oluşturma örnekleri sağlanır. Ayrıca az iot hub generate-sas-token CLI uzantısı komutu veya Visual Studio Code için Azure IoT Hub uzantısı ile SAS belirteçleri oluşturabilirsiniz.
SAS belirteci yapısı
SAS belirteci aşağıdaki biçime sahiptir:
SharedAccessSignature sig={signature-string}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
Beklenen değerler şunlardır:
Value | Açıklama |
---|---|
{signature} | Formdaki bir HMAC-SHA256 imza dizesi: {URL-encoded-resourceURI} + "\n" + expiry . Önemli: Anahtarın kodu base64'ten çözülerek HMAC-SHA256 hesaplamasını gerçekleştirmek için anahtar olarak kullanılır. |
{resourceURI} | IoT hub'ının ana bilgisayar adıyla başlayarak (protokol olmadan) bu belirteçle erişilebilen uç noktaların URI ön eki (segmente göre). Arka uç hizmetlerine verilen SAS belirteçlerinin kapsamı IoT hub düzeyine göre belirlenir; örneğin, myHub.azure-devices.net . Cihazlara verilen SAS belirteçlerinin kapsamı tek bir cihaz olarak belirlenmiş olmalıdır; örneğin, myHub.azure-devices.net/devices/device1 . |
{süre sonu} | 1 Ocak 1970 tarihinde saat 00:00:00 UTC tarihinden bu yana geçen saniye sayısı için UTF8 dizeleri. |
{URL-encoded-resourceURI} | Küçük harf kaynak URI'sinin küçük harf URL kodlaması |
{policyName} | Bu belirtecin başvurduğu paylaşılan erişim ilkesinin adı. Belirteç cihaz kayıt defteri kimlik bilgilerine başvuruyorsa yok. |
URI ön eki karaktere göre değil segmente göre hesaplanır. Örneğin, /a/b
için /a/b/c
bir ön ektir ancak için /a/bc
değildir.
Aşağıdaki kod kaynak URI'sini, imzalama anahtarını, ilke adını ve süre sonu süresini kullanarak bir SAS belirteci oluşturur. Sonraki bölümlerde, farklı belirteç kullanım örnekleri için farklı girişlerin nasıl başlatılmış olduğu açıklanır.
var generateSasToken = function(resourceUri, signingKey, policyName, expiresInMins) {
resourceUri = encodeURIComponent(resourceUri);
// Set expiration in seconds
var expires = (Date.now() / 1000) + expiresInMins * 60;
expires = Math.ceil(expires);
var toSign = resourceUri + '\n' + expires;
// Use crypto
var hmac = crypto.createHmac('sha256', Buffer.from(signingKey, 'base64'));
hmac.update(toSign);
var base64UriEncoded = encodeURIComponent(hmac.digest('base64'));
// Construct authorization string
var token = "SharedAccessSignature sr=" + resourceUri + "&sig="
+ base64UriEncoded + "&se=" + expires;
if (policyName) token += "&skn="+policyName;
return token;
};
Protokole özgü ayrıntılar
MQTT, AMQP ve HTTPS gibi desteklenen her protokol belirteçleri farklı şekillerde taşır.
MQTT kullanılırken, CONNECT paketinde ClientId olarak deviceId değeri, {iothubhostname}/{deviceId}
Kullanıcı Adı alanında ve Parola alanında bir SAS belirteci bulunur. {iothubhostname}
IoT hub'ının tam CName değeri olmalıdır (örneğin, myhub.azure-devices.net).
IOT Hub, AMQP kullanırken SASL PLAIN ve AMQP Talep Tabanlı Güvenlik'i destekler.
AMQP talep tabanlı güvenlik kullanıyorsanız, standart bu belirteçlerin nasıl iletilir belirtir.
SASL PLAIN için kullanıcı adı şu olabilir:
{policyName}@sas.root.{iothubName}
IoT hub düzeyinde belirteçler kullanılıyorsa.{deviceId}@sas.{iothubname}
cihaz kapsamlı belirteçler kullanıyorsanız.
Her iki durumda da parola alanı SAS belirteci yapısında açıklandığı gibi belirteci içerir.
HTTPS, Yetkilendirme isteği üst bilgisine geçerli bir belirteç ekleyerek kimlik doğrulamasını uygular.
Örneğin, Kullanıcı Adı (DeviceId büyük/küçük harfe duyarlıdır): iothubname.azure-devices.net/DeviceId
Parola (AZ iot hub generate-sas-token CLI uzantısı komutuyla veya Visual Studio Code için Azure IoT Hub uzantısıyla bir SAS belirteci oluşturabilirsiniz):
SharedAccessSignature sr=iothubname.azure-devices.net%2fdevices%2fDeviceId&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501
Not
Azure IoT SDK'ları hizmete bağlanırken otomatik olarak belirteç oluşturur. Bazı durumlarda Azure IoT SDK'ları tüm protokolleri veya tüm kimlik doğrulama yöntemlerini desteklemez.
SASL PLAIN için dikkat edilmesi gereken özel noktalar
AMQP ile SASL PLAIN kullanırken, IoT hub'ına bağlanan bir istemci her TCP bağlantısı için tek bir belirteç kullanabilir. Belirtecin süresi dolduğunda TCP bağlantısının hizmetle bağlantısı kesilir ve yeniden bağlantı tetikler. Bu davranış, bir arka uç uygulaması için sorunlu olmasa da, aşağıdaki nedenlerle bir cihaz uygulaması için zarar verir:
Ağ geçitleri genellikle birçok cihaz adına bağlanır. SASL PLAIN kullanırken, ioT hub'ına bağlanan her cihaz için ayrı bir TCP bağlantısı oluşturmaları gerekir. Bu senaryo, güç ve ağ kaynaklarının tüketimini önemli ölçüde artırır ve her cihaz bağlantısının gecikme süresini artırır.
Kaynak kısıtlanmış cihazlar, her belirteç süre sonundan sonra yeniden bağlanmak için kaynakların artan kullanımından olumsuz etkilenir.
Sonraki adımlar
Artık IoT Hub'a erişimi denetlemeyi öğrendiğinize göre, aşağıdaki IoT Hub geliştirici kılavuzu konuları ilginizi çekebilir: