Steuern des Zugriffs auf den Azure IoT Hub Device Provisioning-DienstControl access to Azure IoT Hub Device Provisioning Service

In diesem Artikel werden die Optionen für den Schutz Ihres IoT Device Provisioning-Diensts beschrieben.This article describes the options for securing your IoT Device Provisioning service. Der Bereitstellungsdienst verwendet Berechtigungen, um Zugriff auf die einzelnen Endpunkte zu gewähren.The provisioning service uses permissions to grant access to each endpoint. Berechtigungen beschränken den Zugriff auf eine Dienstinstanz auf der Grundlage von Funktionen.Permissions limit the access to a service instance based on functionality.

Dieser Artikel beschreibt Folgendes:This article describes:

  • Die verschiedenen Berechtigungen, die Sie einer Back-End-App für den Zugriff auf Ihren Bereitstellungsdienst gewähren könnenThe different permissions that you can grant to a backend app to access your provisioning service.
  • Der Authentifizierungsvorgangs und die verwendeten Token zum Überprüfen der Berechtigungen.The authentication process and the tokens it uses to verify permissions.

VerwendungWhen to use

Sie benötigen entsprechende Berechtigungen für den Zugriff auf Bereitstellungsdienst-Endpunkte.You must have appropriate permissions to access any of the provisioning service endpoints. Beispiel: Eine Back-End-App muss jede Nachricht, die sie an den Dienst sendet, mit einem Token mit Sicherheitsanmeldeinformationen versehen.For example, a backend app must include a token containing security credentials along with every message it sends to the service.

Access Control und BerechtigungenAccess control and permissions

Sie können Berechtigungen auf folgende Weise gewähren:You can grant permissions in the following ways:

  • SAS-Autorisierungsrichtlinien:Shared access authorization policies. SAS-Richtlinien können eine beliebige Kombination von Berechtigungen gewähren.Shared access policies can grant any combination of permissions. Sie können Richtlinien im Azure-Portal oder programmgesteuert mithilfe der REST-APIs von Device Provisioning Service definieren.You can define policies in the Azure portal, or programmatically by using the Device Provisioning Service REST APIs. Ein neu erstellter Bereitstellungsdienst verfügt über folgende Standardrichtlinie:A newly created provisioning service has the following default policy:

  • provisioningserviceowner: Richtlinie mit sämtlichen Berechtigungen.provisioningserviceowner: Policy with all permissions.

Hinweis

Weitere Informationen finden Sie unter Berechtigungen.See permissions for detailed information.

AuthenticationAuthentication

Der Azure IoT Hub Device Provisioning-Dienst überprüft ein Token anhand der SAS-Richtlinien, um Zugriff auf Endpunkte zu gewähren.Azure IoT Hub Device Provisioning Service grants access to endpoints by verifying a token against the shared access policies. Sicherheitsanmeldeinformationen, beispielsweise symmetrische Schlüssel, werden niemals über eine physische Verbindung gesendet.Security credentials, such as symmetric keys, are never sent over the wire.

Hinweis

Der Device Provisioning Service-Ressourcenanbieter wird über Ihr Azure-Abonnement geschützt – ebenso wie alle Anbieter in Azure Resource Manager.The Device Provisioning Service resource provider is secured through your Azure subscription, as are all providers in the Azure Resource Manager.

Weitere Informationen zum Erstellen und Verwenden von Sicherheitstoken finden Sie im nächsten Abschnitt.For more information about how to construct and use security tokens, see the next section.

HTTP ist das einzige unterstützte Protokoll. Zur Implementierung der Authentifizierung wird ein gültiges Token in den Anforderungsheader Authorization eingeschlossen.HTTP is the only supported protocol, and it implements authentication by including a valid token in the Authorization request header.

BeispielExample

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

Hinweis

Die Azure IoT Device Provisioning Service SDKs generieren automatisch Token, wenn eine Verbindung mit dem Dienst hergestellt wird.The Azure IoT Device Provisioning Service SDKs automatically generate tokens when connecting to the service.

SicherheitstokenSecurity tokens

Der Device Provisioning-Dienst verwendet Sicherheitstoken zum Authentifizieren von Diensten, um das Senden von Schlüsseln über das Netzwerk zu vermeiden.The Device Provisioning Service uses security tokens to authenticate services to avoid sending keys on the wire. Darüber hinaus sind Sicherheitstoken im Hinblick auf Gültigkeitszeitraum und Bereich beschränkt.Additionally, security tokens are limited in time validity and scope. Azure IoT Device Provisioning Service SDKs generieren Token automatisch (also ohne spezielle Konfiguration).Azure IoT Device Provisioning Service SDKs automatically generate tokens without requiring any special configuration. In einigen Szenarien müssen Sie Sicherheitstoken allerdings direkt generieren und verwenden.Some scenarios do require you to generate and use security tokens directly. Zu solchen Szenarien zählt auch die direkte Verwendung der HTTP-Oberfläche.Such scenarios include the direct use of the HTTP surface.

Struktur von SicherheitstokenSecurity token structure

Sie verwenden Sicherheitstoken, um für Dienste zeitlich begrenzten Zugriff auf bestimmte Funktionen des IoT Device Provisioning-Diensts zu gewähren.You use security tokens to grant time-bounded access for services to specific functionality in IoT Device Provisioning Service. Zur Autorisierung der Verbindungsherstellung mit dem Bereitstellungsdienst müssen Dienste Sicherheitstoken senden, die entweder mit einem freigegebenen Zugriffsschlüssel oder mit einem symmetrischen Schlüssel signiert sind.To get authorization to connect to the provisioning service, services must send security tokens signed with either a shared access or symmetric key.

Ein mit einem Schlüssel für den gemeinsamen Zugriff signiertes Token gewährt Zugriff auf alle Funktionen, die den SAS-Richtlinienberechtigungen zugeordnet sind.A token signed with a shared access key grants access to all the functionality associated with the shared access policy permissions.

Das Sicherheitstoken weist das folgende Format auf:The security token has the following format:

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

Hier sind die erwarteten Werte:Here are the expected values:

valueValue BESCHREIBUNGDescription
{signature}{signature} Eine HMAC-SHA256-Signaturzeichenfolge in folgendem Format: {URL-encoded-resourceURI} + "\n" + expiry.An HMAC-SHA256 signature string of the form: {URL-encoded-resourceURI} + "\n" + expiry. Wichtig: Der Schlüssel wird aus Base64 decodiert und als Schlüssel für die HMAC-SHA256-Berechnung verwendet.Important: The key is decoded from base64 and used as key to perform the HMAC-SHA256 computation.
{expiry}{expiry} UTF8-Zeichenfolge, dargestellt als die Anzahl von Sekunden seit dem 1. Januar 1970 um 00:00:00 UTC.UTF8 strings for number of seconds since the epoch 00:00:00 UTC on 1 January 1970.
{URL-encoded-resourceURI}{URL-encoded-resourceURI} URL-Codierung des Ressourcen-URI (beides in Kleinbuchstaben).Lower case URL-encoding of the lower case resource URI. URI-Präfix (nach Segment) der Endpunkte, auf die mit diesem Token zugegriffen werden kann – beginnend mit dem Hostnamen des IoT Device Provisioning-Diensts (kein Protokoll).URI prefix (by segment) of the endpoints that can be accessed with this token, starting with host name of the IoT Device Provisioning Service (no protocol). Beispiel: mydps.azure-devices-provisioning.net.For example, mydps.azure-devices-provisioning.net.
{policyName}{policyName} Der Name der gemeinsam genutzten Zugriffsrichtlinie, auf die dieses Token verweist.The name of the shared access policy to which this token refers.

Hinweis zum Präfix: Das URI-Präfix wird nach Segment, nicht nach Zeichen berechnet.Note on prefix: The URI prefix is computed by segment and not by character. Beispielsweise ist /a/b ein Präfix für /a/b/c, aber nicht für /a/bc.For example /a/b is a prefix for /a/b/c but not for /a/bc.

Der folgende „Node.js“-Codeausschnitt zeigt eine Funktion namens GenerateSasToken, die das Token aus den Eingaben resourceUri, signingKey, policyName, expiresInMins berechnet.The following Node.js snippet shows a function called generateSasToken that computes the token from the inputs resourceUri, signingKey, policyName, expiresInMins. In den nächsten Abschnitten wird erläutert, wie die verschiedenen Eingaben für die verschiedenen Anwendungsfälle für Token initialisiert werden.The next sections detail how to initialize the different inputs for the different token use cases.

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;
};

Hier ist zum Vergleich der entsprechende Python-Code zum Generieren eines Sicherheitstokens:As a comparison, the equivalent Python code to generate a security token is:

from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib 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)

Hinweis

Da die zeitliche Gültigkeit des Tokens auf Computern mit dem IoT Device Provisioning-Dienst überprüft wird, darf die Uhr des Computers, auf dem das Token generiert wird, nur minimal abweichen.Since the time validity of the token is validated on IoT Device Provisioning Service machines, the drift on the clock of the machine that generates the token must be minimal.

Verwenden der Sicherheitstoken von DienstkomponentenUse security tokens from service components

Dienstkomponenten können nur Sicherheitstoken mithilfe von SAS-Richtlinien generieren, die die entsprechenden Berechtigungen erteilen, wie bereits erläutert.Service components can only generate security tokens using shared access policies granting the appropriate permissions as explained previously.

Hier sind die Dienstfunktionen, die für die Endpunkte verfügbar gemacht werden:Here are the service functions exposed on the endpoints:

EndpunktEndpoint FunktionalitätFunctionality
{your-service}.azure-devices-provisioning.net/enrollments Ermöglicht Geräteregistrierungsvorgänge mit dem Device Provisioning-DienstProvides device enrollment operations with the Device Provisioning Service.
{your-service}.azure-devices-provisioning.net/enrollmentGroups Ermöglicht Vorgänge für die Verwaltung von GeräteregistrierungsgruppenProvides operations for managing device enrollment groups.
{your-service}.azure-devices-provisioning.net/registrations/{id} Ermöglicht Vorgänge zum Abrufen und Verwalten des Status von GeräteregistrierungenProvides operations for retrieving and managing the status of device registrations.

Beispielsweise würde ein Dienst, der mit einer vorab erstellten SAS-Richtlinie namens enrollmentread generiert wurde, ein Token mit den folgenden Parametern erstellen:As an example, a service generated using a pre-created shared access policy called enrollmentread would create a token with the following parameters:

  • Ressourcen-URI: {mydps}.azure-devices-provisioning.netresource URI: {mydps}.azure-devices-provisioning.net,
  • Signaturschlüssel: einer der Schlüssel der enrollmentread -Richtliniesigning key: one of the keys of the enrollmentread policy,
  • Richtlinienname: enrollmentreadpolicy name: enrollmentread,
  • Eine Ablaufzeitany expiration time.backn

Erstellen einer SAS-Richtlinie für Ihre Instanz von Device Provisioning Service im Portal

var endpoint ="mydps.azure-devices-provisioning.net";
var policyName = 'enrollmentread'; 
var policyKey = '...';

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

Das Ergebnis, das Lesezugriff auf alle Registrierungsdatensätze gewähren würde, sähe wie folgt aus:The result, which would grant access to read all enrollment records, would be:

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

Referenzthemen:Reference topics:

Die folgenden Referenzthemen enthalten weitere Informationen zum Steuern des Zugriffs auf Ihren IoT Device Provisioning-Dienst.The following reference topics provide you with more information about controlling access to your IoT Device Provisioning Service.

Berechtigungen des Device Provisioning-DienstsDevice Provisioning Service permissions

Die folgende Tabelle enthält die Berechtigungen, die Sie zum Steuern des Zugriffs auf den IoT Device Provisioning-Dienst verwenden können:The following table lists the permissions you can use to control access to your IoT Device Provisioning Service.

BerechtigungPermission NotizenNotes
ServiceConfigServiceConfig Gewährt Zugriff zum Ändern der Dienstkonfigurationen.Grants access to change the service configurations.
Diese Berechtigung wird von Back-End-Clouddiensten verwendet.This permission is used by backend cloud services.
EnrollmentReadEnrollmentRead Gewährt Lesezugriff auf die Geräteregistrierungen und Registrierungsgruppen.Grants read access to the device enrollments and enrollment groups.
Diese Berechtigung wird von Back-End-Clouddiensten verwendet.This permission is used by backend cloud services.
EnrollmentWriteEnrollmentWrite Gewährt Schreibzugriff auf die Geräteregistrierungen und Registrierungsgruppen.Grants write access to the device enrollments and enrollment groups.
Diese Berechtigung wird von Back-End-Clouddiensten verwendet.This permission is used by backend cloud services.
RegistrationStatusReadRegistrationStatusRead Gewährt Lesezugriff auf den Status der Geräteregistrierung.Grants read access to the device registration status.
Diese Berechtigung wird von Back-End-Clouddiensten verwendet.This permission is used by backend cloud services.
RegistrationStatusWriteRegistrationStatusWrite Gewährt Schreibzugriff auf den Status der Geräteregistrierung.Grants delete access to the device registration status.
Diese Berechtigung wird von Back-End-Clouddiensten verwendet.This permission is used by backend cloud services.