【问题标题】:how to decrypt the environment variables in aws lambda using python 3如何使用python 3解密aws lambda中的环境变量
【发布时间】:2020-07-13 07:43:54
【问题描述】:

我正在尝试加密我的 postgres 连接字符串变量。

db_host = os.environ.get('db_host')
db_port = os.environ.get('db_port')
db_name =os.environ.get('db_name')
db_user =os.environ.get('db_user')
db_pass =os.environ.get('db_pass')

如您所见,我使用了环境变量,但我想对其进行加密。

我想出了一种加密方法,同时也在检查一种解密方法。

Lambda 函数建议使用以下代码。

import boto3
import os

from base64 import b64decode

ENCRYPTED = os.environ['db_host']
# Decrypt code should run once and variables stored outside of the function
# handler so that these are decrypted once per container
DECRYPTED = boto3.client('kms').decrypt(
    CiphertextBlob=b64decode(ENCRYPTED),
    EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']}
)['Plaintext'].decode('utf-8')

def lambda_handler(event, context):
    # TODO handle the event here
    pass

问题:

  1. 我可以将它包含在包含我的 lambda 函数的同一个 .py 文件中吗?

  2. 这显示了单个变量的解密。我有多个变量,我该如何实现,以便一次性解密所有变量?

EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']} )['明文'].decode('utf-8')

什么是{'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']}

【问题讨论】:

    标签: python-3.x amazon-web-services encryption lambda


    【解决方案1】:
    1. 实际上,这取决于您的 lambda 脚本的大小。如果它是一个非常小的脚本,只有很少的解密调用,您可以将它们放在您的 Lambda 函数中。或者,如果您想分离解密调用以获得更好的可读性和可管理性,您可以创建一个函数或在不同的 .py 文件中进行解密并将其导入 lambda 函数。

    2. 您不能使用decrypt 调用来解密多个密码。您可能需要多次调用decrypt 才能完成此操作。否则,您可以将整个内容打包为逗号分隔列表或 JSON 编码数组,并将加密值存储在环境变量中。这不是推荐的方式。强烈推荐的替代解决方案是使用 SSM 参数存储来加密和存储敏感字符串。 SSM get_parameters 允许在单个 API 调用中获取多个参数。这些链接可能会有所帮助Parameter store - SecureString Parameters - boto3 ssm get_parameters

    3. EncryptionContext 是支持额外认证的非秘密数据,仅适用于对称加密。如果您使用 EncryptionContext 的键值对加密某些数据,则必须提供准确的 EncryptionContext 才能解密。在您的示例中,它仅表示您已将EncryptionContext 指定为{'LambdaFunctionName': '<your-function-name>'},因此为了解密,您必须在调用decrypt 时提供准确的EcryptionContext

    【讨论】:

      【解决方案2】:
      1. EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']} )['Plaintext'].decode('utf-8')

      这是一个 boto3 kms 解密选项。 https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/kms.html#KMS.Client.decrypt

      所以。如果要使用此选项,请先在加密时添加“Encryption Context”选项。

      例如,对于 AWS CLI

      aws kms encrypt --key-id alias/SlackKey --plaintext "hooks.slack.com/services/xxxxxxxxx" --region ap-northeast-2 --encryption-context "LambdaFunctionName=[you function name]"
      

      如上,加密时可以附加选项。

      关键是

      --encryption-context "LambdaFunctionName=[you function name]"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-17
        • 2016-07-13
        • 2019-12-22
        相关资源
        最近更新 更多