AWS Lambda:如何将密码存储到外部API?
我正在构build基于AWS Lambda的监控工具。 给定一组指标,Lambdas应该能够使用Twilio API发送短信。 为了能够使用API,Twilio提供了一个账号SID和一个授权令牌。
我应该如何以及在哪里存储这些秘密?
我目前正在考虑使用AWS KMS,但可能还有其他更好的解决scheme。
这是我想出来的。 我正在使用AWS KMS将我的秘密encryption成一个文件,并将代码上传到AWS Lambda。 然后,当我需要使用它时,我会对它进行解密。
以下是要遵循的步骤。
首先创build一个KMS密钥。 你可以在这里find文档: http : //docs.aws.amazon.com/kms/latest/developerguide/create-keys.html
然后encryption你的秘密,并把结果放到一个文件中。 这可以通过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 4.3的AWS Lambda支持开始,正确的答案是使用环境variables 。 此function与AWS KMS集成,因此您可以使用自己的主密钥来encryption秘密。
有一个Nodejs Lambda函数的蓝图,首先从kms解密一个api密钥。 它提供了一个使用承诺接口解密的简单方法。 它还为您提供angular色权限,您需要为lambda函数访问kms。 蓝图可以通过search“algorithm蓝图”
那么…这就是KMS的原因:)而且肯定比在Lambda函数中以明文存储令牌更安全,或委托给第三方服务。
如果你走这条路线,看看这个博客文章现有的使用示例,以加快和运行。 特别是,您需要将以下内容添加到您的Lambda执行angular色策略中:
"kms:Decrypt", "kms:DescribeKey", "kms:GetKeyPolicy",
上面例子的其余代码有点复杂, 在这种情况下,你应该只需要describeKey()
。
不pipe你select做什么,你都应该使用像GitMonkey这样的工具来监视你的代码库,并确保你的密钥没有被提交或推送给他们。