2015-03-31 9 views
46

Sto costruendo uno strumento di monitoraggio basato su AWS Lambda. Dato un set 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.AWS Lambda: come archiviare il segreto dell'API esterna?

Come e dove dovrei conservare questi segreti?

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

risposta

63

Ecco quello che ho trovato. 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 passaggi da seguire.

Per prima cosa creare una chiave KMS. Puoi trovare la documentazione qui: http://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html

Quindi crittografare il tuo segreto e inserire 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.

+1

Questo è ottimo, ma dal momento che la decrittazione richiede una richiamata, non significa che la tua funzione potrebbe essere eseguita prima ancora di avere il segreto? Supponendo che il segreto sia necessario affinché il lambda esegua questo potrebbe essere un problema. – KerrM

+1

Ovviamente se si esegue il codice dopo la chiamata di decifrazione che richiede il segreto, è necessario assicurarsi che venga eseguito dopo l'esecuzione del callback di decifrazione. È possibile utilizzare la promessa (mai utilizzata da solo) o qualcosa come async.waterfall da http://caolan.github.io/async/ – JonathanGailliez

+2

È possibile eseguire un ulteriore passaggio e memorizzare il segreto crittografato in S3. Dare alla funzione lambda un ruolo in cui può ottenere oggetti da un bucket specifico e in questo modo non è necessario aggiornare la funzione lambda ogni volta che cambia la chiave e non deve preoccuparsi di mantenere l'API memorizzata su una macchina. – bernays

2

Bene ... questo è il motivo per cui è stato creato KMS :) E sicuramente più sicuro rispetto all'archiviazione dei token in testo in chiaro nella funzione Lambda o alla delega a un servizio di terze parti.

Se si scende lungo questa rotta, consultare this blog post per un esempio di utilizzo esistente per iniziare subito a funzionare. In particolare, sarà necessario aggiungere la seguente alla vostra politica di esecuzione ruolo Lambda:

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

Il resto del codice per l'esempio sopra è un po 'contorto; in questo caso dovresti avere solo bisogno di describeKey().

+0

Ciao, grazie mille per la tua risposta, ma penso che potresti non aver compreso appieno il concetto alla base di KMS. O forse non ho capito la tua risposta. KMS non è un 'keystore', non puoi aggiungere la tua chiave personalizzata. Devi usare quelli che Amazon crea per te. Cordiali saluti, Jonathan. – JonathanGailliez

3

Esiste un progetto per una funzione Nodejs Lambda che inizia decodificando una chiave API da km. Fornisce un modo semplice per decodificare utilizzando un'interfaccia di promessa. 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"

+1

Link a qualsiasi rifrazione – kevzettler

+2

Questa è una risposta utile. Una volta all'interno di console.aws.amazon.com/lambda, è facile trovare il progetto. Crea una funzione dal progetto e rimuovi il trigger S3 se non hai un bucket e vuoi solo guardare il codice. Risponde anche alla domanda @ KerrM sotto la risposta accettata. – bebbi

7

A partire dal supporto AWS Lambda per NodeJS 4.3, la risposta corretta è utilizzare Environment Variables. Questa funzione si integra con AWS KMS, quindi puoi utilizzare le tue chiavi master per crittografare i segreti.

-2

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.