node.js - succeed - lambda node js tutorial
AWS Lambda: ¿Cómo almacenar secretos en API externas? (5)
Estoy creando una herramienta de monitoreo basada en AWS Lambda. Dado un conjunto de métricas, las Lambdas deberían poder enviar SMS utilizando la API Twilio . Para poder utilizar 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 usar AWS KMS, pero podría haber otras soluciones mejores.
A partir del soporte de AWS Lambda para NodeJS 4.3, la respuesta correcta es usar Variables de entorno para almacenar información confidencial . Esta característica 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.
Bueno ... para eso está hecho KMS :) Y ciertamente es más seguro que almacenar sus tokens en texto sin formato en la función Lambda o delegarlos en un servicio de terceros.
Si sigue esta ruta, consulte 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 roles de ejecución de Lambda:
"kms:Decrypt",
"kms:DescribeKey",
"kms:GetKeyPolicy",
El resto del código para el ejemplo anterior es un poco complicado;
Realmente solo debería necesitar
describeKey()
en este caso.
Esto es lo que se me ocurrió. Estoy usando AWS KMS para cifrar mis secretos en un archivo que subo con el código a AWS Lambda. Luego lo descifro cuando necesito usarlos.
Aquí están los pasos a seguir.
Primero cree una clave KMS. Puede encontrar documentación aquí: http://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html
Luego, encripte su secreto y ponga el resultado en un archivo. Esto se puede lograr desde la 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
Luego debe cargar este archivo como parte de Lambda. Puede 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.
Hay un plan para una función Lambda de Nodejs que comienza con el descifrado de una clave api de kms. Proporciona una manera fácil de descifrar usando una interfaz prometedora. También le otorga los permisos de roles que necesita para otorgar la función lambda para acceder a kms. La impresión azul se puede encontrar buscando "anteproyecto de algoritmo"
Independientemente de lo que elija hacer, debe usar una herramienta como GitMonkey para monitorear sus repositorios de código y asegurarse de que sus claves no estén confirmadas o enviadas a ellos.