56

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

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

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

4

5 回答 5

70

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

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

于 2015-04-13T07:58:57.563 回答
15

从 AWS Lambda 对 NodeJS 4.3 的支持开始,正确的答案是使用环境变量存储敏感信息。此功能与 AWS KMS 集成,因此如果默认值不够,您可以使用自己的主密钥来加密密钥。

于 2016-12-01T19:03:32.920 回答
3

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

如果您走这条路,请查看此博客文章以获取现有的使用示例,以更快地启动和运行。特别是,您需要将以下内容添加到您的 Lambda 执行角色策略中:

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

上面例子的其余代码有点复杂。你真的应该只需要describeKey()在这种情况下。

于 2015-03-31T17:28:26.647 回答
3

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

于 2016-08-26T18:41:18.770 回答
-5

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

于 2017-07-25T06:33:13.040 回答