AWS Lambda: come archiviare il segreto dell’API esterna?

Sto costruendo uno strumento di monitoraggio basato su AWS Lambda. Dato un insieme di metriche, Lambdas dovrebbe essere in grado di inviare SMS utilizzando l’ API Twilio . Per poter utilizzare l’API, Twilio fornisce un SID dell’account e un token di autenticazione.

Come e dove dovrei conservare questi segreti?

Attualmente sto pensando di utilizzare AWS KMS ma potrebbero esserci altre soluzioni migliori.

Ecco cosa mi è venuto in mente. Sto usando AWS KMS per crittografare i miei segreti in un file che ho caricato con il codice in AWS Lambda. Quindi decrittalo quando ho bisogno di usarli.

Ecco i passi da seguire.

Prima crea una chiave KMS. Puoi trovare la documentazione qui: http://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html

Quindi crittografa il tuo segreto e metti il ​​risultato in un file. Questo può essere ottenuto dalla CLI con:

aws kms encrypt --key-id some_key_id --plaintext "This is the scret you want to encrypt" --query CiphertextBlob --output text | base64 -D > ./encrypted-secret 

È quindi necessario caricare questo file come parte del Lambda. Puoi decifrare e usare il segreto nel Lambda come segue.

 var fs = require('fs'); var AWS = require('aws-sdk'); var kms = new AWS.KMS({region:'eu-west-1'}); var secretPath = './encrypted-secret'; var encryptedSecret = fs.readFileSync(secretPath); var params = { CiphertextBlob: encryptedSecret }; kms.decrypt(params, function(err, data) { if (err) console.log(err, err.stack); else { var decryptedSecret = data['Plaintext'].toString(); console.log(decryptedSecret); } }); 

Spero che lo troverai utile

A partire dal supporto AWS Lambda per NodeJS 4.3, la risposta corretta è utilizzare le variabili d’ambiente per memorizzare le informazioni sensibili . Questa funzione si integra con AWS KMS, quindi puoi utilizzare le tue chiavi master per crittografare i segreti se il valore predefinito non è sufficiente.

Esiste un progetto per una funzione Nodejs Lambda che inizia con la decodifica di una chiave API da km. Fornisce un modo semplice per decodificare utilizzando un’interfaccia di promise. Fornisce inoltre le autorizzazioni di ruolo necessarie per fornire la funzione lambda per accedere ai km. La stampa blu può essere trovata cercando “algoritmo-blueprint”

Bene … questo è il motivo per cui è stato creato KMS 🙂 E sicuramente più sicuro di quello di memorizzare i token in testo in chiaro nella funzione Lambda o di debind a un servizio di terze parti.

Se segui questa strada, controlla questo post sul blog per un esempio di utilizzo esistente per iniziare subito a correre. In particolare, è necessario aggiungere quanto segue alla propria politica sui ruoli di esecuzione di Lambda:

 "kms:Decrypt", "kms:DescribeKey", "kms:GetKeyPolicy", 

Il resto del codice per l’esempio precedente è un po ‘contorto; in questo caso dovresti davvero solo describeKey() .

Qualunque cosa tu scelga di fare, dovresti usare uno strumento come GitMonkey per monitorare i tuoi repository di codice e assicurarti che le tue chiavi non siano impegnate o inviate a loro.