AWS Lambda: ¿Cómo almacenar secretos a API externa?

Estoy construyendo una herramienta de monitoreo basada en AWS Lambda. Dado un conjunto de métricas, Lambdas debería poder enviar SMS utilizando la API de Twilio . Para poder usar la API, Twilio proporciona un SID de cuenta y un token de autenticación.

¿Cómo y dónde debo guardar estos secretos?

Actualmente estoy pensando en utilizar AWS KMS, pero podría haber otras soluciones mejores.

Esto es lo que he encontrado. Estoy usando AWS KMS para cifrar mis secretos en un archivo que cargué con el código a AWS Lambda. Luego lo descifro cuando necesito usarlos.

Aquí están los pasos a seguir.

Primero crea una clave KMS. Puede encontrar la documentación aquí: http://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html

Luego encripta tu secreto y coloca el resultado en un archivo. Esto se puede lograr desde el 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 

A continuación, debe cargar este archivo como parte de Lambda. Puedes descifrar y usar el secreto en el Lambda de la siguiente manera.

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

Espero que encuentres esto útil.

A partir del soporte de AWS Lambda para NodeJS 4.3, la respuesta correcta es utilizar las Variables de entorno para almacenar información confidencial . Esta función se integra con AWS KMS, por lo que puede usar sus propias claves maestras para cifrar los secretos si el valor predeterminado no es suficiente.

Hay un plano para una función Nodejs Lambda que comienza con descifrar una clave api de kms. Proporciona una forma fácil de descifrar mediante una interfaz de promesa. También le da los permisos de rol que necesita para dar la función lambda para acceder a kms. El blueprint se puede encontrar buscando “algorithmia-blueprint”

Bueno … para eso se creó KMS 🙂 Y ciertamente más seguro que almacenar sus tokens en texto plano en la función Lambda o delegar en un servicio de terceros.

Si recorres esta ruta, consulta esta publicación de blog para ver un ejemplo de uso existente para comenzar a trabajar más rápido. En particular, deberá agregar lo siguiente a su política de rol de ejecución de Lambda:

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

El rest del código para el ejemplo anterior es un poco complicado; en este caso, solo deberías necesitar describeKey() .

Independientemente de lo que elija, debe usar una herramienta como GitMonkey para monitorear sus repositorys de código y asegurarse de que sus claves no estén comprometidas o presionadas.