【问题标题】:Why does not AWS Lambda automatically decrypt encrypted environment variables?为什么 AWS Lambda 不自动解密加密的环境变量?
【发布时间】:2019-12-22 08:07:31
【问题描述】:

据我在网上看到,我必须包含一段代码 sn-p 来解密使用 KMS 密钥加密的环境变量,但是有谁知道为什么必须在 lambda 函数时执行此步骤的理由已经可以访问密钥,可以即时解密值,并将解密的值传递给底层执行?

从 AWS 控制台上生成的代码复制到我的代码中:

using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Amazon.KeyManagementService;
using Amazon.KeyManagementService.Model;

namespace AWSLambda
{
    public class Function
    {
        private static string Key1Value;
        // Read values once, in the constructor
        public Function()
        {
            // Decrypt code should run once and variables stored outside of the
            // function handler so that these are decrypted once per container
            Key1Value = DecodeEnvVar("ConnString").Result;
        }
        private static async Task<string> DecodeEnvVar(string envVarName)
        {
            // Retrieve env var text
            var encryptedBase64Text = Environment.GetEnvironmentVariable(envVarName);
            // Convert base64-encoded text to bytes
            var encryptedBytes = Convert.FromBase64String(encryptedBase64Text);
            // Construct client
            using (var client = new AmazonKeyManagementServiceClient())
            {
                // Construct request
                var decryptRequest = new DecryptRequest
                {
                    CiphertextBlob = new MemoryStream(encryptedBytes),
                };
                // Call KMS to decrypt data
                var response = await client.DecryptAsync(decryptRequest);
                using (var plaintextStream = response.Plaintext)
                {
                    // Get decrypted bytes
                    var plaintextBytes = plaintextStream.ToArray();
                    // Convert decrypted bytes to ASCII text
                    var plaintext = Encoding.UTF8.GetString(plaintextBytes);
                    return plaintext;
                }
            }
        }
        public void FunctionHandler()
        {
            Console.WriteLine("Encrypted environment variable Key1 = " + Key1Value);
        }
    }
}

【问题讨论】:

    标签: encryption aws-lambda environment-variables aws-kms


    【解决方案1】:

    我想我找到了答案。加密密钥不会留在 lambda 上。加密控制台上的值是一次性操作。刷新页面,到 KMS 的链接消失了,或者用另一个用户登录,只看到 env var 上的加密值,没有附加加密密钥。

    【讨论】:

    • 确实如此。 Lambda 函数可以使用环境变量,但如果变量值被加密,它不会解密“自身”。该功能需要这样做。 KMS 是管理加密密钥的好方法。我看到许多不好的(去)加密实现,使用 AWS 库可以确保我正确完成。目前,也可以将 AWS Secret Manager 用于敏感数据(它会自动执行相同的操作,无需“一次性操作来加密值”)。
    • 我将 5 个环境变量传递给 Lambda,所有变量都使用相同的加密密钥进行加密。但是,其中 4 个会自动解密,但其中一个不会。我不知道发生了什么。因此,我必须使用函数显式解密它。
    • @RahulSatal 您能否详细说明您的 lambda 如何自动解密环境变量?
    • 检查docs.aws.amazon.com/lambda/latest/dg/env_variables.html 中的Storing Sensitive Information 部分。它说 - “当您部署您的 Lambda 函数时,您指定的所有环境变量默认在部署过程之后而不是在部署过程中进行加密。然后在调用该函数时它们由 AWS Lambda 自动解密。”跨度>
    • @RahulSatal 也许你应该在stackoverflow中提出一个问题,但你确定你的环境变量的大小没有超过4k吗? docs.aws.amazon.com/lambda/latest/dg/limits.html
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2021-02-12
    相关资源
    最近更新 更多