web-dev-qa-db-fra.com

AWS Lambda: comment stocker le secret sur une API externe?

Je crée un outil de surveillance basé sur AWS Lambda. Étant donné un ensemble de mesures, les Lambdas devraient être en mesure d'envoyer SMS en utilisant Twilio API. Pour pouvoir utiliser l'API, Twilio fournit un SID de compte et une authentification jeton.

Comment et où dois-je stocker ces secrets?

Je pense actuellement à utiliser AWS KMS mais il pourrait y avoir d'autres meilleures solutions.

53
JonathanGailliez

Voici ce que j'ai trouvé. J'utilise AWS KMS pour crypter mes secrets dans un fichier que je télécharge avec le code sur AWS Lambda. Je le décrypte ensuite lorsque je dois les utiliser.

Voici les étapes à suivre.

Créez d'abord une clé KMS. Vous pouvez trouver de la documentation ici: http://docs.aws.Amazon.com/kms/latest/developerguide/create-keys.html

Ensuite, cryptez votre secret et mettez le résultat dans un fichier. Ceci peut être réalisé à partir de la CLI avec:

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

Vous devez ensuite télécharger ce fichier dans le cadre de Lambda. Vous pouvez décrypter et utiliser le secret dans Lambda comme suit.

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

J'espère que vous trouverez cela utile.

68
JonathanGailliez

Depuis la prise en charge d'AWS Lambda pour NodeJS 4.3, la bonne réponse consiste à utiliser Variables d'environnement à stocker les informations sensibles . Cette fonctionnalité s'intègre à AWS KMS, vous pouvez donc utiliser vos propres clés principales pour crypter les secrets si la valeur par défaut n'est pas suffisante.

10
Jamey

Il existe un plan pour une fonction Nodejs Lambda qui commence par le décryptage d'une clé API à partir de kms. Il fournit un moyen facile de décrypter en utilisant une interface de promesse. Il vous donne également les autorisations de rôle dont vous avez besoin pour donner la fonction lambda afin d'accéder aux kms. L'impression bleue peut être trouvée en recherchant "algorithmia-blueprint"

3
bernays

Eh bien ... c'est pour cela que KMS a été conçu :) Et certainement plus sûr que de stocker vos jetons en texte brut dans la fonction Lambda ou de déléguer à un service tiers.

Si vous suivez cette voie, consultez ce billet de blog pour un exemple d'utilisation existant pour être opérationnel plus rapidement. En particulier, vous devrez ajouter les éléments suivants à votre stratégie de rôle d'exécution Lambda:

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

Le reste du code de l'exemple ci-dessus est un peu compliqué; vous ne devriez vraiment avoir besoin que de describeKey() dans ce cas.

2
William Gaul