Erstellen und Verwalten von benutzerdefinierten Genehmigern - AWS IoT Core

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erstellen und Verwalten von benutzerdefinierten Genehmigern

AWS IoT Core implementiert benutzerdefinierte Authentifizierungs- und Autorisierungsschemata mithilfe von Autorisierungsressourcen. Jeder Genehmiger umfasst folgende Komponenten:

  • Name: Eine eindeutige benutzerdefinierte Zeichenfolge, in der der Genehmiger identifiziert wird.

  • Lambda-Funktion ARN: Der Amazon-Ressourcenname (ARN) der Lambda-Funktion, die die Autorisierungs- und Authentifizierungslogik implementiert. 

  • Token-Schlüsselname: Der Schlüsselname, der verwendet wird, um das Token aus den HTTP Headern, Abfrageparametern oder dem MQTT CONNECT Benutzernamen zu extrahieren, um die Signaturvalidierung durchzuführen. Dieser Wert ist erforderlich, wenn in Ihrem Genehmiger die Signierung aktiviert ist.

  • Kennzeichnung deaktiviert (optional): Ein boolescher Wert, der angibt, ob die Signaturanforderung für Anmeldeinformationen deaktiviert werden soll. Dies ist nützlich für Szenarien, in denen das Signieren der Anmeldeinformationen nicht sinnvoll ist, z. B. bei Authentifizierungsschemas, die MQTT Benutzername und Passwort verwenden. Der Standardwert istfalse, also ist das Signieren standardmäßig aktiviert.

  • Öffentlicher Schlüssel zur Tokensignierung: Der öffentliche Schlüssel, der AWS IoT Core verwendet, um die Token-Signatur zu validieren. Die Mindestlänge beträgt 2.048 Bit. Dieser Wert ist erforderlich, wenn in Ihrem Genehmiger die Signierung aktiviert ist. 

Lambda berechnet Ihnen die Anzahl der Ausführungen Ihrer Lambda-Funktion und die Dauer der Ausführung des Codes in Ihrer Funktion. Weitere Informationen zu den Preisen für Lambda finden Sie unter Lambda-Preise. Weitere Informationen zum Erstellen von Lambda-Funktionen finden Sie im Lambda-Entwicklerhandbuch.

Anmerkung

Wenn Sie die Signierung aktiviert lassen, können Sie verhindern, dass Ihr Lambda übermäßig oft durch unbekannte Clients ausgelöst wird. Bedenken Sie dies, bevor Sie die Signierung in Ihrem Genehmiger deaktivieren.

Anmerkung

Das Timeout-Limit der Lambda-Funktion für den benutzerdefinierten Genehmiger beträgt 5 Sekunden.

Definieren Ihrer Lambda-Funktion

Wann AWS IoT Core ruft Ihren Autorisierer auf und löst das dem Autorisierer zugeordnete Lambda mit einem Ereignis aus, das das folgende Objekt enthält. JSON Das JSON Beispielobjekt enthält alle möglichen Felder. Felder, die für die Verbindungsanforderung nicht relevant sind, sind nicht enthalten.

{     "token" :"aToken",     "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.     "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.     "protocolData": {         "tls" : {             "serverName": "serverName" // The server name indication (SNI) host_name string.         },         "http": {             "headers": {                 "#{name}": "#{value}"             },             "queryString": "?#{name}=#{value}"         },         "mqtt": {             "username": "myUserName",             "password": "myPassword", // A base64-encoded string.             "clientId": "myClientId" // Included in the event only when the device sends the value.         }     },     "connectionMetadata": {         "id": UUID // The connection ID. You can use this for logging.     }, }

Die Lambda-Funktion sollte diese Informationen verwenden, um die eingehende Verbindung zu authentifizieren und zu entscheiden, welche Aktionen in der Verbindung zulässig sind. Die Funktion sollte eine Antwort senden, die die folgenden Werte enthält.

  • isAuthenticated: Ein boolescher Wert, der angibt, ob die Anforderung authentifiziert wurde.

  • principalId: Eine alphanumerische Zeichenfolge, die als Kennung für das Token dient, das von der benutzerdefinierten Autorisierungsanforderung gesendet wurde. Der Wert muss eine alphanumerische Zeichenfolge mit mindestens einem und nicht mehr als 128 Zeichen sein und dem folgenden regulären Ausdrucksmuster (Regex) entsprechen: ([a-zA-Z0-9]){1,128}. Sonderzeichen, die nicht alphanumerisch sind, dürfen nicht zusammen mit dem principalId in verwendet werden AWS IoT Core. Weitere Informationen finden Sie in der Dokumentation AWS Dienste, wenn für die nicht-alphanumerische Sonderzeichen zulässig sind. principalId

  • policyDocuments: Eine Liste von -formatierten JSON AWS IoT Core Richtliniendokumente Weitere Informationen zum Erstellen AWS IoT Core Richtlinien finden Sie unterAWS IoT Core policies. Die maximale Anzahl von Richtliniendokumenten ist 10. Jedes Richtliniendokument darf maximal 2048 Zeichen enthalten.

  • disconnectAfterInSeconds: Eine Ganzzahl, die die maximale Dauer (in Sekunden) der Verbindung zum AWS IoT Core Gateway. Der Mindestwert ist 300 Sekunden und der Höchstwert 86 400 Sekunden. Der Standardwert ist 86.400.

    Anmerkung

    Der Wert von disconnectAfterInSeconds (von der Lambda-Funktion zurückgegeben) wird festgelegt, wenn die Verbindung hergestellt wird. Dieser Wert kann bei nachfolgenden Lambda-Aufrufen zur Richtlinienaktualisierung nicht geändert werden.

  • refreshAfterInSeconds: Eine Ganzzahl, die das Intervall zwischen Richtlinienaktualisierungen angibt. Wenn dieses Intervall verstrichen ist, AWS IoT Core ruft die Lambda-Funktion auf, um Richtlinienaktualisierungen zu ermöglichen. Der Mindestwert ist 300 Sekunden und der Höchstwert 86 400 Sekunden.

 Das folgende JSON Objekt enthält ein Beispiel für eine Antwort, die Ihre Lambda-Funktion senden kann.

{ "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       {         "Version": "2012-10-17",         "Statement": [            {               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your_aws_account_id>:topic/customauthtesting"             }          ]        }     ] }

Der policyDocument Wert muss einen gültigen Wert enthalten AWS IoT Core politisches Dokument. Weitere Informationen zur AWS IoT Core Richtlinien, sieheAWS IoT Core policies. In MQTT TLS immer MQTT mehr WebSockets Verbindungen AWS IoT Core speichert diese Richtlinie für das im refreshAfterInSeconds Feldwert angegebene Intervall im Cache. Bei HTTP Verbindungen wird die Lambda-Funktion für jede Autorisierungsanfrage aufgerufen, es sei denn, Ihr Gerät verwendet HTTP persistente Verbindungen (auch HTTP Keep-Alive oder HTTP Verbindungswiederverwendung genannt). Sie können bei der Konfiguration des Autorisierers wählen, ob das Caching aktiviert werden soll. Während dieses Intervalls AWS IoT Core autorisiert Aktionen in einer hergestellten Verbindung gegen diese zwischengespeicherte Richtlinie, ohne Ihre Lambda-Funktion erneut auszulösen. Wenn bei der benutzerdefinierten Authentifizierung Fehler auftreten, AWS IoT Core beendet die Verbindung. AWS IoT Core beendet die Verbindung auch, wenn sie länger als der im Parameter angegebene Wert geöffnet war. disconnectAfterInSeconds

Im Folgenden finden JavaScript Sie eine Lambda-Beispielfunktion von Node.js, die in der MQTT Connect-Nachricht nach einem Kennwort mit dem Wert von sucht test und eine Richtlinie zurückgibt, die die Berechtigung zum Herstellen einer Verbindung erteilt AWS IoT Core mit einem Client, der benannt myClientName und zu einem Thema veröffentlicht wird, das denselben Kundennamen enthält. Wenn es das erwartete Passwort nicht findet, gibt es eine Richtlinie zurück, die diese beiden Aktionen verweigert.

// A simple Lambda function for an authorizer. It demonstrates // how to parse an MQTT password and generate a response. exports.handler = function(event, context, callback) {     var uname = event.protocolData.mqtt.username;     var pwd = event.protocolData.mqtt.password;     var buff = new Buffer(pwd, 'base64');     var passwd = buff.toString('ascii');     switch (passwd) {         case 'test':             callback(null, generateAuthResponse(passwd, 'Allow')); break;         default:             callback(null, generateAuthResponse(passwd, 'Deny'));       } }; // Helper function to generate the authorization response. var generateAuthResponse = function(token, effect) { var authResponse = {}; authResponse.isAuthenticated = true; authResponse.principalId = 'TEST123'; var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var publishStatement = {}; var connectStatement = {}; connectStatement.Action = ["iot:Connect"]; connectStatement.Effect = effect; connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"]; publishStatement.Action = ["iot:Publish"]; publishStatement.Effect = effect; publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; policyDocument.Statement[0] = connectStatement; policyDocument.Statement[1] = publishStatement; authResponse.policyDocuments = [policyDocument]; authResponse.disconnectAfterInSeconds = 3600; authResponse.refreshAfterInSeconds = 300; return authResponse; }

Die vorhergehende Lambda-Funktion gibt Folgendes zurückJSON, wenn sie das erwartete Passwort von test in der MQTT Connect-Nachricht empfängt. Die Werte der principalId Eigenschaften password und sind die Werte aus der MQTT Connect-Nachricht.

{ "password": "password", "isAuthenticated": true, "principalId": "principalId", "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Connect", "Effect": "Allow", "Resource": "*" }, { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}" }, { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}" }, { "Action": "iot:Receive", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}" } ] } ], "disconnectAfterInSeconds": 3600, "refreshAfterInSeconds": 300 }

Erstellen eines Genehmigers

Sie können einen Autorisierer erstellen, indem Sie den CreateAuthorizerAPIverwenden. Das folgende Beispiel beschreibt den Befehl.

aws iot create-authorizer --authorizer-name MyAuthorizer --authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function. [--token-key-name MyAuthorizerToken //The key used to extract the token from headers. [--token-signing-public-keys FirstKey= "-----BEGIN PUBLIC KEY-----   [...insert your public key here...]   -----END PUBLIC KEY-----" [--status ACTIVE] [--tags <value>] [--signing-disabled | --no-signing-disabled]

Sie können den signing-disabled-Parameter verwenden, um die Signaturvalidierung für jeden Aufruf Ihres Genehmigers zu deaktivieren. Es wird ausdrücklich empfohlen, dass die Signierung nur wenn unbedingt notwendig zu deaktivieren. Die Signaturvalidierung schützt Sie vor übermäßigen Aufrufen Ihrer Lambda-Funktion von unbekannten Geräten. Sie können den signing-disabled-Status eines Genehmigers nicht mehr ändern, nachdem Sie ihn erstellt haben. Zum Ändern dieses Verhaltens müssen Sie einen anderen benutzerdefinierten Genehmiger mit einem anderen Wert für den signing-disabled-Parameter erstellen.

Die Werte für die tokenKeyName- und tokenSigningPublicKeys-Parameter sind optional, wenn Sie das Signieren deaktiviert haben. Sie sind jedoch erforderlich, wenn das Signieren aktiviert ist.

Nachdem Sie Ihre Lambda-Funktion und den benutzerdefinierten Autorisierer erstellt haben, müssen Sie die AWS IoT Core Serviceberechtigung, um die Funktion in Ihrem Namen aufzurufen. Sie können dies mit dem folgenden Befehl tun.

aws lambda add-permission --function-name <lambda_function_name> --principal iot.amazonaws.com --source-arn <authorizer_arn> --statement-id Id-123 --action "lambda:InvokeFunction"

Testen Ihrer Genehmiger

Sie können den verwenden TestInvokeAuthorizerAPI, um den Aufruf und die Rückgabewerte Ihres Autorisierers zu testen. Auf diese API Weise können Sie Protokollmetadaten angeben und die Signaturvalidierung in Ihrem Authorizer testen.  

Die folgenden Tabs zeigen, wie Sie AWS CLI um Ihren Authorizer zu testen.

Unix-like
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \ --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
Windows CMD
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^ --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
Windows PowerShell
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ` --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE

Der Wert des token-signature-Parameters ist das signierte Token. Weitere Informationen zum Abrufen dieses Werts finden Sie unter Signieren des Tokens.

Wenn Ihr Genehmiger einen Benutzernamen und ein Passwort verwendet, können Sie diese Informationen mithilfe des --mqtt-context-Parameters weitergeben. Auf den folgenden Registerkarten wird gezeigt, wie Sie mithilfe von ein JSON Objekt, das einen Benutzernamen, ein Passwort und einen Kundennamen enthält, an Ihren benutzerdefinierten Autorisierer senden können. TestInvokeAuthorizer API

Unix-like
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \ --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
Windows CMD
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^ --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
Windows PowerShell
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ` --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'

Das Passwort muss base64-kodiert sein. Das folgende Beispiel zeigt, wie Sie ein Passwort in einer Unix-ähnlichen Umgebung kodieren.

echo -n PASSWORD | base64

Verwalten von benutzerdefinierten Genehmigern

Sie können Ihre Autorisierer wie folgt verwalten. APIs

  • ListAuthorizers: Zeigt alle Autorisierer in Ihrem Konto an.

  • DescribeAuthorizer: Zeigt die Eigenschaften des angegebenen Autorisierers an. Zu diesen Werten gehören das Erstellungsdatum, das Datum der letzten Änderung und andere Attribute.

  • SetDefaultAuthorizer: Gibt den Standard-Autorisierer für Ihren an AWS IoT Core Datenendpunkte. AWS IoT Core verwendet diesen Authorizer, wenn ein Gerät die Prüfung nicht bestanden hat AWS IoT Core Anmeldeinformationen und gibt keinen Autorisierer an. Weitere Informationen zur Verwendung von AWS IoT Core Anmeldeinformationen finden Sie unterClient-Authentifizierung.

  • UpdateAuthorizer: Ändert den Status, den Namen des Token-Schlüssels oder die öffentlichen Schlüssel für den angegebenen Autorisierer.

  • DeleteAuthorizer: Löscht den angegebenen Autorisierer.

Anmerkung

Sie können die Signaturanforderungen eines Genehmigers nicht aktualisieren. Das bedeutet, dass Sie das Signieren in einem vorhandenen Genehmiger, der dies fordert, nicht deaktivieren können. Sie können auch nicht die Anmeldung bei einem vorhandenen Genehmiger verlangen, der dies nicht fordert.