Paylaşılan erişim imzaları ve güvenlik belirteçleriyle Azure IoT Hub Cihazı Sağlama Hizmeti'ne (DPS) erişimi denetleme

Bu makalede, Azure IoT Hub Cihaz Sağlama Hizmetinizin (DPS) güvenliğini sağlamaya yönelik kullanılabilir seçenekler açıklanmaktadır. Sağlama hizmeti, her uç noktaya erişim vermek için kimlik doğrulamasını ve izinleri kullanır. İzinler, kimlik doğrulama işleminin bir hizmet örneğine erişimi işlevselliğe göre sınırlamasına olanak tanır.

Bu makalede şunlar ele alınmaktadır:

Kimlik Doğrulaması

Cihaz API'si anahtar tabanlı ve X.509 sertifika tabanlı cihaz kimlik doğrulamasını destekler.

Hizmet API'si arka uç uygulamaları için anahtar tabanlı kimlik doğrulamasını destekler.

Anahtar tabanlı kimlik doğrulamasını kullanırken Cihaz Sağlama Hizmeti, anahtar göndermeyi önlemek amacıyla hizmetlerin kimliğini doğrulamak için güvenlik belirteçlerini kullanır. Ayrıca, güvenlik belirteçleri zaman geçerliliği ve kapsamı sınırlıdır. Azure IoT Cihaz Sağlama SDK'ları, özel yapılandırma gerektirmeden otomatik olarak belirteç oluşturur.

Bazı durumlarda SDK'ları kullanmadan DOĞRUDAN HTTP Cihaz Sağlama Hizmeti REST API'lerini kullanmanız gerekebilir. Aşağıdaki bölümlerde REST API'lerinde doğrudan kimlik doğrulamasının nasıl yapılacağını açıklanmaktadır.

Cihaz API'sinde kimlik doğrulaması

Cihaz API'si, cihazlar tarafından Cihaz Sağlama Hizmeti'ni test etmek ve bir IoT Hub bağlantısı almak için kullanılır.

Not

Kimliği doğrulanmış bir bağlantı almak için cihazların önce bir kayıt aracılığıyla Cihaz Sağlama Hizmeti'ne kaydedilmesi gerekir. Bir cihazı bir kayıt aracılığıyla program aracılığıyla kaydetmek için Hizmet API'sini kullanın.

Bir cihazın, sağlama işleminin bir parçası olarak Cihaz API'sinde kimlik doğrulaması yapması gerekir. Bir cihazın kimlik doğrulaması için kullandığı yöntem, bir kayıt grubu veya bireysel kayıt ayarladığınızda tanımlanır. Kimlik doğrulama yöntemi ne olursa olsun, cihazın kendisini sağlamak için aşağıdaki URL'ye bir HTTPS PUT vermesi gerekir.

    https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01

Anahtar tabanlı kimlik doğrulaması kullanılıyorsa HTTP Yetkilendirme isteği üst bilgisinde aşağıdaki biçimde bir güvenlik belirteci geçirilir:

    SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI} 

Anahtar tabanlı kimlik doğrulaması için güvenlik belirteci yapısı

Güvenlik belirteci HTTP Yetkilendirme isteği üst bilgisinde aşağıdaki biçimde geçirilir:

    SharedAccessSignature sig={signature}&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ülüp HMAC-SHA256 hesaplamasını yapmak için anahtar olarak kullanılır.
{expiry} 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 URL kodlaması {ID_Scope}/registrations/{registration_id}
{policyName} Cihaz API'sinde bu ilke her zaman "kayıt"tır.

Aşağıdaki Python kod parçacığı, simetrik anahtar kimlik doğrulama türü kullanarak tek bir kayıt için , key, policy_nameexpiry girişlerinden uribelirteci hesaplayan adlı generate_sas_token bir işlevi gösterir.


from base64 import b64encode, b64decode, encode 
from hashlib import sha256 
from time import time 
from urllib.parse import quote_plus, urlencode 
from hmac import HMAC 

 def generate_sas_token(uri, key, policy_name, expiry=3600): 
    ttl = time() + expiry 
    sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl)) 
    signature = b64encode(HMAC(b64decode(key), sign_key.encode('utf-8'), sha256).digest()) 

    rawtoken = { 
        'sr' :  uri, 
        'sig': signature, 
        'se' : str(int(ttl)), 
        'skn' : policy_name 
    } 

    return 'SharedAccessSignature ' + urlencode(rawtoken) 

print(generate_sas_token("myIdScope/registrations/mydeviceregistrationid", "00mysymmetrickey", "registration"))

Sonuç aşağıdaki çıkışa benzemelidir:


SharedAccessSignature sr=myIdScope%2Fregistrations%2Fmydeviceregistrationid&sig=SDpdbUNk%2F1DSjEpeb29BLVe6gRDZI7T41Y4BPsHHoUg%3D&se=1630175722&skn=registration 

Aşağıdaki örnekte, paylaşılan erişim imzasının Cihaz API'siyle kimlik doğrulaması yapmak için nasıl kullanıldığı gösterilmektedir.


curl -L -i -X PUT -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: [token]' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01 

Simetrik anahtar tabanlı kayıt grubu kullanıyorsanız, önce kayıt grubu anahtarını kullanarak bir device symmetric anahtar oluşturmanız gerekir. Cihazın kayıt kimliğinin HMAC-SHA256 değerini hesaplamak için kayıt grubu birincil veya ikincil anahtarını kullanın. Sonuç daha sonra türetilmiş cihaz anahtarını almak için Base64 biçimine dönüştürülür. Kod örneklerini görüntülemek için bkz . Simetrik anahtar kayıt gruplarını kullanarak cihazları sağlama. Cihaz simetrik anahtarı türetildikten sonra, önceki örnekleri kullanarak cihazı kaydedebilirsiniz.

Uyarı

Cihaz kodunuzdaki grup ana anahtarının dahil edilmemesi için cihaz anahtarı türetme işlemi cihazdan yapılmalıdır.

Sertifika tabanlı kimlik doğrulaması

X.509 sertifika tabanlı kimlik doğrulaması için tek bir kayıt veya kayıt grubu ayarladıysanız cihazın Cihaz API'sini doğrulamak için verilen X.509 sertifikasını kullanması gerekir. Kaydı ayarlama ve cihaz sertifikası oluşturma hakkında aşağıdaki makalelere bakın.

Kayıt ayarlandıktan ve cihaz sertifikası verildikten sonra, aşağıdaki örnek cihazın X.509 sertifikasıyla Cihaz API'sinde kimlik doğrulamasının nasıl yapılacağını gösterir.


curl -L -i -X PUT –cert ./[device_cert].pem –key ./[device_cert_private_key].pem -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01 

Hizmet API'sinde kimlik doğrulaması

Hizmet API'si, kayıt durumunu almak ve cihaz kayıtlarını kaldırmak için kullanılır. Hizmet, arka uç uygulamaları tarafından hem tek tek grupları hem de kayıt gruplarını program aracılığıyla yönetmek için de kullanılır. Hizmet API'si arka uç uygulamaları için anahtar tabanlı kimlik doğrulamasını destekler.

Hizmet API'sinin uç noktalarına erişmek için uygun izinlere sahip olmanız gerekir. Örneğin, bir arka uç uygulaması hizmete gönderdiği her iletiyle birlikte güvenlik kimlik bilgilerini içeren bir belirteç içermelidir.

Azure IoT Hub Cihaz Sağlama Hizmeti, belirteci paylaşılan erişim ilkelerine göre doğrulayarak uç noktalara erişim verir. Simetrik anahtarlar gibi güvenlik kimlik bilgileri hiçbir zaman kablo üzerinden gönderilmez.

Erişim denetimi ve izinler

İzinleri aşağıdaki yollarla vekleyebilirsiniz:

  • Paylaşılan erişim yetkilendirme ilkeleri. Paylaşılan erişim ilkeleri, izinlerin herhangi bir bileşimini verebilir. İlkeleri Azure portalında veya Cihaz Sağlama Hizmeti REST API'lerini kullanarak program aracılığıyla tanımlayabilirsiniz. Yeni oluşturulan bir sağlama hizmeti aşağıdaki varsayılan ilkeye sahiptir:

  • provisioningserviceowner: Tüm izinlere sahip ilke. Ayrıntılı bilgi için bkz . izinler .

Not

Cihaz Sağlama Hizmeti kaynak sağlayıcısının güvenliği, Azure Resource Manager'daki tüm sağlayıcılar gibi Azure aboneliğiniz aracılığıyla sağlanır.

Güvenlik belirteçlerini oluşturma ve kullanma hakkında daha fazla bilgi için sonraki bölüme bakın.

DESTEKLENEN tek protokol HTTP'dir ve Yetkilendirme isteği üst bilgisine geçerli bir belirteç ekleyerek kimlik doğrulamasını uygular.

Örnek

SharedAccessSignature sr = 
   mydps.azure-devices-provisioning.net&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501&skn=provisioningserviceowner`\

Not

Azure IoT Cihaz Sağlama Hizmeti SDK'ları hizmete bağlanırken otomatik olarak belirteç oluşturur.

Güvenlik belirteçleri

Cihaz Sağlama Hizmeti, anahtarların kabloya gönderilmesini önlemek için hizmetlerin kimliğini doğrulamak için güvenlik belirteçlerini kullanır. Ayrıca, güvenlik belirteçleri zaman geçerliliği ve kapsamı sınırlıdır. Azure IoT Cihaz Sağlama Hizmeti SDK'ları , özel yapılandırma gerektirmeden otomatik olarak belirteçler oluşturur. Bazı senaryolar doğrudan güvenlik belirteçleri oluşturmanızı ve kullanmanızı gerektirir. Bu tür senaryolar HTTP yüzeyinin doğrudan kullanımını içerir.

Güvenlik belirteci yapısı

IoT Cihaz Sağlama Hizmeti'ndeki belirli işlevlere hizmetler için zamana bağlı erişim vermek için güvenlik belirteçlerini kullanırsınız. Sağlama hizmetine bağlanmak için yetkilendirme almak için hizmetlerin paylaşılan erişim veya simetrik anahtarla imzalanan güvenlik belirteçleri göndermesi gerekir.

Paylaşılan erişim anahtarıyla imzalanan belirteç, paylaşılan erişim ilkesi izinleri ile ilişkili tüm işlevlere erişim verir.

Güvenlik belirteci aşağıdaki biçime sahiptir:

SharedAccessSignature sig={signature}&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ülüp HMAC-SHA256 hesaplamasını yapmak için anahtar olarak kullanılır.
{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ı. IoT Cihaz Sağlama Hizmeti'nin ana bilgisayar adıyla (protokol olmadan) başlayarak, bu belirteçle erişilebilen uç noktaların URI ön eki (segmente göre). Örneğin, mydps.azure-devices-provisioning.net.
{policyName} Bu belirtecin başvurduğu paylaşılan erişim ilkesinin adı.

Not

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/bcdeğildir.

Aşağıdaki Node.js kod parçacığında, girişlerinden belirteci hesaplayan generateSasToken adlı bir işlev gösterilmektedirresourceUri, signingKey, policyName, expiresInMins. 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', new Buffer(signingKey, 'base64'));
    hmac.update(toSign);
    var base64UriEncoded = encodeURIComponent(hmac.digest('base64'));

    // Construct authorization string
    var token = "SharedAccessSignature sr=" + resourceUri + "&sig="
    + base64UriEncoded + "&se=" + expires + "&skn="+ policyName;
    return token;
};

Karşılaştırma olarak, bir güvenlik belirteci oluşturmak için eşdeğer Python kodu şunlardır:

from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC

def generate_sas_token(uri, key, policy_name, expiry=3600):
    ttl = time() + expiry
    sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
    print sign_key
    signature = b64encode(HMAC(b64decode(key), sign_key, sha256).digest())

    rawtoken = {
        'sr' :  uri,
        'sig': signature,
        'se' : str(int(ttl)),
        'skn' : policy_name
    }

    return 'SharedAccessSignature ' + urlencode(rawtoken)

Not

Belirtecin geçerliliği IoT Cihaz Sağlama Hizmeti makinelerinde doğrulandığından, belirteci oluşturan makinenin saatindeki kayma en düşük düzeyde olmalıdır.

Hizmet bileşenlerinden güvenlik belirteçlerini kullanma

Hizmet bileşenleri yalnızca daha önce açıklandığı gibi uygun izinleri veren paylaşılan erişim ilkelerini kullanarak güvenlik belirteçleri oluşturabilir.

Uç noktalarda kullanıma sunulan hizmet işlevleri şunlardır:

Uç nokta İşlev
{your-service}.azure-devices-provisioning.net/enrollments Cihaz Sağlama Hizmeti ile cihaz kayıt işlemleri sağlar.
{your-service}.azure-devices-provisioning.net/enrollmentGroups Cihaz kayıt gruplarını yönetmeye yönelik işlemler sağlar.
{your-service}.azure-devices-provisioning.net/registrations/{id} Cihaz kayıtlarının durumunu almak ve yönetmek için işlemler sağlar.

Örneğin, adlı enrollmentread önceden oluşturulmuş bir paylaşılan erişim ilkesi kullanılarak oluşturulan bir hizmet, aşağıdaki parametrelerle bir belirteç oluşturur:

  • kaynak URI'si: {mydps}.azure-devices-provisioning.net,
  • imzalama anahtarı: ilkenin anahtarlarından enrollmentread biri,
  • ilke adı: enrollmentread,
  • herhangi bir süre sonu zamanı.backn
var endpoint ="mydps.azure-devices-provisioning.net";
var policyName = 'enrollmentread'; 
var policyKey = '...';

var token = generateSasToken(endpoint, policyKey, policyName, 60);

Tüm kayıt kayıtlarını okumak için erişim izni veren sonuç şu şekilde olacaktır:

SharedAccessSignature sr=mydps.azure-devices-provisioning.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=enrollmentread

SDK'lar ve örnekler

Başvuru konuları:

Aşağıdaki başvuru konuları, IoT Cihaz Sağlama Hizmetinize erişimi denetleme hakkında daha fazla bilgi sağlar.

Cihaz Sağlama Hizmeti izinleri

Aşağıdaki tabloda, IoT Cihaz Sağlama Hizmetinize erişimi denetlemek için kullanabileceğiniz izinler listeleniyor.

İzin Notlar
ServiceConfig Hizmet yapılandırmalarını değiştirmek için erişim verir.
Bu izin arka uç bulut hizmetleri tarafından kullanılır.
Kayıt Okuma Cihaz kayıtlarına ve kayıt gruplarına okuma erişimi verir.
Bu izin arka uç bulut hizmetleri tarafından kullanılır.
Kayıt Yazma Cihaz kayıtlarına ve kayıt gruplarına yazma erişimi verir.
Bu izin arka uç bulut hizmetleri tarafından kullanılır.
RegistrationStatusRead Cihaz kayıt durumuna okuma erişimi verir.
Bu izin arka uç bulut hizmetleri tarafından kullanılır.
RegistrationStatusWrite Cihaz kayıt durumuna silme erişimi verir.
Bu izin arka uç bulut hizmetleri tarafından kullanılır.