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 之类的工具来监控您的代码存储库,并确保您的密钥没有提交或推送给它们。
我正在构建一个基于 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 之类的工具来监控您的代码存储库,并确保您的密钥没有提交或推送给它们。