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ğrulama işlemi ve sağlama hizmetinin hem Hizmet hem de Cihaz REST API'lerine yönelik izinleri doğrulamak için kullandığı belirteçler.
Hizmet API'sine erişmek için arka uç uygulamasına verebileceğiniz farklı izinler.
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_name
expiry
girişlerinden uri
belirteci 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.
Hızlı Başlangıç - Azure IoT Hub'a sanal X.509 cihazı sağlama
Hızlı Başlangıç - X.509 cihazlarını Azure Cihaz Sağlama Hizmeti'ne kaydetme
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/bc
değ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. |