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

AWS Lambda: How to store secret to external API?

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

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

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

嗯...这就是 KMS 的用途:)而且肯定比在 Lambda 函数中以明文形式存储您的令牌或委托给第三方服务更安全。

如果您沿着这条路走下去,请查看 this blog post 现有的用法示例以更快地 运行 起床。特别是,您需要将以下内容添加到您的 Lambda 执行角色策略中:

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

上面例子的其余代码有点复杂;在这种情况下,您实际上只需要 describeKey()

这是我想出的。我正在使用 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

然后您需要将此文件作为 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);
  }
});

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

有一个 Nodejs Lambda 函数的蓝图,它从解密来自 kms 的 api 密钥开始。它提供了一种使用 promise 接口进行解密的简单方法。它还为您提供了授予 lambda 函数以访问 kms 所需的角色权限。可以通过搜索 "algorithmia-blueprint"

找到蓝图

AWS Lambda 支持 NodeJS 4.3,正确答案是使用 Environment Variables to store sensitive information。此功能与 AWS KMS 集成,因此如果默认值不够,您可以使用自己的主密钥来加密机密。

无论您选择做什么,您都应该使用 GitMonkey 之类的工具来监控您的代码存储库,并确保您的密钥没有提交或推送给它们。