【问题标题】:How to encrypt Lambda variables Using cloudformation如何使用 cloudformation 加密 Lambda 变量
【发布时间】:2024-05-04 22:45:02
【问题描述】:

AWS CloudFormation 模板包含一个带有敏感环境变量的 Lambda 函数。我想设置一个 KMS 密钥并用它加密它们

添加基本的 cloudformation 以加密密钥,即使使用 aws/lambda 默认加密也可以

  LambdaFunction:
            Type: AWS::Lambda::Function
            DependsOn: LambdaRole
            Properties:
              Environment:
               Variables:
                 key: AKIAJ6W7WERITYHYUHJGHN
                 secret: PGDzQ8277Fg6+SbuTyqxfrtbskjnaslkchkY1
                 dest: !Ref dstBucket
              Code:
                ZipFile:  |
                   from __future__ import print_function
                   import os
                   import json
                   import boto3
                   import time
                   import string
                   import urllib
                   print('Loading function')
                   ACCESS_KEY_ID = os.environ['key']
                   ACCESS_SECRET_KEY = os.environ['secret']
                   #s3_bucket = boto3.resource('s3',aws_access_key_id=ACCESS_KEY_ID,aws_secret_access_key=ACCESS_SECRET_KEY)
                   s3 = boto3.client('s3',aws_access_key_id=ACCESS_KEY_ID,aws_secret_access_key=ACCESS_SECRET_KEY)
                   #s3 = boto3.client('s3')
                   def handler(event, context):
                      source_bucket = event['Records'][0]['s3']['bucket']['name']
                      key = event['Records'][0]['s3']['object']['key']
                      #key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'])

                      #target_bucket     =  "${dstBucket}"
                      target_bucket = os.environ['dest']

                      copy_source = {'Bucket':source_bucket, 'Key':key}

                      try:
                        s3.copy_object(Bucket=target_bucket, Key=key, CopySource=copy_source)

                      except Exception as e:
                        print(e)
                        print('Error getting object {} from bucket {}. Make sure they exist '
                           'and your bucket is in the same region as this '
                           'function.'.format(key, source_bucket))
                        raise e

AWS CloudFormation 模板包含一个带有敏感环境变量的 Lambda 函数。我想设置一个 KMS 密钥并用它加密它们

【问题讨论】:

  • 您使用的是 AWS 访问密钥和密钥吗?您应该考虑使用 lambda 执行角色。
  • 我正在从另一个 AWS 账户复制数据,因此我需要提供 ACCESS 密钥
  • 您应该使用更安全且最佳做法的跨账户角色

标签: aws-lambda amazon-cloudformation


【解决方案1】:

您可以通过使用 KMS 密钥对其进行加密,将访问密钥和秘密密钥存储在 AWS SSM 参数存储中。转到 AWS Systems Manager -> 参数存储 -> 创建参数。您可以选择安全字符串选项并选择要加密的 KMS 密钥。您可以通过 boto3 函数调用访问该参数。例如,response = client.get_parameter(Name='AccessKey', WithDecryption=True)。您可以使用“响应”变量来引用访问密钥。确保 Lambda 函数具有足够的权限来使用该 KMS 密钥来解密您存储的该参数。将所有必要的解密权限附加到 Lambda 使用的 IAM 角色。这样,您就不需要将访问密钥和密钥作为环境变量传递。希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您可以使用 AWS KMS 服务手动创建 KMS 密钥(或) 通过使用 CFT (https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html)

    返回值将有一个 ARN,可用于 Lambda CFT 中的 KmsKeyArn 属性

    https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-kmskeyarn

    希望对你有帮助!!

    【讨论】:

      【解决方案3】:

      您还可以使用 Secrets Manager AWS::SecretsManager::Secret CFN 资源来存储密钥值和 Cloudformation。 在您使用它们的模板中,使用 Cloudformation 动态引用从 SSM 参数存储或 Secrets Manager 中检索密钥值。

      【讨论】: