我正在构建基于AWS Lambda的监控工具。给定一组指标,Lambdas应该能够使用Twilio API发送短信。为了能够使用API,Twilio提供帐户SID和身份验证令牌。
我应该如何以及在哪里存储这些秘密?
我目前正在考虑使用AWS KMS,但可能还有其他更好的解决方案。
答案 0 :(得分: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
然后,您需要将此文件作为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);
}
});
我希望你会发现这很有用。
答案 1 :(得分:10)
从AWS Lambda对NodeJS 4.3的支持,正确的答案是使用Environment Variables到store sensitive information。此功能与AWS KMS集成,因此如果默认值不够,您可以使用自己的主密钥加密秘密。
答案 2 :(得分:3)
Nodejs Lambda函数有一个蓝图,它从解密来自kms的api密钥开始。它提供了一种使用promise接口进行解密的简便方法。它还为您提供了为了访问kms而提供lambda函数所需的角色权限。通过搜索" algorithmia-blueprint"
可以找到蓝图答案 3 :(得分:2)
嗯......这就是KMS的用途:)当然比在Lambda函数中以明文形式存储令牌或委托给第三方服务更安全。
如果你沿着这条路走下去,请查看this blog post了解现有的使用示例,以便更快地启动和运行。特别是,您需要将以下内容添加到Lambda执行角色策略中:
"kms:Decrypt",
"kms:DescribeKey",
"kms:GetKeyPolicy",
上面例子的其余代码有点复杂;在这种情况下,你真的只需要describeKey()
。
答案 4 :(得分:-5)
无论您选择做什么,都应该使用GitMonkey之类的工具来监控您的代码存储库,并确保您的密钥未提交或推送给他们。