我正在构建一个基于 AWS Lambda 的监控工具。给定一组指标,Lambda 应该能够使用Twilio API 发送 SMS。为了能够使用 API,Twilio 提供了一个帐户 SID 和一个身份验证令牌。
我应该如何以及在哪里存储这些秘密?
我目前正在考虑使用AWS KMS,但可能还有其他更好的解决方案。
这是我想出的。我正在使用 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);
}
});
我希望你会发现这很有用。
嗯……这就是 KMS 的用途 :) 而且肯定比在 Lambda 函数中以明文形式存储令牌或委托给第三方服务更安全。
如果您走这条路,请查看此博客文章以获取现有的使用示例,以更快地启动和运行。特别是,您需要将以下内容添加到您的 Lambda 执行角色策略中:
"kms:Decrypt",
"kms:DescribeKey",
"kms:GetKeyPolicy",
上面例子的其余代码有点复杂。你真的应该只需要describeKey()
在这种情况下。
Nodejs Lambda 函数有一个蓝图,它首先从 kms 解密 api 密钥。它提供了一种使用 Promise 接口进行解密的简单方法。它还为您提供了授予 lambda 函数以访问 kms 所需的角色权限。蓝图可以通过搜索“algorithmia-blueprint”找到
无论您选择做什么,您都应该使用GitMonkey 之类的工具来监控您的代码存储库,并确保您的密钥没有提交或推送给它们。