Řízení přístupu ke službě IoT Hub pomocí sdílených přístupových podpisů

IoT Hub používá tokeny sdíleného přístupového podpisu (SAS) k ověřování zařízení a služeb, aby se zabránilo odesílání klíčů v přenosu. Tokeny SAS slouží k udělení časově omezeného přístupu k zařízením a službám pro konkrétní funkce ve službě IoT Hub. Aby bylo možné získat autorizaci pro připojení ke službě IoT Hub, zařízení a služby musí odesílat tokeny SAS podepsané sdíleným přístupem nebo symetrickým klíčem. Symetrické klíče se ukládají s identitou zařízení v registru identit.

Tento článek představuje:

  • Různá oprávnění, která můžete klientovi udělit pro přístup ke službě IoT Hub.
  • Tokeny IoT Hubu používají k ověření oprávnění.
  • Jak nastavit rozsah přihlašovacích údajů pro omezení přístupu k určitým prostředkům
  • Vlastní mechanismy ověřování zařízení, které používají existující registry identit zařízení nebo schémata ověřování

Poznámka:

Některé funkce uvedené v tomto článku, jako je zasílání zpráv z cloudu do zařízení, dvojčata zařízení a správa zařízení, jsou k dispozici ve službě IoT Hub pouze na úrovni Standard. Další informace o úrovních Služby IoT Hub úrovně Basic a Standard/Free najdete v tématu Volba správné úrovně IoT Hubu pro vaše řešení.

IoT Hub používá oprávnění k udělení přístupu ke každému koncovému bodu centra IoT. Oprávnění omezují přístup k centru IoT na základě funkcí. Abyste mohli přistupovat ke všem koncovým bodům ioT Hubu, musíte mít příslušná oprávnění. Zařízení musí například obsahovat token obsahující přihlašovací údaje zabezpečení spolu se každou zprávou, kterou odesílá do IoT Hubu. Podpisové klíče, jako jsou symetrické klíče zařízení, se ale nikdy neposílají přes drát.

Ověřování a autorizace

Ověřování je proces prokázání toho, že jste tím, kdo říkáte. Ověřování ověřuje identitu uživatele nebo zařízení ve službě IoT Hub. Někdy se zkracuje na AuthN. Autorizace je proces potvrzení oprávnění pro ověřeného uživatele nebo zařízení ve službě IoT Hub. Určuje, k jakým prostředkům a příkazům máte povolený přístup a co můžete s těmito prostředky a příkazy dělat. Autorizace se někdy zkracuje na AuthZ.

Tento článek popisuje ověřování a autorizaci pomocí sdílených přístupových podpisů, které umožňují seskupovat oprávnění a udělovat jim aplikace pomocí přístupových klíčů a podepsaných tokenů zabezpečení. K ověření zařízení ve službě IoT Hub můžete použít také symetrické klíče nebo sdílené přístupové klíče. Tokeny SAS poskytují ověřování pro každé volání zařízení do IoT Hubu tím, že ke každému volání přidružuje symetrický klíč.

Řízení přístupu a oprávnění

Použijte zásady sdíleného přístupu pro přístup na úrovni centra IoT a použijte přihlašovací údaje jednotlivých zařízení k určení rozsahu přístupu jenom na toto zařízení.

Zásady sdíleného přístupu na úrovni centra IoT

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 prostřednictvím kódu programu pomocí rozhraní REST API prostředků služby IoT Hub nebo pomocí příkazu Azure CLI az iot hub policy . Nově vytvořené centrum IoT má následující výchozí zásady:

Zásady sdíleného přístupu Oprávnění
iothubowner Všechna oprávnění
service Oprávnění ke službě Připojení
device Oprávnění zařízení Připojení
registryRead Oprávnění RegistryRead
registryReadWrite Oprávnění RegistryRead a RegistryWrite

K řízení přístupu ke službě IoT Hub můžete použít následující oprávnění:

  • Služba Připojení oprávnění se používá back-endovými cloudovými službami a uděluje následující přístup:

    • Přístup ke koncovým bodům komunikace a monitorování cloudových služeb
    • Přijímat zprávy typu zařízení-cloud, odesílat zprávy typu cloud-zařízení a načítat odpovídající potvrzení o doručení.
    • Načtěte potvrzení o doručení pro nahrávání souborů.
    • Přístup k dvojčatům za účelem aktualizace značek a požadovaných vlastností, načtení ohlášených vlastností a spouštění dotazů.
  • Zařízení Připojení oprávnění používá zařízení a uděluje následující přístup:

    • Přístup ke koncovým bodům orientovaným na zařízení
    • Odesílání zpráv typu zařízení-cloud a příjem zpráv typu cloud-zařízení
    • Nahrání souboru.
    • Příjem oznámení o požadovaných vlastnostech dvojčete zařízení a aktualizace ohlášených vlastností dvojčete zařízení
  • Oprávnění RegistryRead používá back-endové cloudové služby a uděluje následující přístup:

    • Čtení přístupu k registru identit. Další informace najdete v tématu Registr identit.
  • Oprávnění RegistryReadWrite používají back-endové cloudové služby a uděluje následující přístup:

    • Přístup ke čtení a zápisu do registru identit. Další informace najdete v tématu Registr identit.

Přihlašovací údaje zabezpečení pro jednotlivá zařízení

Každé centrum IoT má registr identit, který ukládá informace o zařízeních a modulech povolených pro připojení k němu. Než se zařízení nebo modul může připojit, musí existovat položka pro dané zařízení nebo modul v registru identit služby IoT Hub. Zařízení nebo modul se ověřuje ve službě IoT Hub na základě přihlašovacích údajů uložených v registru identit.

Když zaregistrujete zařízení pro použití ověřování pomocí tokenu SAS, získá toto zařízení dva symetrické klíče. Symetrické klíče uděluje zařízení oprávnění Připojení pro přidruženou identitu zařízení.

Použití tokenů SAS ze služeb

Služby můžou generovat tokeny SAS pomocí zásad sdíleného přístupu, které definují příslušná oprávnění, jak je vysvětleno výše v části Řízení přístupu a oprávnění .

Například služba používající předem vytvořenou zásadu sdíleného přístupu s názvem registryRead vytvoří token s následujícími parametry:

  • identifikátor URI prostředku: {IoT hub name}.azure-devices.net,
  • podpisový klíč: jeden z klíčů registryRead zásad,
  • název zásady: registryRead,
  • kdykoliv vyprší.

Například následující kód vytvoří token SAS v Node.js:

var endpoint = "myhub.azure-devices.net";
var policyName = 'registryRead';
var policyKey = '...';

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

Výsledkem, který uděluje přístup ke čtení všech identit zařízení v registru identit, by byl:

SharedAccessSignature sr=myhub.azure-devices.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=registryRead

Další příklady najdete v tématu Generování tokenů SAS.

U služeb udělují tokeny SAS oprávnění pouze na úrovni služby IoT Hub. To znamená, že služba, která se ověřuje pomocí tokenu na základě zásad služby, bude moct provádět všechny operace udělené službou Připojení oprávnění. Mezi tyto operace patří příjem zpráv typu zařízení-cloud, odesílání zpráv typu cloud-zařízení atd. Pokud chcete udělit podrobnější přístup ke službám, například omezit službu jenom na odesílání zpráv z cloudu na zařízení, můžete použít ID Microsoft Entra. Další informace najdete v tématu Ověřování pomocí ID Microsoft Entra.

Použití tokenů SAS ze zařízení

Existují dva způsoby, jak získat oprávnění zařízení Připojení se službou IoT Hub s tokeny SAS: použijte symetrický klíč zařízení z registru identit nebo použijte sdílený přístupový klíč.

Všechny funkce přístupné ze zařízení jsou vystaveny návrhem na koncových bodech s předponou /devices/{deviceId}.

Koncové body směřující k zařízení jsou (bez ohledu na protokol):

Koncový bod Funkce
{iot hub name}/devices/{deviceId}/messages/events Odesílání zpráv typu zařízení-cloud
{iot hub name}/devices/{deviceId}/messages/devicebound Příjem zpráv typu cloud-zařízení

Použití symetrického klíče v registru identit

Při použití symetrického klíče identity zařízení k vygenerování tokenu se vynechá element policyName (skn) tokenu.

Například token vytvořený pro přístup ke všem funkcím zařízení by měl mít následující parametry:

  • identifikátor URI prostředku: {IoT hub name}.azure-devices.net/devices/{device id},
  • podpisový klíč: jakýkoli symetrický klíč pro {device id} identitu,
  • žádný název zásady,
  • kdykoliv vyprší.

Například následující kód vytvoří token SAS v Node.js:

var endpoint ="myhub.azure-devices.net/devices/device1";
var deviceKey ="...";

var token = generateSasToken(endpoint, deviceKey, null, 60);

Výsledkem, který uděluje přístup ke všem funkcím zařízení 1, by byl:

SharedAccessSignature sr=myhub.azure-devices.net%2fdevices%2fdevice1&sig=13y8ejUk2z7PLmvtwR5RqlGBOVwiq7rQR3WZ5xZX3N4%3D&se=1456971697

Další příklady najdete v tématu Generování tokenů SAS.

Použití zásad sdíleného přístupu pro přístup jménem zařízení

Když vytvoříte token ze zásad sdíleného přístupu, nastavte skn pole na název zásady. Tato zásada musí udělit oprávnění zařízení Připojení.

Mezi dva hlavní scénáře použití zásad sdíleného přístupu pro přístup k funkcím zařízení patří:

  • brány cloudového protokolu,
  • služby tokenů používané k implementaci vlastních schémat ověřování.

Vzhledem k tomu, že zásady sdíleného přístupu můžou potenciálně udělit přístup pro připojení jako jakékoli zařízení, je důležité při vytváření tokenů SAS použít správný identifikátor URI prostředku. Toto nastavení je zvlášť důležité pro služby tokenů, které musí nastavit obor tokenu na konkrétní zařízení pomocí identifikátoru URI prostředku. Tento bod je méně relevantní pro brány protokolů, protože už mediují provoz pro všechna zařízení.

Například služba tokenů používající předem vytvořenou zásadu sdíleného přístupu s názvem zařízení vytvoří token s následujícími parametry:

  • identifikátor URI prostředku: {IoT hub name}.azure-devices.net/devices/{device id},
  • podpisový klíč: jeden z klíčů device zásad,
  • název zásady: device,
  • kdykoliv vyprší.

Například následující kód vytvoří token SAS v Node.js:

var endpoint ="myhub.azure-devices.net/devices/device1";
var policyName = 'device';
var policyKey = '...';

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

Výsledkem, který uděluje přístup ke všem funkcím zařízení 1, by byl:

SharedAccessSignature sr=myhub.azure-devices.net%2fdevices%2fdevice1&sig=13y8ejUk2z7PLmvtwR5RqlGBOVwiq7rQR3WZ5xZX3N4%3D&se=1456971697&skn=device

Brána protokolu může použít stejný token pro všechna zařízení nastavením identifikátoru URI prostředku na myhub.azure-devices.net/devices.

Další příklady najdete v tématu Generování tokenů SAS.

Vytvoření služby tokenů pro integraci stávajících zařízení

Registr identit služby IoT Hub můžete použít ke konfiguraci přihlašovacích údajů zabezpečení jednotlivých zařízení nebo modulů a řízení přístupu pomocí tokenů. Pokud už řešení IoT má vlastní registr identit nebo schéma ověřování, zvažte vytvoření služby tokenů pro integraci této infrastruktury se službou IoT Hub. Tímto způsobem můžete ve svém řešení použít další funkce IoT.

Služba tokenů je vlastní cloudová služba. Používá zásady sdíleného přístupu služby IoT Hub se zařízením Připojení oprávnění k vytváření tokenů vymezených zařízením nebo modulů. Tyto tokeny umožňují zařízení nebo modulu připojit se k centru IoT.

Diagram znázorňující kroky vzoru služby tokenů

Tady jsou hlavní kroky modelu služby tokenů:

  1. Vytvořte zásadu sdíleného přístupu služby IoT Hub pomocí oprávnění Zařízení Připojení pro centrum IoT. Tuto zásadu můžete vytvořit na webu Azure Portal nebo programově. Služba tokenů používá tuto zásadu k podepsání tokenů, které vytvoří.

  2. Když zařízení nebo modul potřebuje přístup k centru IoT, vyžádá si podepsaný token ze služby tokenů. Zařízení se může ověřit pomocí vlastního schématu registru identit nebo ověřování a určit identitu zařízení/modulu, kterou služba tokenu používá k vytvoření tokenu.

  3. Služba tokenů vrátí token. Token se vytvoří pomocí nebo /devices/{deviceId}/devices/{deviceId}/modules/{moduleId} jako resourceURI, se deviceId zařízením, které se ověřuje, a moduleId jako modul, který se ověřuje. Služba tokenů používá k vytvoření tokenu zásadu sdíleného přístupu.

  4. Zařízení nebo modul používá token přímo se službou IoT Hub.

Poznámka:

Token ve službě tokenů můžete vytvořit pomocí třídy .NET SharedAccessSignatureBuilder nebo třídy Java IotHubServiceSasToken .

Služba tokenů může nastavit vypršení platnosti tokenu podle potřeby. Po vypršení platnosti tokenu ioT Hub odsadí připojení zařízení/modulu. Potom musí zařízení nebo modul požádat o nový token ze služby tokenů. Krátká doba vypršení platnosti zvyšuje zatížení zařízení nebo modulu i služby tokenů.

Aby se zařízení nebo modul připojily k vašemu centru, musíte ho přesto přidat do registru identit služby IoT Hub, i když používá token, a ne klíč pro připojení. Proto můžete dál používat řízení přístupu jednotlivých zařízení nebo modulů povolením nebo zakázáním identit zařízení a modulů v registru identit. Tento přístup zmírní rizika používání tokenů s dlouhou dobou vypršení platnosti.

Porovnání s vlastní bránou

Model služby tokenů je doporučený způsob implementace vlastního schématu registru identit nebo ověřování ve službě IoT Hub. Tento model se doporučuje, protože IoT Hub stále zpracovává většinu provozu řešení. Pokud je však vlastní schéma ověřování tak propojené s protokolem, můžete k zpracování veškerého provozu vyžadovat vlastní bránu . Příkladem takového scénáře je použití protokolu TLS (Transport Layer Security) a předsdílené klíče (PSK). Další informace najdete v tématu Jak se dá zařízení IoT Edge používat jako brána.

Generování tokenů SAS

Sady AZURE IoT SDK automaticky generují tokeny, ale některé scénáře vyžadují, abyste tokeny SAS vygenerovali a používali přímo, včetně následujících:

  • Přímé použití povrchů MQTT, AMQP nebo HTTPS.

  • Implementace modelu služby tokenů, jak je vysvětleno v části Vytvoření služby tokenu.

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 podepsaný symetrickým klíčem identity zařízení uděluje oprávnění pouze zařízení Připojení pro přidruženou identitu zařízení.

Tato část obsahuje příklady generování tokenů SAS v různých jazycích kódu. Tokeny SAS můžete také vygenerovat pomocí příkazu rozšíření rozhraní příkazového řádku az iot hub generate-sas-token nebo rozšíření Azure IoT Hub pro Visual Studio Code.

Struktura tokenů SAS

Token SAS má následující formát:

SharedAccessSignature sig={signature-string}&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 provádění výpočtů HMAC-SHA256.
{resourceURI} 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 Hub (bez protokolu). Tokeny SAS udělené back-endovým službám jsou vymezeny na úrovni centra IoT; například myHub.azure-devices.net. Tokeny SAS udělené zařízením musí být vymezeny na jednotlivá zařízení; například myHub.azure-devices.net/devices/device1.
{expiry} Řetězce UTF8 pro počet sekund od epochy 00:00:00 UTC dne 1.
{URL-encoded-resourceURI} Malé kódování adresy URL identifikátoru URI prostředku s menším písmenem
{policyName} Název zásady sdíleného přístupu, na kterou tento token odkazuje. Chybí, pokud token odkazuje na přihlašovací údaje registru zařízení.

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í kód vygeneruje token SAS pomocí identifikátoru URI prostředku, podpisového klíče, názvu zásady a období vypršení platnosti. 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', 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;
};

Specifika protokolů

Každý podporovaný protokol, například MQTT, AMQP a HTTPS, přenáší tokeny různými způsoby.

Při použití MQTT má paket CONNECT id zařízení jako ClientId, {iothubhostname}/{deviceId} v poli Uživatelské jméno a token SAS v poli Heslo. {iothubhostname} by měl být úplný název CName centra IoT (například myhub.azure-devices.net).

Při použití AMQP služba IoT Hub podporuje zabezpečení založené na deklaracích identit SASL PLAIN a AMQP.

Pokud používáte zabezpečení založené na deklaracích identity AMQP, standard určuje způsob přenosu těchto tokenů.

Pro SASL PLAIN může být uživatelské jméno :

  • {policyName}@sas.root.{iothubName} pokud používáte tokeny na úrovni centra IoT.
  • {deviceId}@sas.{iothubname} pokud používáte tokeny s oborem zařízení.

V obou případech pole heslo obsahuje token, jak je popsáno ve struktuře tokenů SAS.

HTTPS implementuje ověřování zahrnutím platného tokenu do hlavičky žádosti o autorizaci .

Například uživatelské jméno (Id zařízení se rozlišují malá a velká písmena): iothubname.azure-devices.net/DeviceId

Heslo (Token SAS můžete vygenerovat pomocí příkazu rozšíření rozhraní příkazového řádku az iot hub generate-sas-token nebo rozšíření Azure IoT Hubu pro Visual Studio Code):

SharedAccessSignature sr=iothubname.azure-devices.net%2fdevices%2fDeviceId&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501

Poznámka:

Sady SDK Azure IoT automaticky generují tokeny při připojování ke službě. V některých případech sady SDK Azure IoT nepodporují všechny protokoly ani všechny metody ověřování.

Zvláštní aspekty pro SASL PLAIN

Při použití SASL PLAIN s AMQP může klient, který se připojuje ke službě IoT Hub, použít pro každé připojení TCP jeden token. Po vypršení platnosti tokenu se připojení TCP odpojí od služby a aktivuje opětovné připojení. Toto chování, i když není problematické pro back-endovou aplikaci, je pro aplikaci zařízení škodlivé z následujících důvodů:

  • Brány se obvykle připojují jménem mnoha zařízení. Při použití SASL PLAIN musí vytvořit jedinečné připojení TCP pro každé zařízení, které se připojuje k centru IoT. Tento scénář výrazně zvyšuje spotřebu napájecích a síťových prostředků a zvyšuje latenci každého připojení zařízení.

  • Zařízení s omezenými prostředky mají nepříznivý vliv na zvýšené využití prostředků k opětovnému připojení po vypršení platnosti každého tokenu.

Další kroky

Teď, když jste se naučili řídit přístup ke službě IoT Hub, může vás zajímat následující témata příručky pro vývojáře ioT Hubu: