Creazione e gestione di autorizzatori personalizzati - AWS IoT Core

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Creazione e gestione di autorizzatori personalizzati

AWS IoT Core implementa schemi di autenticazione e autorizzazione personalizzati utilizzando risorse di autorizzazione. Ogni autorizzatore è costituito dai seguenti componenti:

  • Nome: stringa univoca definita dall'utente che identifica l'autorizzatore.

  • Funzione Lambda ARN: Amazon Resource Name (ARN) della funzione Lambda che implementa la logica di autorizzazione e autenticazione. 

  • Nome chiave del token: il nome della chiave utilizzato per estrarre il token dalle HTTP intestazioni, dai parametri di query o dal nome MQTT CONNECT utente per eseguire la convalida della firma. Questo valore è obbligatorio se la firma è abilitata nell'autorizzatore.

  • Contrassegno di disabilitazione della firma (opzionale): un valore booleano che specifica se disabilitare il requisito di firma sulle credenziali. Ciò è utile negli scenari in cui la firma delle credenziali non ha senso, ad esempio negli schemi di autenticazione che utilizzano MQTT nome utente e password. Il valore predefinito èfalse, quindi la firma è abilitata per impostazione predefinita.

  • Chiave pubblica per la firma tramite token: la chiave pubblica che AWS IoT Core utilizza per convalidare la firma del token. La sua lunghezza minima è di 2.048 bit. Questo valore è obbligatorio se la firma è abilitata nell'autorizzatore. 

Lambda addebita per il numero di volte in cui la tua funzione Lambda viene eseguita e per il tempo necessario per l'esecuzione del codice nella funzione. Per maggiori informazioni sui prezzi di Lambda consulta Prezzi Lambda. Per ulteriori informazioni sulla creazione di funzioni Lambda, consulta Guida per gli sviluppatori di Lambda.

Nota

Se si lascia abilitata la firma, è possibile impedire l'attivazione eccessiva di Lambda da parte di client non riconosciuti. Consideralo prima di disabilitare l'accesso nel tuo autorizzatore.

Nota

Il limite di timeout della funzione Lambda per l'autorizzatore personalizzato è di 5 secondi.

Scrittura della funzione Lambda

Quando AWS IoT Core richiama l'autorizzatore, attiva la Lambda associata all'autorizzatore con un evento che contiene il seguente oggetto. JSON L'JSONoggetto di esempio contiene tutti i campi possibili. I campi non rilevanti per la richiesta di connessione non sono inclusi.

{     "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.     }, }

La funzione Lambda deve utilizzare queste informazioni per autenticare la connessione in ingresso e decidere quali azioni sono consentite nella connessione. La funzione deve inviare una risposta che contiene i seguenti valori.

  • isAuthenticated: valore booleano che indica se la richiesta è stata autenticata.

  • principalId: Una stringa alfanumerica che funge da identificatore per il token inviato dalla richiesta di autorizzazione personalizzata. Il valore deve essere una stringa alfanumerica con almeno uno e non più di 128 caratteri e corrisponde a questo pattern di espressione regolare (regex):([a-zA-Z0-9]){1,128}. I caratteri speciali che non sono alfanumerici non possono essere utilizzati con in principalId AWS IoT Core. Fate riferimento alla documentazione per ulteriori informazioni AWS servizi se sono consentiti caratteri speciali non alfanumerici per. principalId

  • policyDocuments: Un elenco di -formatted JSON AWS IoT Core documenti politici Per ulteriori informazioni sulla creazione AWS IoT Core politiche, vedereAWS IoT Core policies. Il numero massimo di documenti di policy è di 10. Ogni documento di policy può contenere un massimo di 2.048 caratteri.

  • disconnectAfterInSeconds: Un numero intero che specifica la durata massima (in secondi) della connessione al AWS IoT Core gateway. Il valore minimo è 300 secondi e il valore massimo è 86400 secondi. Il valore predefinito è 86.400.

    Nota

    Il valore di disconnectAfterInSeconds (restituito dalla funzione Lambda) viene impostato quando viene stabilita la connessione. Questo valore non può essere modificato durante le successive chiamate Lambda di aggiornamento delle policy.

  • refreshAfterInSeconds: numero intero che specifica l'intervallo tra gli aggiornamenti delle policy. Trascorso questo intervallo, AWS IoT Core richiama la funzione Lambda per consentire l'aggiornamento delle policy. Il valore minimo è 300 secondi e il valore massimo è 86400 secondi.

 L'JSONoggetto seguente contiene un esempio di risposta che la funzione Lambda può inviare.

{ "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"             }          ]        }     ] }

Il policyDocument valore deve contenere un valore valido AWS IoT Core documento politico. Per ulteriori informazioni sull' AWS IoT Core politiche, vediAWS IoT Core policies. In MQTT più TLS e MQTT più WebSockets connessioni, AWS IoT Core memorizza nella cache questo criterio per l'intervallo specificato nel valore del refreshAfterInSeconds campo. Nel caso delle HTTP connessioni, la funzione Lambda viene chiamata per ogni richiesta di autorizzazione, a meno che il dispositivo non utilizzi connessioni HTTP persistenti (chiamate anche HTTP keep-alive o riutilizzo della HTTP connessione), puoi scegliere di abilitare la memorizzazione nella cache durante la configurazione dell'autorizzatore. Durante questo intervallo, AWS IoT Core autorizza le azioni in una connessione stabilita contro questa policy memorizzata nella cache senza attivare nuovamente la funzione Lambda. Se si verificano errori durante l'autenticazione personalizzata, AWS IoT Core interrompe la connessione. AWS IoT Core interrompe inoltre la connessione se è rimasta aperta per un periodo superiore al valore specificato nel disconnectAfterInSeconds parametro.

Di seguito è JavaScript riportato un esempio di funzione Lambda di Node.js che cerca una password nel messaggio MQTT Connect con un valore di test e restituisce un criterio che concede l'autorizzazione alla connessione a AWS IoT Core con un client denominato myClientName e pubblicato su un argomento che contiene lo stesso nome client. Se non trova la password prevista, restituisce una policy che nega queste due operazioni.

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

La precedente funzione Lambda restituisce JSON quanto segue quando riceve la password test prevista nel messaggio MQTT Connect. I valori delle principalId proprietà password and saranno i valori del messaggio MQTT Connect.

{ "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 }

Creazione di un autorizzatore

È possibile creare un autorizzatore utilizzando il CreateAuthorizerAPI. L'esempio seguente descrive il comando.

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]

Puoi utilizzare il parametro signing-disabled per disattivare la convalida della firma per ogni chiamata dell'autorizzatore. Si consiglia vivamente di non disattivare la firma a meno che non sia necessario. La convalida della firma ti protegge da invocazioni eccessive della funzione Lambda da dispositivi sconosciuti. Non è possibile aggiornare lo status signing-disabled di un autorizzatore dopo averlo creata. Per modificare questo comportamento, è necessario creare un altro autorizzatore personalizzato con un valore diverso per il parametro signing-disabled.

I valori per i parametri tokenKeyName e tokenSigningPublicKeys sono facoltativi se la firma è stata disabilitata. Sono valori obbligatori se la firma è abilitata.

Dopo aver creato la funzione Lambda e l'autorizzatore personalizzato, è necessario concedere esplicitamente il AWS IoT Core l'autorizzazione del servizio a richiamare la funzione per conto dell'utente. È possibile farlo con il seguente comando.

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

Verificare le autorizzazioni

Puoi usare il TestInvokeAuthorizerAPIper testare l'invocazione e restituire i valori del tuo autorizzatore. Ciò API consente di specificare i metadati del protocollo e di testare la convalida della firma nell'autorizzatore.  

Le seguenti schede mostrano come utilizzare AWS CLI per testare il tuo autorizzatore.

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

Il valore del parametro token-signature è il token firmato. Per ulteriori informazioni su come modificare questo valore, consulta Firma del token.

Se l'autorizzatore accetta un nome utente e una password, puoi trasferire queste informazioni utilizzando il parametro --mqtt-context. Le seguenti schede mostrano come utilizzare per TestInvokeAuthorizer API inviare un JSON oggetto che contiene un nome utente, una password e un nome client all'autorizzatore personalizzato.

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"}'

La password deve essere con codifica base64. Nell'esempio seguente viene illustrato come codificare una password in un ambiente simile a UNIX.

echo -n PASSWORD | base64

Gestione degli autorizzatori personalizzati

È possibile gestire gli autorizzatori utilizzando quanto segue. APIs

  • ListAuthorizers: Mostra tutti gli autorizzatori presenti nel tuo account.

  • DescribeAuthorizer: visualizza le proprietà dell'autorizzatore specificato. Questi valori includono data di creazione, data ultima modifica e altri attributi.

  • SetDefaultAuthorizer: specifica l'autorizzatore predefinito per AWS IoT Core endpoint di dati. AWS IoT Core utilizza questo autorizzatore se un dispositivo non passa AWS IoT Core credenziali e non specifica un autorizzatore. Per ulteriori informazioni sull'utilizzo AWS IoT Core credenziali, vediAutenticazione client.

  • UpdateAuthorizer: modifica lo stato, il nome della chiave del token o le chiavi pubbliche dell'autorizzatore specificato.

  • DeleteAuthorizer: elimina l'autorizzatore specificato.

Nota

Non è possibile aggiornare i requisiti di firma di un autorizzatore. Ciò significa che non è possibile disabilitare la firma in un autorizzatore esistente che la richiede. Inoltre, non è possibile richiedere la firma a un autorizzatore esistente che non la richiede.