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

时间:2015-03-31 15:21:49

标签: node.js security amazon-web-services aws-lambda

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

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

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

5 个答案:

答案 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 Variablesstore 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之类的工具来监控您的代码存储库,并确保您的密钥未提交或推送给他们。