Kontrolowanie dostępu do usługi IoT Hub przy użyciu sygnatur dostępu współdzielonego

Usługa IoT Hub używa tokenów sygnatury dostępu współdzielonego (SAS) do uwierzytelniania urządzeń i usług w celu uniknięcia wysyłania kluczy w sieci. Tokeny SAS służą do udzielania ograniczonego czasowo dostępu do urządzeń i usług określonym funkcjom w usłudze IoT Hub. Aby uzyskać autoryzację w celu nawiązania połączenia z usługą IoT Hub, urządzenia i usługi muszą wysyłać tokeny SAS podpisane przy użyciu klucza dostępu współdzielonego lub klucza symetrycznego. Klucze symetryczne są przechowywane z tożsamością urządzenia w rejestrze tożsamości.

W tym artykule przedstawiono następujące elementy:

  • Różne uprawnienia, które można udzielić klientowi w celu uzyskania dostępu do centrum IoT.
  • Tokeny usługi IoT Hub używają do weryfikowania uprawnień.
  • Określanie zakresu poświadczeń w celu ograniczenia dostępu do określonych zasobów.
  • Niestandardowe mechanizmy uwierzytelniania urządzeń korzystające z istniejących rejestrów tożsamości urządzeń lub schematów uwierzytelniania.

Uwaga

Niektóre funkcje wymienione w tym artykule, takie jak obsługa komunikatów w chmurze, bliźniacze reprezentacje urządzeń i zarządzanie urządzeniami, są dostępne tylko w warstwie Standardowa usługi IoT Hub. Aby uzyskać więcej informacji na temat warstw podstawowej i standardowej/bezpłatnej usługi IoT Hub, zobacz Wybieranie odpowiedniej warstwy usługi IoT Hub dla rozwiązania.

Usługa IoT Hub używa uprawnień w celu udzielenia dostępu do każdego punktu końcowego centrum IoT. Uprawnienia ograniczają dostęp do centrum IoT Na podstawie funkcji. Aby uzyskać dostęp do dowolnego z punktów końcowych usługi IoT Hub, musisz mieć odpowiednie uprawnienia. Na przykład urządzenie musi zawierać token zawierający poświadczenia zabezpieczeń wraz z każdym komunikatem wysyłanym do usługi IoT Hub. Jednak klucze podpisywania, takie jak klucze symetryczne urządzenia, nigdy nie są wysyłane za pośrednictwem przewodu.

Uwierzytelnianie i autoryzacja

Uwierzytelnianie to proces potwierdzania, że jesteś tym, kim jesteś. Uwierzytelnianie weryfikuje tożsamość użytkownika lub urządzenia w usłudze IoT Hub. Czasami jest skracany do AuthN. Autoryzacja to proces potwierdzania uprawnień dla uwierzytelnionego użytkownika lub urządzenia w usłudze IoT Hub. Określa ona zasoby i polecenia, do których masz dostęp, oraz czynności, które można wykonać za pomocą tych zasobów i poleceń. Autoryzacja jest czasami skracana do AuthZ.

W tym artykule opisano uwierzytelnianie i autoryzację przy użyciu sygnatur dostępu współdzielonego, które umożliwiają grupowanie uprawnień i przyznawanie ich aplikacjom przy użyciu kluczy dostępu i podpisanych tokenów zabezpieczających. Możesz również użyć kluczy symetrycznych lub kluczy dostępu współdzielonego do uwierzytelniania urządzenia w usłudze IoT Hub. Tokeny SAS zapewniają uwierzytelnianie dla każdego wywołania wykonanego przez urządzenie w usłudze IoT Hub przez skojarzenie klucza symetrycznego z każdym wywołaniem.

Kontrola dostępu i uprawnienia

Użyj zasad dostępu współdzielonego dla dostępu na poziomie centrum IoT i użyj poświadczeń poszczególnych urządzeń, aby ograniczyć dostęp tylko do tego urządzenia.

Zasady dostępu współdzielonego na poziomie centrum IoT

Zasady dostępu współdzielonego mogą udzielać dowolnej kombinacji uprawnień. Zasady można definiować w witrynie Azure Portal programowo przy użyciu interfejsów API REST zasobów usługi IoT Hub lub polecenia az iot hub policy interfejsu wiersza polecenia platformy Azure. Nowo utworzone centrum IoT ma następujące zasady domyślne:

Zasady dostępu współdzielonego Uprawnienia
iothubowner Wszystkie uprawnienia
service Uprawnienia usługi Połączenie
device Uprawnienia urządzenia Połączenie
registryRead Uprawnienia RegistryRead
registryReadWrite Uprawnienia RegistryRead i RegistryWrite

Aby kontrolować dostęp do centrum IoT Hub, możesz użyć następujących uprawnień:

  • Uprawnienie Service Połączenie jest używane przez usługi w chmurze zaplecza i udziela następującego dostępu:

    • Dostęp do punktów końcowych komunikacji i monitorowania usług w chmurze.
    • Odbieranie komunikatów z urządzenia do chmury, wysyłanie komunikatów z chmury do urządzenia i pobieranie odpowiednich potwierdzenia dostarczenia.
    • Pobieranie potwierdzenia dostarczania dla przekazywania plików.
    • Uzyskiwanie dostępu do bliźniaczych reprezentacji w celu aktualizowania tagów i żądanych właściwości, pobierania zgłoszonych właściwości i uruchamiania zapytań.
  • Uprawnienie Urządzenie Połączenie jest używane przez urządzenia i udziela następującego dostępu:

    • Dostęp do punktów końcowych z dostępem do urządzeń.
    • Wysyłanie komunikatów z urządzenia do chmury i odbieranie komunikatów z chmury do urządzenia.
    • Wykonaj przekazywanie plików.
    • Otrzymywanie powiadomień o żądanej właściwości bliźniaczej reprezentacji urządzenia i aktualizowanie zgłoszonych właściwości bliźniaczej reprezentacji urządzenia.
  • Uprawnienie RegistryRead jest używane przez usługi w chmurze zaplecza i udziela następującego dostępu:

    • Odczyt dostępu do rejestru tożsamości. Aby uzyskać więcej informacji, zobacz Rejestr tożsamości.
  • Uprawnienie RegistryReadWrite jest używane przez usługi w chmurze zaplecza i udziela następującego dostępu:

    • Dostęp do odczytu i zapisu w rejestrze tożsamości. Aby uzyskać więcej informacji, zobacz Rejestr tożsamości.

Poświadczenia zabezpieczeń poszczególnych urządzeń

Każde centrum IoT ma rejestr tożsamości, który przechowuje informacje o urządzeniach i modułach, które mogą się z nim łączyć. Aby urządzenie lub moduł mógł nawiązać połączenie, w rejestrze tożsamości centrum IoT musi istnieć wpis dla tego urządzenia lub modułu. Urządzenie lub moduł uwierzytelnia się w centrum IoT na podstawie poświadczeń przechowywanych w rejestrze tożsamości.

Podczas rejestrowania urządzenia w celu korzystania z uwierzytelniania tokenu SAS urządzenie otrzymuje dwa klucze symetryczne. Klucze symetryczne przyznają uprawnienie Urządzenie Połączenie dla skojarzonej tożsamości urządzenia.

Używanie tokenów SAS z usług

Usługi mogą generować tokeny SAS przy użyciu zasad dostępu współdzielonego, które definiują odpowiednie uprawnienia, jak wyjaśniono wcześniej w sekcji Kontrola dostępu i uprawnienia .

Na przykład usługa korzystająca ze wstępnie utworzonych zasad dostępu współdzielonego o nazwie registryRead tworzy token z następującymi parametrami:

  • identyfikator URI zasobu: {IoT hub name}.azure-devices.net,
  • klucz podpisywania: jeden z kluczy registryRead zasad,
  • nazwa zasad: registryRead,
  • dowolnego czasu wygaśnięcia.

Na przykład poniższy kod tworzy token SAS w Node.js:

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

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

Wynikiem, który udziela dostępu do odczytu wszystkich tożsamości urządzeń w rejestrze tożsamości, będzie:

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

Aby uzyskać więcej przykładów, zobacz Generowanie tokenów SAS.

W przypadku usług tokeny SAS udzielają uprawnień tylko na poziomie usługi IoT Hub. Oznacza to, że usługa uwierzytelniająca się przy użyciu tokenu na podstawie zasad usługi będzie mogła wykonywać wszystkie operacje przyznane przez usługę Połączenie uprawnienia. Operacje te obejmują odbieranie komunikatów z urządzenia do chmury, wysyłanie komunikatów z chmury do urządzenia itd. Jeśli chcesz udzielić bardziej szczegółowego dostępu do usług, na przykład ograniczając usługę tylko do wysyłania komunikatów z chmury do urządzeń, możesz użyć identyfikatora Entra firmy Microsoft. Aby dowiedzieć się więcej, zobacz Uwierzytelnianie za pomocą identyfikatora Entra firmy Microsoft.

Używanie tokenów SAS z urządzeń

Istnieją dwa sposoby uzyskiwania uprawnień urządzenia Połączenie za pomocą usługi IoT Hub z tokenami SAS: użyj symetrycznego klucza urządzenia z rejestru tożsamości lub użyj klucza dostępu współdzielonego.

Wszystkie funkcje dostępne z urządzeń są udostępniane zgodnie z projektem w punktach końcowych z prefiksem /devices/{deviceId}.

Punkty końcowe dostępne dla urządzeń to (niezależnie od protokołu):

Punkt końcowy Funkcje
{iot hub name}/devices/{deviceId}/messages/events Wysyłanie komunikatów z urządzenia do chmury.
{iot hub name}/devices/{deviceId}/messages/devicebound Odbieranie komunikatów z chmury do urządzenia.

Używanie klucza symetrycznego w rejestrze tożsamości

W przypadku użycia klucza symetrycznego tożsamości urządzenia w celu wygenerowania tokenu element policyName (skn) tokenu zostanie pominięty.

Na przykład token utworzony w celu uzyskania dostępu do wszystkich funkcji urządzenia powinien mieć następujące parametry:

  • identyfikator URI zasobu: {IoT hub name}.azure-devices.net/devices/{device id},
  • klucz podpisywania {device id} : dowolny klucz symetryczny dla tożsamości,
  • brak nazwy zasad,
  • dowolnego czasu wygaśnięcia.

Na przykład poniższy kod tworzy token SAS w Node.js:

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

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

Wynikiem, który udziela dostępu do wszystkich funkcji urządzenia device1, będzie:

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

Aby uzyskać więcej przykładów, zobacz Generowanie tokenów SAS.

Używanie zasad dostępu współdzielonego do uzyskiwania dostępu w imieniu urządzenia

Podczas tworzenia tokenu na podstawie zasad dostępu współdzielonego ustaw skn pole na nazwę zasad. Te zasady muszą przyznać uprawnienie Urządzenie Połączenie.

Dwa główne scenariusze używania zasad dostępu współdzielonego w celu uzyskania dostępu do funkcji urządzeń to:

Ponieważ zasady dostępu współdzielonego mogą potencjalnie udzielić dostępu w celu nawiązania połączenia jako dowolnego urządzenia, ważne jest, aby podczas tworzenia tokenów SAS używać poprawnego identyfikatora URI zasobu. To ustawienie jest szczególnie ważne w przypadku usług tokenów, które muszą określać zakres tokenu dla określonego urządzenia przy użyciu identyfikatora URI zasobu. Ten punkt jest mniej istotny dla bram protokołów, ponieważ już mediating ruchu dla wszystkich urządzeń.

Na przykład usługa tokenu korzystająca ze wstępnie utworzonych zasad dostępu współdzielonego o nazwie urządzenie utworzy token z następującymi parametrami:

  • identyfikator URI zasobu: {IoT hub name}.azure-devices.net/devices/{device id},
  • klucz podpisywania: jeden z kluczy device zasad,
  • nazwa zasad: device,
  • dowolnego czasu wygaśnięcia.

Na przykład poniższy kod tworzy token SAS w Node.js:

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

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

Wynikiem, który udziela dostępu do wszystkich funkcji urządzenia device1, będzie:

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

Brama protokołu może używać tego samego tokenu dla wszystkich urządzeń, ustawiając identyfikator URI zasobu na myhub.azure-devices.net/devices.

Aby uzyskać więcej przykładów, zobacz Generowanie tokenów SAS.

Tworzenie usługi tokenu w celu zintegrowania istniejących urządzeń

Za pomocą rejestru tożsamości usługi IoT Hub można skonfigurować poświadczenia zabezpieczeń poszczególnych urządzeń lub poszczególnych modułów oraz kontrolę dostępu przy użyciu tokenów. Jeśli rozwiązanie IoT ma już niestandardowy rejestr tożsamości i/lub schemat uwierzytelniania, rozważ utworzenie usługi tokenu w celu zintegrowania tej infrastruktury z usługą IoT Hub. W ten sposób możesz użyć innych funkcji IoT w swoim rozwiązaniu.

Usługa tokenu to niestandardowa usługa w chmurze. Używa ona zasad dostępu współdzielonego usługi IoT Hub z uprawnieniem Urządzenie Połączenie do tworzenia tokenów o zakresie urządzenia lub w zakresie modułu. Te tokeny umożliwiają urządzeniu lub modułowi łączenie się z centrum IoT Hub.

Diagram przedstawiający kroki wzorca usługi tokenu.

Poniżej przedstawiono główne kroki wzorca usługi tokenu:

  1. Utwórz zasady dostępu współdzielonego usługi IoT Hub z uprawnieniem Urządzenie Połączenie dla centrum IoT. Te zasady można utworzyć w witrynie Azure Portal lub programowo. Usługa tokenu używa tych zasad do podpisywania tworzonych tokenów.

  2. Gdy urządzenie lub moduł musi uzyskać dostęp do centrum IoT, żąda podpisanego tokenu z usługi tokenu. Urządzenie może uwierzytelniać się za pomocą niestandardowego rejestru tożsamości/schematu uwierzytelniania w celu określenia tożsamości urządzenia/modułu używanej przez usługę tokenu do utworzenia tokenu.

  3. Usługa tokenu zwraca token. Token jest tworzony przy użyciu metody /devices/{deviceId} lub /devices/{deviceId}/modules/{moduleId} jako resourceURI, z deviceId urządzeniem, które jest uwierzytelniane i moduleId jako uwierzytelniony moduł. Usługa tokenu używa zasad dostępu współdzielonego do konstruowania tokenu.

  4. Urządzenie/moduł używa tokenu bezpośrednio z centrum IoT.

Uwaga

Możesz użyć klasy .NET SharedAccessSignatureBuilder lub klasy Java IotHubServiceSasToken , aby utworzyć token w usłudze tokenu.

Usługa tokenu może ustawić wygaśnięcie tokenu zgodnie z potrzebami. Po wygaśnięciu tokenu centrum IoT hub rozłącza połączenie urządzenia/modułu. Następnie urządzenie/moduł musi zażądać nowego tokenu z usługi tokenu. Krótki czas wygaśnięcia zwiększa obciążenie zarówno urządzenia/modułu, jak i usługi tokenu.

Aby urządzenie/moduł łączył się z centrum, należy nadal dodać go do rejestru tożsamości usługi IoT Hub — mimo że używa tokenu, a nie klucza do nawiązania połączenia. W związku z tym można nadal używać kontroli dostępu dla poszczególnych urządzeń/modułów, włączając lub wyłączając tożsamości urządzeń/modułów w rejestrze tożsamości. Takie podejście ogranicza ryzyko używania tokenów z długim czasem wygaśnięcia.

Porównanie z bramą niestandardową

Wzorzec usługi tokenu jest zalecanym sposobem implementacji niestandardowego rejestru tożsamości/schematu uwierzytelniania za pomocą usługi IoT Hub. Ten wzorzec jest zalecany, ponieważ usługa IoT Hub nadal obsługuje większość ruchu rozwiązania. Jeśli jednak niestandardowy schemat uwierzytelniania jest tak połączony z protokołem, może być konieczne przetworzenie całego ruchu przez bramę niestandardową. Przykładem takiego scenariusza jest użycie protokołu Transport Layer Security (TLS) i kluczy wstępnych (PSK). Aby uzyskać więcej informacji, zobacz How an IoT Edge device can be used as a gateway (Jak urządzenie usługi IoT Edge może być używane jako brama).

Generowanie tokenów SAS

Zestawy SDK usługi Azure IoT automatycznie generują tokeny, ale niektóre scenariusze wymagają generowania i bezpośredniego używania tokenów SAS, w tym:

  • Bezpośrednie użycie powierzchni MQTT, AMQP lub HTTPS.

  • Implementacja wzorca usługi tokenu, zgodnie z opisem w sekcji Tworzenie usługi tokenu.

Token podpisany przy użyciu klucza dostępu współdzielonego udziela dostępu do wszystkich funkcji skojarzonych z uprawnieniami zasad dostępu współdzielonego. Token podpisany przy użyciu klucza symetrycznego tożsamości urządzenia przyznaje tylko uprawnienie Urządzenie Połączenie dla skojarzonej tożsamości urządzenia.

Ta sekcja zawiera przykłady generowania tokenów SAS w różnych językach kodu. Tokeny SAS można również wygenerować za pomocą polecenia rozszerzenia interfejsu wiersza polecenia az iot hub generate-sas-token lub rozszerzenia usługi Azure IoT Hub dla programu Visual Studio Code.

Struktura tokenu SAS

Token SAS ma następujący format:

SharedAccessSignature sig={signature-string}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}

Oto oczekiwane wartości:

Wartość Opis
{signature} Ciąg podpisu HMAC-SHA256 formularza: {URL-encoded-resourceURI} + "\n" + expiry. Ważne: klucz jest dekodowany z base64 i używany jako klucz do wykonywania obliczeń HMAC-SHA256.
{resourceURI} Prefiks identyfikatora URI (według segmentu) punktów końcowych, do których można uzyskać dostęp za pomocą tego tokenu, rozpoczynając od nazwy hosta centrum IoT (bez protokołu). Tokeny SAS przyznane usługom zaplecza są ograniczone do poziomu centrum IoT Hub; na przykład myHub.azure-devices.net. Tokeny SAS przyznane urządzeniom muszą być ograniczone do poszczególnych urządzeń; na przykład myHub.azure-devices.net/devices/device1.
{wygaśnięcie} Ciągi UTF8 dla liczby sekund od epoki 00:00:00 UTC 1 stycznia 1970 r.
{Identyfikator URL zakodowany zasób} Kodowanie adresów URL małych liter identyfikatora URI zasobu małego liter
{policyName} Nazwa zasad dostępu współdzielonego, do których odwołuje się ten token. Nieobecny, jeśli token odwołuje się do poświadczeń rejestru urządzeń.

Prefiks identyfikatora URI jest obliczany według segmentu, a nie według znaku. Na przykład /a/b jest prefiksem , /a/b/c ale nie dla /a/bc.

Poniższy kod generuje token SAS przy użyciu identyfikatora URI zasobu, klucza podpisywania, nazwy zasad i okresu wygaśnięcia. W następnych sekcjach opisano sposób inicjowania różnych danych wejściowych dla różnych przypadków użycia 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;
};

Specyfika protokołu

Każdy obsługiwany protokół, taki jak MQTT, AMQP i HTTPS, transportuje tokeny na różne sposoby.

W przypadku korzystania z MQTT pakiet CONNECT ma identyfikator deviceId jako ClientId, {iothubhostname}/{deviceId} w polu Nazwa użytkownika i token SAS w polu Hasło. {iothubhostname} powinna być pełną nazwą CName centrum IoT (na przykład myhub.azure-devices.net).

W przypadku korzystania z protokołu AMQP usługa IoT Hub obsługuje zabezpieczenia oparte na oświadczeniach SASL i AMQP.

Jeśli używasz zabezpieczeń opartych na oświadczeniach amQP, standard określa sposób przesyłania tych tokenów.

W przypadku pliku SASL PLAIN nazwa użytkownika może być:

  • {policyName}@sas.root.{iothubName} w przypadku korzystania z tokenów na poziomie centrum IoT.
  • {deviceId}@sas.{iothubname} jeśli używasz tokenów o zakresie urządzenia.

W obu przypadkach pole hasła zawiera token, zgodnie z opisem w strukturze tokenu SAS.

Protokół HTTPS implementuje uwierzytelnianie, dołączając prawidłowy token w nagłówku żądania autoryzacji .

Na przykład nazwa użytkownika (w polu DeviceId jest uwzględniana wielkość liter): iothubname.azure-devices.net/DeviceId

Hasło (token SAS można wygenerować za pomocą polecenia rozszerzenia interfejsu wiersza polecenia az iot hub generate-sas-token lub rozszerzenia usługi Azure IoT Hub dla programu Visual Studio Code):

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

Uwaga

Zestawy SDK usługi Azure IoT automatycznie generują tokeny podczas nawiązywania połączenia z usługą. W niektórych przypadkach zestawy SDK usługi Azure IoT nie obsługują wszystkich protokołów ani wszystkich metod uwierzytelniania.

Uwagi specjalne dotyczące sygnatury dostępu współdzielonego (SASL PLAIN)

W przypadku korzystania z protokołu SASL PLAIN z protokołem AMQP klient łączący się z centrum IoT może używać jednego tokenu dla każdego połączenia TCP. Po wygaśnięciu tokenu połączenie TCP rozłącza się z usługą i wyzwala ponowne połączenie. To zachowanie, chociaż nie jest problematyczne dla aplikacji zaplecza, jest szkodliwe dla aplikacji urządzenia z następujących powodów:

  • Bramy zwykle łączą się w imieniu wielu urządzeń. W przypadku korzystania z protokołu SASL PLAIN muszą utworzyć odrębne połączenie TCP dla każdego urządzenia łączącego się z centrum IoT Hub. Ten scenariusz znacznie zwiększa zużycie energii i zasobów sieciowych oraz zwiększa opóźnienie każdego połączenia urządzenia.

  • Urządzenia z ograniczonymi zasobami mają negatywny wpływ na zwiększone wykorzystanie zasobów do ponownego nawiązania połączenia po wygaśnięciu tokenu.

Następne kroki

Teraz, gdy wiesz już, jak kontrolować dostęp do usługi IoT Hub, możesz zainteresować się następującymi tematami przewodników dla deweloperów usługi IoT Hub: