Udostępnij przez


Kontrolowanie dostępu do usługi Azure IoT Hub Device Provisioning Service (DPS) przy użyciu sygnatur dostępu współdzielonego i tokenów zabezpieczających

W tym artykule opisano dostępne opcje zabezpieczania usługi Azure IoT Hub Device Provisioning Service (DPS). Usługa aprowizacji używa uwierzytelniania i uprawnień w celu udzielenia dostępu do każdego punktu końcowego. Uprawnienia umożliwiają procesowi uwierzytelniania ograniczenie dostępu do wystąpienia usługi w zależności od funkcjonalności.

W tym artykule omówiono następujące zagadnienia:

  • Proces uwierzytelniania i tokeny używane przez usługę aprowizacji do weryfikowania uprawnień zarówno względem interfejsów API REST usługi , jak i interfejsów API REST urządzeń.

  • Różne uprawnienia, które można udzielić aplikacji serwera w celu uzyskania dostępu do API usługi.

Uwierzytelnianie

Interfejs API urządzeń obsługuje uwierzytelnianie urządzeń oparte na kluczach i certyfikatach X.509.

Interfejs API usługi obsługuje uwierzytelnianie oparte na kluczach dla aplikacji zaplecza.

W przypadku korzystania z uwierzytelniania opartego na kluczach usługa Device Provisioning Service używa tokenów zabezpieczających do uwierzytelniania usług, aby uniknąć wysyłania kluczy w sieci. Ponadto tokeny zabezpieczające są ograniczone w czasie ważności i zakresie. Zestawy SDK aprowizacji urządzeń usługi Azure IoT Hub automatycznie generują tokeny bez konieczności specjalnej konfiguracji.

W niektórych przypadkach może być konieczne bezpośrednie użycie interfejsów API REST usługi HTTP Device Provisioning Service bez korzystania z zestawów SDK. W poniższych sekcjach opisano sposób uwierzytelniania bezpośrednio względem interfejsów API REST.

Uwierzytelnianie interfejsu API urządzenia

interfejsu API urządzeń jest używany przez urządzenia do zaświadczania o usłudze Device Provisioning i odbieraniu połączenia usługi IoT Hub.

Uwaga

Aby móc odbierać uwierzytelnione połączenie, urządzenia muszą najpierw być zarejestrowane w usłudze Device Provisioning Service za pośrednictwem rejestracji. Użyj interfejsu API usługi, aby programowo zarejestrować urządzenie za pośrednictwem rejestracji.

Urządzenie musi uwierzytelniać się w API urządzenia w ramach procesu provisioningu. Metoda używana przez urządzenie do uwierzytelniania jest definiowana podczas konfigurowania grupy rejestracji lub rejestracji indywidualnej. Niezależnie od metody uwierzytelniania, urządzenie musi wykonać żądanie HTTPS PUT do następującego URL-a, aby się skonfigurować.

    https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01

W przypadku korzystania z uwierzytelniania opartego na kluczach token zabezpieczający jest przekazywany w nagłówku żądania autoryzacji HTTP w następującym formacie:

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

Struktura tokenów zabezpieczających na potrzeby uwierzytelniania opartego na kluczach

Token zabezpieczający jest przekazywany w nagłówku żądania HTTP Authorization w następującym formacie:

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

Oczekiwane wartości to:

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.
{expiry} Ciągi znaków UTF8 reprezentujące liczbę sekund od początku ery 00:00:00 UTC 1 stycznia 1970 r.
{URL-encoded-resourceURI} Kodowanie URL z użyciem małych liter dla {ID_Scope}/registrations/{registration_id}
{policyName} W przypadku interfejsu API urządzenia ta zasada jest zawsze "rejestracja".

Poniższy fragment kodu języka Python przedstawia funkcję o nazwie generate_sas_token, która oblicza token z danych wejściowych uri, key, policy_name, expiry dla rejestracji indywidualnej przy użyciu typu uwierzytelniania klucza symetrycznego.


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"))

Wynik powinien przypominać następujące dane wyjściowe:


SharedAccessSignature sr=myIdScope%2Fregistrations%2Fmydeviceregistrationid&sig=SDpdbUNk%2F1DSjEpeb29BLVe6gRDZI7T41Y4BPsHHoUg%3D&se=1630175722&skn=registration 

W poniższym przykładzie pokazano, jak sygnatura dostępu współdzielonego jest następnie używana do uwierzytelniania za pomocą interfejsu API urządzenia.


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 

Jeśli korzystasz z symetrycznej grupy rejestracyjnej, musisz najpierw wygenerować klucz device symmetric przy użyciu klucza grupy rejestracyjnej. Użyj podstawowego lub pomocniczego klucza grupy rejestracji, aby obliczyć HMAC-SHA256 identyfikatora rejestracji dla urządzenia. Wynik jest następnie konwertowany na format Base64 w celu uzyskania pochodnego klucza urządzenia. Aby wyświetlić przykłady kodu, zobacz Tworzenie klucza urządzenia. Po utworzeniu klucza symetrycznego urządzenia możesz zarejestrować urządzenie przy użyciu poprzednich przykładów.

Ostrzeżenie

Aby uniknąć dołączania klucza głównego grupy w kodzie urządzenia, proces wyprowadzania klucza urządzenia powinien być wykonywany poza urządzeniem.

Uwierzytelnianie oparte na certyfikatach

Jeśli skonfigurujesz indywidualną rejestrację lub grupę rejestracji na potrzeby uwierzytelniania opartego na certyfikatach X.509, urządzenie musi użyć wystawionego certyfikatu X.509, aby potwierdzić interfejs API urządzenia. Zapoznaj się z następującymi artykułami dotyczącymi konfigurowania rejestracji i generowania certyfikatu urządzenia.

Po skonfigurowaniu rejestracji i wystawieniu certyfikatu urządzenia w poniższym przykładzie pokazano, jak uwierzytelniać się w interfejsie API urządzenia przy użyciu certyfikatu X.509 urządzenia.


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 

Uwierzytelnianie API serwisu

Interfejs API usługi służy do pobierania stanu rejestracji i usuwania rejestracji urządzeń. Usługa jest również używana przez aplikacje zaplecza do programowego zarządzania zarówno grupami rejestracji , jak i poszczególnymi grupami . Interfejs API usługi obsługuje uwierzytelnianie oparte na kluczach dla aplikacji zaplecza.

Aby uzyskać dostęp do dowolnego punktu końcowego interfejsu API usługi, musisz mieć odpowiednie uprawnienia. Na przykład aplikacja zaplecza musi zawierać token zawierający poświadczenia zabezpieczeń wraz z każdym komunikatem wysyłanym do usługi.

Usługa Azure IoT Hub Device Provisioning udziela dostępu do punktów końcowych, weryfikując token względem zasad dostępu współdzielonego. Poświadczenia zabezpieczeń, takie jak klucze symetryczne, nigdy nie są wysyłane za pośrednictwem przewodu.

Kontrola dostępu i uprawnienia

Uprawnienia można przyznać w następujący sposób:

  • zasady autoryzacji dostępu współdzielonego. Zasady dostępu współdzielonego mogą udzielać dowolnej kombinacji uprawnień . Zasady można zdefiniować w witrynie Azure Portallub programowo przy użyciu interfejsów API REST usługi Device Provisioning Service. Nowo utworzona usługa aprowizacji ma następujące zasady domyślne:

  • provisioningserviceowner: Polityka z wszystkimi możliwymi uprawnieniami. Aby uzyskać szczegółowe informacje, sprawdź uprawnienia .

Uwaga

Dostawca zasobów usługi Device Provisioning Service jest zabezpieczony za pośrednictwem subskrypcji platformy Azure, podobnie jak wszyscy dostawcy w usłudze Azure Resource Manager.

Aby uzyskać więcej informacji na temat tworzenia i używania tokenów zabezpieczających, zobacz następną sekcję.

Protokół HTTP jest jedynym obsługiwanym protokołem i implementuje uwierzytelnianie przez dołączenie prawidłowego tokenu w nagłówku żądania authorization.

Przykład

SharedAccessSignature sr = 
   mydps.azure-devices-provisioning.net&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501&skn=provisioningserviceowner`\

Uwaga

Zestawy SDK usługi Azure IoT Hub Device Provisioning automatycznie generują tokeny podczas nawiązywania połączenia z usługą.

Tokeny zabezpieczające

Usługa Device Provisioning Service używa tokenów zabezpieczających do uwierzytelniania usług w celu uniknięcia wysyłania kluczy w sieci. Ponadto tokeny zabezpieczające są ograniczone w czasie ważności i zakresie. Zestawy SDK usługi Azure IoT Hub Device Provisioning automatycznie generują tokeny bez konieczności specjalnej konfiguracji. Niektóre scenariusze wymagają bezpośredniego generowania i używania tokenów zabezpieczających. Takie scenariusze obejmują bezpośrednie użycie powierzchni HTTP.

Struktura tokenu zabezpieczającego

Tokeny zabezpieczające służą do udzielania ograniczonego czasowo dostępu usługom do określonych funkcji w usłudze IoT Hub Device Provisioning Service. Aby uzyskać autoryzację w celu nawiązania połączenia z usługą aprowizacji, usługi muszą wysyłać tokeny zabezpieczające podpisane przy użyciu dostępu współdzielonego lub klucza symetrycznego.

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 zabezpieczający ma następujący format:

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

Poniżej przedstawiono 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.
{wygaśnięcie} Ciągi znaków UTF8 reprezentujące liczbę sekund od początku ery 00:00:00 UTC 1 stycznia 1970 r.
{Zakodowany w URL zasób-URI} Kodowanie URL małymi literami dla identyfikatora URI zasobu zapisanym małymi literami. Prefiks identyfikatora URI (według segmentu) punktów końcowych, do których można uzyskać dostęp za pomocą tego tokenu, począwszy od nazwy hosta usługi IoT Device Provisioning Service (bez protokołu). Na przykład mydps.azure-devices-provisioning.net.
{policyName} Nazwa zasad dostępu współdzielonego, do których odwołuje się ten token.

Uwaga

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

Poniższy fragment kodu Node.js przedstawia funkcję o nazwie generateSasToken, która oblicza token z danych wejściowych resourceUri, signingKey, policyName, expiresInMins. 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', 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;
};

Dla porównania równoważny kod języka Python do wygenerowania tokenu zabezpieczającego to:

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)

Uwaga

Ponieważ czas ważności tokenu jest weryfikowany na maszynach usługi IoT Device Provisioning Service, dryf na zegarze maszyny, która generuje token, musi być minimalny.

Używanie tokenów zabezpieczających ze składników usługi

Składniki usługi mogą generować tokeny zabezpieczające tylko przy użyciu zasad dostępu współdzielonego, udzielając odpowiednich uprawnień, jak wyjaśniono wcześniej.

Oto funkcje usługi uwidocznione w punktach końcowych:

Punkt końcowy Funkcjonalność
{your-service}.azure-devices-provisioning.net/enrollments Udostępnia operacje rejestracji urządzeń w usłudze Device Provisioning Service.
{your-service}.azure-devices-provisioning.net/enrollmentGroups Udostępnia operacje zarządzania grupami rejestracji urządzeń.
{your-service}.azure-devices-provisioning.net/registrations/{id} Udostępnia operacje pobierania stanu rejestracji urządzeń i zarządzania nimi.

Na przykład usługa wygenerowana przy użyciu wstępnie utworzonych zasad dostępu współdzielonego o nazwie enrollmentread tworzy token z następującymi parametrami:

  • URI zasobu: {mydps}.azure-devices-provisioning.net,
  • klucz podpisywania: jeden z kluczy polityki enrollmentread,
  • nazwa polityki: enrollmentread,
  • dowolny czas wygaśnięcia.backn
var endpoint ="mydps.azure-devices-provisioning.net";
var policyName = 'enrollmentread'; 
var policyKey = '...';

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

Wynikiem, który przyzna dostęp do odczytu wszystkich rekordów rejestracji, będzie:

SharedAccessSignature sr=mydps.azure-devices-provisioning.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=enrollmentread

Zestawy SDK i przykłady

Artykuły referencyjne:

Poniższe artykuły referencyjne zawierają więcej informacji na temat kontrolowania dostępu do usługi IoT Device Provisioning Service.

Uprawnienia usługi „Device Provisioning Service”

W poniższej tabeli wymieniono uprawnienia, których można użyć do kontrolowania dostępu do usługi IoT Device Provisioning Service.

Pozwolenie Notatki
ServiceConfig Udziela dostępu w celu zmiany konfiguracji usługi.
To uprawnienie jest używane przez usługi zaplecza chmury.
EnrollmentRead Udziela dostępu do odczytu rejestracji urządzeń oraz grup rejestracyjnych.
To uprawnienie jest używane przez usługi zaplecza chmury.
EnrollmentWrite Przyznaje uprawnienia do zapisu w rejestracjach urządzeń i grupach rejestracji.
To uprawnienie jest używane przez usługi zaplecza chmury.
RegistrationStatusRead Przyznaje uprawnienia do odczytu rejestracji urządzenia.
To uprawnienie jest używane przez usługi zaplecza chmury.
StatusRejestracjiZapisz Umożliwia usunięcie dostępu do stanu rejestracji urządzenia.
To uprawnienie jest używane przez usługi zaplecza chmury.