【问题标题】:What is the best practice for storing sensitive env vars using AWS Lambda?使用 AWS Lambda 存储敏感环境变量的最佳实践是什么?
【发布时间】:2017-04-15 21:56:53
【问题描述】:

我的 AWS Lambda 函数需要填充包含敏感值的环境变量,例如主数据库密码。

Lambda 的新 env vars 功能使这变得超级简单。但是关于最佳实践是什么,或者如何实现它,这有点模糊。

在 Lambda 常见问题解答中,他们声明如下:

问:我可以将敏感信息存储在环境变量中吗? 敏感信息,例如数据库密码,我们建议您 使用 AWS Key Management Service 使用客户端加密并存储 结果值在您的环境变量中为cipher text。你 需要在您的 AWS Lambda 函数代码中包含逻辑才能解密 这些值。

所以他们基本上是说您需要自己加密这些值,然后将加密的值输入到您的 Lambda 函数 env vars 中。然后,您需要在函数中包含将在实例化时解密该值的逻辑。在伪代码中,它看起来像这样:

在您的笔记本电脑上

/// Encrypt your password
var myDbPassword = '122345';
var encryptedDbPassword = aws.kms.encrypt(myDbPassword, 'my-lambda-env-key');

/// Store it 'on' your Lambda function
aws.lambda.env.save('DB_PASS', encryptedDbPassword);


在您的 Lambda 函数中

然后在您的函数中,您将有逻辑在实例化时对其进行解密:

var myDbPassword = aws.kms.decrypt(process.env.DB_PASS, 'my-lambda-env-key');
db.connect('someURL', myDbPassword);


很简单,但是您输入的任何值在输入时都已经加密,它们允许您选择要用于加密值的 KMS 密钥,您可以创建自己的 KMS 密钥并使用它而不是“默认"键。

那么,在输入之前加密值有什么意义呢?如果您可以告诉 Lambda 使用您的 my-lambda-env-key 密钥进行加密,这与使用 my-lambda-env-key 密钥在将您的笔记本电脑上的值发送到 Lambda 之前对其进行加密不一样吗?

【问题讨论】:

  • 作为一个在家工作的独立开发者,我突然想到我已经忘记了 Over-The-Shoulder 攻击。我的猫很少以这种方式入侵我的数据库。
  • 我永远不会相信猫...

标签: amazon-web-services encryption aws-lambda aws-kms


【解决方案1】:

此构造有助于向 Lambda 函数的开发人员隐藏实际密码(例如,如果您将开发外包)。在这种情况下,您将 KMS 密钥提供给开发人员,而不是数据库的主密码。

然后您交付该功能,将其部署在您的 AWS 账户中,配置环境变量,您就可以开始了。这也允许您在不更改 Lambda 函数的源代码的情况下更改数据库密码。

【讨论】:

  • 这听起来很真实~ish。如果您将 KMS 密钥提供给外包开发人员,并且 KMS 密钥可用于获取数据库密码,那么如何阻止外包开发人员简单地使用 KMS 密钥和 console.logging() 数据库密码?跨度>
  • 您没有授予外包开发人员在生产环境中运行代码的权利。他们只能在开发或登台环境(使用其他密码)中运行代码。如果您使用他们的代码并在生产环境中运行它,那么您根本不需要修改它,因为实际的凭据是通过 KMS “注入”和解密的。
  • @Digitalkapitaen 我还是不明白。您的观点与在生产中使用不同的环境变量有关。它与加密无关。如果在代码中加密将由您提供的密钥解密,为什么您首先加密的问题仍然存在。
  • @Arbitrary 因为应该加密所有内容,尤其是在静止的情况下。具体来说:加密凭证并仅在实际使用凭证时对其进行解密是尽可能限制攻击面的良好做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2013-03-09
  • 1970-01-01
  • 2014-08-26
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多