Ří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í ServiceConnect |
device | Oprávnění DeviceConnect |
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í:
Oprávnění ServiceConnect používá back-endové cloudové služby 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í používají oprávnění DeviceConnect a udělují 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ělují oprávnění DeviceConnect 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é oprávněním ServiceConnect . 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 získání oprávnění DeviceConnect se službou IoT Hub s tokeny SAS: použití symetrického klíče zařízení z registru identit nebo použití sdíleného přístupového klíče.
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í DeviceConnect .
Mezi dva hlavní scénáře použití zásad sdíleného přístupu pro přístup k funkcím zařízení patří:
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ásadu sdíleného přístupu služby IoT Hub s oprávněním DeviceConnect k vytvoření tokenů v oboru zařízení nebo tokenů vymezených modulem. Tyto tokeny umožňují zařízení nebo modulu připojit se k centru IoT.
Tady jsou hlavní kroky modelu služby tokenů:
Vytvořte zásadu sdíleného přístupu služby IoT Hub s oprávněním DeviceConnect 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ří.
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.
Služba tokenů vrátí token. Token se vytvoří pomocí nebo
/devices/{deviceId}
/devices/{deviceId}/modules/{moduleId}
jakoresourceURI
, sedeviceId
zařízením, které se ověřuje, amoduleId
jako modul, který se ověřuje. Služba tokenů používá k vytvoření tokenu zásadu sdíleného přístupu.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í DeviceConnect pouze 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: