AWS Lambda:如何将秘密存储到外部API?

Jon*_*iez 53 security amazon-web-services node.js aws-lambda

我正在构建一个基于AWS Lambda的监控工具.给定一组指标,Lambdas应该能够使用Twilio API 发送SMS .为了能够使用API​​,Twilio提供帐户SID和身份验证令牌.

我应该如何以及在哪里存储这些秘密?

我目前正在考虑使用AWS KMS,但可能还有其他更好的解决方案.

Jon*_*iez 68

这就是我想出来的.我正在使用AWS KMS将我的秘密加密到我使用代码上传到AWS Lambda的文件中.然后,当我需要使用它时,我解密它.

以下是要遵循的步骤.

首先创建一个KMS密钥.您可以在此处找到文档:http://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html

然后加密你的秘密并将结果放入文件中.这可以通过CLI实现:

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
Run Code Online (Sandbox Code Playgroud)

然后,您需要将此文件作为Lambda的一部分上载.您可以解密并使用Lambda中的秘密,如下所示.

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

我希望你会发现这很有用.

  • 您可以更进一步,并将加密的密钥存储在S3中.赋予lambda函数一个角色,它可以从特定存储桶中获取对象,这样,无论何时密钥更改,您都不必更新lambda函数,也不必担心将API保存在计算机上. (2认同)
  • 不会.AWM会自动知道用于解密密码的密钥. (2认同)
  • 只是为了澄清这段代码应该是处理程序的OUTSIDE.因此,这将只运行一次,并且不会在每个函数调用中解密秘密.更多信息:https://forums.aws.amazon.com/thread.jspa?messageID = 686261 (2认同)

Jam*_*mey 10

从AWS Lambda支持NodeJS 4.3开始,正确的答案是使用环境变量存储敏感信息.此功能与AWS KMS集成,因此如果默认值不够,您可以使用自己的主密钥加密机密.