Řízení přístupu ke službě Azure IoT Hub Device Provisioning Service (DPS) pomocí sdílených přístupových podpisů a tokenů zabezpečení
Tento článek popisuje dostupné možnosti zabezpečení služby Azure IoT Hub Device Provisioning Service (DPS). Služba zřizování používá ověřování a oprávnění k udělení přístupu ke každému koncovému bodu. Oprávnění umožňují procesu ověřování omezit přístup k instanci služby na základě funkcí.
Tento článek popisuje:
Proces ověřování a tokeny, které služba zřizování používá k ověření oprávnění pro rozhraní REST API služby i zařízení.
Různá oprávnění, která můžete udělit back-endové aplikaci pro přístup k rozhraní API služby.
Ověřování
Rozhraní API pro zařízení podporuje ověřování zařízení založené na klíčích a X.509.
Rozhraní API služby podporuje ověřování na základě klíčů pro back-endové aplikace.
Při použití ověřování založeného na klíči služba Device Provisioning používá tokeny zabezpečení k ověřování služeb, aby se zabránilo odesílání klíčů v přenosu. Kromě toho jsou tokeny zabezpečení omezené v časovém rozsahu a platnosti. Sady SDK Azure IoT Device Provisioning automaticky generují tokeny bez nutnosti jakékoli speciální konfigurace.
V některých případech možná budete muset přímo použít rozhraní REST API služby HTTP Device Provisioning bez použití sad SDK. Následující části popisují, jak se ověřovat přímo v rozhraníCH REST API.
Ověřování rozhraní API zařízení
Rozhraní API pro zařízení používá zařízení k ověření služby Device Provisioning a příjmu připojení ioT Hubu.
Poznámka:
Aby bylo možné přijímat ověřené připojení, musí být zařízení nejprve zaregistrovaná ve službě Device Provisioning prostřednictvím registrace. Rozhraní API služby slouží k programové registraci zařízení prostřednictvím registrace.
Zařízení se musí v rámci procesu zřizování ověřit v rozhraní API zařízení. Metoda, kterou zařízení používá k ověření, je definována při nastavování skupiny registrací nebo jednotlivé registrace. Bez ohledu na metodu ověřování musí zařízení vydat metodu HTTPS PUT na následující adresu URL, aby se zřídila sama.
https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01
Pokud používáte ověřování založené na klíči, předá se token zabezpečení v hlavičce požadavku HTTP authorization v následujícím formátu:
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
Struktura tokenů zabezpečení pro ověřování na základě klíčů
Token zabezpečení se předá v hlavičce požadavku HTTP Authorization v následujícím formátu:
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
Očekávané hodnoty jsou:
Hodnota | Popis |
---|---|
{signature} |
Podpisový řetězec HMAC-SHA256 formuláře: {URL-encoded-resourceURI} + "\n" + expiry . Důležité: Klíč je dekódován z base64 a slouží jako klíč k výpočtu HMAC-SHA256. |
{expiry} |
Řetězce UTF8 pro počet sekund od epochy 00:00:00 UTC dne 1. |
{URL-encoded-resourceURI} |
Kódování adresy URL s malých písmeny {ID_Scope}/registrations/{registration_id} |
{policyName} |
Pro rozhraní API zařízení je tato zásada vždy "registrace". |
Následující fragment kódu Pythonu ukazuje funkci, která vypočítá generate_sas_token
token ze vstupů uri
, key
, policy_name
expiry
pro jednotlivou registraci pomocí typu ověřování symetrického klíče.
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"))
Výsledek by měl vypadat přibližně takto:
SharedAccessSignature sr=myIdScope%2Fregistrations%2Fmydeviceregistrationid&sig=SDpdbUNk%2F1DSjEpeb29BLVe6gRDZI7T41Y4BPsHHoUg%3D&se=1630175722&skn=registration
Následující příklad ukazuje, jak se sdílený přístupový podpis pak použije k ověření pomocí rozhraní API zařízení.
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
Pokud používáte skupinu registrací založenou na symetrických klíčích, musíte nejprve vygenerovat device symmetric
klíč pomocí klíče skupiny registrací. Primární nebo sekundární klíč skupiny registrací použijte k výpočtu HMAC-SHA256 ID registrace zařízení. Výsledek se pak převede do formátu Base64 a získá odvozený klíč zařízení. Pokud chcete zobrazit příklady kódu, podívejte se, jak zřídit zařízení pomocí skupin pro registraci symetrických klíčů. Po odvození symetrického klíče zařízení můžete zařízení zaregistrovat pomocí předchozích příkladů.
Upozorňující
Aby se zabránilo zahrnutí hlavního klíče skupiny do kódu zařízení, měl by být proces odvození klíče zařízení proveden mimo zařízení.
Ověřování pomocí certifikátů
Pokud jste pro ověřování založené na certifikátech X.509 nastavili jednotlivou registraci nebo skupinu registrací, bude zařízení muset použít certifikát X.509 vydaný k ověření rozhraní API zařízení. Informace o nastavení registrace a vygenerování certifikátu zařízení najdete v následujících článcích.
Rychlý start – Zřízení simulovaného zařízení X.509 pro Azure IoT Hub
Rychlý start – Registrace zařízení X.509 do služby Azure Device Provisioning
Po nastavení registrace a vystavení certifikátu zařízení ukazuje následující příklad, jak se ověřit v rozhraní API zařízení pomocí certifikátu X.509 zařízení.
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
Ověřování rozhraní API služby
Rozhraní API služby slouží k načtení stavu registrace a odebrání registrací zařízení. Služba je také používána back-endovými aplikacemi k programové správě jednotlivých skupin i skupin registrací. Rozhraní API služby podporuje ověřování na základě klíčů pro back-endové aplikace.
Pro přístup ke všem koncovým bodům rozhraní API služby musíte mít příslušná oprávnění. Například back-endová aplikace musí obsahovat token obsahující přihlašovací údaje zabezpečení spolu se každou zprávou, kterou odešle do služby.
Služba Azure IoT Hub Device Provisioning uděluje přístup ke koncovým bodům ověřením tokenu proti zásadám sdíleného přístupu. Přihlašovací údaje zabezpečení, jako jsou symetrické klíče, se nikdy neposílají přes drát.
Řízení přístupu a oprávnění
Oprávnění můžete udělit následujícími způsoby:
Zásady autorizace sdíleného přístupu Zásady sdíleného přístupu můžou udělit libovolnou kombinaci oprávnění. Zásady můžete definovat na webu Azure Portal nebo programově pomocí rozhraní REST API služby Device Provisioning. Nově vytvořená služba zřizování má následující výchozí zásady:
provisioningserviceowner: Zásady se všemi oprávněními. Podrobné informace najdete v oprávněních .
Poznámka:
Poskytovatel prostředků služby Device Provisioning je zabezpečený prostřednictvím vašeho předplatného Azure, stejně jako všichni poskytovatelé v Azure Resource Manageru.
Další informace o vytváření a používání tokenů zabezpečení najdete v další části.
HTTP je jediný podporovaný protokol a implementuje ověřování zahrnutím platného tokenu do hlavičky žádosti o autorizaci .
Příklad
SharedAccessSignature sr =
mydps.azure-devices-provisioning.net&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501&skn=provisioningserviceowner`\
Poznámka:
Sady SDK služby Azure IoT Device Provisioning automaticky generují tokeny při připojování ke službě.
Tokeny zabezpečení
Služba Device Provisioning používá tokeny zabezpečení k ověřování služeb, aby se zabránilo odesílání klíčů v přenosu. Kromě toho jsou tokeny zabezpečení omezené v časovém rozsahu a platnosti. Sady SDK služby Azure IoT Device Provisioning automaticky generují tokeny bez nutnosti jakékoli speciální konfigurace. Některé scénáře vyžadují přímé generování a používání tokenů zabezpečení. Mezi takové scénáře patří přímé použití povrchu HTTP.
Struktura tokenů zabezpečení
Tokeny zabezpečení slouží k udělení časově omezeného přístupu ke službám ke konkrétním funkcím ve službě IoT Device Provisioning. Aby bylo možné získat autorizaci pro připojení ke službě zřizování, musí služby odesílat tokeny zabezpečení podepsané sdíleným přístupem nebo symetrickým klíčem.
Token podepsaný sdíleným přístupovým klíčem uděluje přístup ke všem funkcím přidruženým k oprávněním zásad sdíleného přístupu.
Token zabezpečení má následující formát:
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
Tady jsou očekávané hodnoty.
Hodnota | Popis |
---|---|
{signature} | Podpisový řetězec HMAC-SHA256 formuláře: {URL-encoded-resourceURI} + "\n" + expiry . Důležité: Klíč je dekódován z base64 a slouží jako klíč k výpočtu HMAC-SHA256. |
{expiry} | Řetězce UTF8 pro počet sekund od epochy 00:00:00 UTC dne 1. |
{URL-encoded-resourceURI} | Kódování adresy URL malého písmena identifikátoru URI prostředku. Předpona identifikátoru URI (podle segmentu) koncových bodů, ke kterým se dá přistupovat pomocí tohoto tokenu, počínaje názvem hostitele služby IoT Device Provisioning (bez protokolu). Například mydps.azure-devices-provisioning.net . |
{policyName} | Název zásady sdíleného přístupu, na kterou tento token odkazuje. |
Poznámka:
Předpona identifikátoru URI se počítá podle segmentu, nikoli znakem. Například /a/b
je předpona pro /a/b/c
, ale ne pro /a/bc
.
Následující Node.js fragment kódu ukazuje funkci s názvem generateSasToken , která vypočítá token ze vstupů resourceUri, signingKey, policyName, expiresInMins
. Další části podrobně popisuje, jak inicializovat různé vstupy pro různé případy použití tokenu.
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;
};
V porovnání je ekvivalentní kód Pythonu pro vygenerování tokenu zabezpečení následující:
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)
Poznámka:
Vzhledem k tomu, že se na počítačích se službou IoT Device Provisioning Service ověřuje doba platnosti tokenu, musí být posun hodin počítače, který token generuje, minimální.
Použití tokenů zabezpečení ze součástí služby
Součásti služeb můžou generovat pouze tokeny zabezpečení pomocí zásad sdíleného přístupu, které udělují příslušná oprávnění, jak bylo vysvětleno dříve.
Tady jsou funkce služby zveřejněné na koncových bodech:
Koncový bod | Funkce |
---|---|
{your-service}.azure-devices-provisioning.net/enrollments |
Poskytuje operace registrace zařízení se službou Device Provisioning. |
{your-service}.azure-devices-provisioning.net/enrollmentGroups |
Poskytuje operace pro správu skupin registrace zařízení. |
{your-service}.azure-devices-provisioning.net/registrations/{id} |
Poskytuje operace pro načítání a správu stavu registrace zařízení. |
Například služba vygenerovaná pomocí předem vytvořené zásady enrollmentread
sdíleného přístupu by vytvořila token s následujícími parametry:
- identifikátor URI prostředku:
{mydps}.azure-devices-provisioning.net
, - podpisový klíč: jeden z klíčů
enrollmentread
zásad, - název zásady:
enrollmentread
, - any expiration time.backn
var endpoint ="mydps.azure-devices-provisioning.net";
var policyName = 'enrollmentread';
var policyKey = '...';
var token = generateSasToken(endpoint, policyKey, policyName, 60);
Výsledkem, který by udělil přístup ke čtení všech záznamů o registraci, by byl:
SharedAccessSignature sr=mydps.azure-devices-provisioning.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=enrollmentread
Sady SDK a ukázky
Referenční témata:
Následující referenční témata obsahují další informace o řízení přístupu ke službě IoT Device Provisioning.
Oprávnění služby Device Provisioning
Následující tabulka uvádí oprávnění, která můžete použít k řízení přístupu ke službě IoT Device Provisioning.
Oprávnění | Notes |
---|---|
ServiceConfig | Uděluje přístup ke změně konfigurací služby. Toto oprávnění používají back-endové cloudové služby. |
EnrollmentRead | Uděluje přístup pro čtení k registracím zařízení a skupinám registrací. Toto oprávnění používají back-endové cloudové služby. |
Zápis registrace | Uděluje přístup k zápisu do registrací zařízení a skupin registrací. Toto oprávnění používají back-endové cloudové služby. |
RegistrationStatusRead | Udělí oprávnění ke čtení stavu registrace zařízení. Toto oprávnění používají back-endové cloudové služby. |
RegistrationStatusWrite | Uděluje přístup k odstranění stavu registrace zařízení. Toto oprávnění používají back-endové cloudové služby. |