Sdílet prostřednictvím


Ří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_nameexpiry 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.

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.