旋转 AWS Secrets Manager 其他数据库或服务的秘密 - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

旋转 AWS Secrets Manager 其他数据库或服务的秘密

如果您为支持的 Amazon RDS 数据库之一以外的其他应用程序创建密钥,则 AWS Secrets Manager 不会为您创建 Lambda 轮换函数。您必须创建并配置它,然后将已完成函数的 Amazon 资源名称 (ARN) 提供给密钥。您通过使用 Secrets Manager 控制台, AWS CLI,或 AWS SDKs.

本主题介绍了使用您创建并运行的 AWS CloudFormation 更改集以创建 Lambda 函数。然后,您附加权限。此时,您可以编辑代码以使轮换函数按所需的方式工作。最后,您将完成的函数与您的密钥相关联,以便 Secrets Manager 在每次触发轮换时调用该函数。

您可以指定必须完全实施的“通用”模板。或者,您可以选择为特定数据库或服务完全实施轮换策略的模板之一,然后将其作为起点以自定义函数,从而满足您的需求。

最小权限

要运行启用和配置轮换的命令,您必须具有以下权限:

  • serverlessrepo:CreateCloudFormationChangeSet – 创建 AWS CloudFormation 更改集以配置和创建 Lambda 轮换函数。

  • cloudformation:ExecuteChangeSet – 运行 AWS CloudFormation 更改集以创建和配置 Lambda 轮换函数。

  • lambda:AddPermission – 在创建 Lambda 轮换函数后为其添加所需的权限。

  • lambda:InvokeFunction – 将轮换函数附加到密钥。

  • lambda:UpdateFunctionConfiguration – 允许控制台更新 Lambda 函数的 VPC 配置,以便它可以与位于 VPC 中的数据库或服务进行通信。

  • secretsmanager:RotateSecret – 配置和触发初始轮换。

您可以将所有这些权限授予 IAM 用户或角色 SecretsManagerReadWrite AWS 管理策略。

以下命令将通用 SecretsManagerRotationTemplate 应用于 Lambda 函数。该模板来自于 AWS Serverless Application Repository,并由 AWS CloudFormation 使用以自动完成大多数步骤。有关您需要指定的完整模板和 ARN 集,请参阅可用于创建 Lambda 轮换函数的 AWS 模板

使用通用模板的 ARN,并完全按如下所示输入该 ARN:

arn:aws-cn:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate

如果使用您的凭证的数据库或服务位于 Amazon VPC 提供的 VPC 中,则必须在步骤 5 中包含该命令。该命令将函数配置为与该 VPC 进行通信。如果您没有 VPC,则可以跳过该命令。

将 Lambda 轮换函数创建为通用模板以进行自定义

  1. 第一个命令根据 Secrets Manager 提供的模板设置一个 AWS CloudFormation 更改集。您为模板提供两个参数:Secrets Manager 终端节点 URL 以及模板生成的 Lambda 轮换函数的名称。

    $ aws serverlessrepo create-cloud-formation-change-set \ --application-id arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate \ --stack-name MyLambdaCreationStack \ --parameter-overrides '[{"Name":"endpoint","Value":"https://secretsmanager.region.amazonaws.com"},{"Name":"functionName","Value":"MySecretsManagerRotationFunction"}]' --capabilities CAPABILITY_IAM CAPABILITY_RESOURCE_POLICY { "ApplicationId": "arn:aws-cn:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRDSMySQLRotationSingleUser", "ChangeSetId": "arn:aws-cn:cloudformation:region:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE", "StackId": "arn:aws-cn:cloudformation:region:123456789012:stack/aws-serverless-repository-MyLambdaCreationStack/EXAMPLE3-90ab-cdef-fedc-ba987EXAMPLE" }
  2. 下一个命令运行刚创建的更改集。change-set-name 参数来自于上一个命令的 ChangeSetId 输出。该命令不会生成任何输出:

    $ aws cloudformation execute-change-set --change-set-name arn:aws-cn:cloudformation:region:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE
  3. 接下来,您必须查找上一个命令为您创建的 Lambda 函数的名称。

    $ aws lambda list-functions { ... "FunctionName": "MySecretsManagerRotationFunction", "FunctionArn": "arn:aws-cn:lambda:us-west-2:123456789012:function:MySecretsManagerRotationFunction", ... }
  4. 以下命令授予 Secrets Manager 权限以调用该函数。

    $ aws lambda add-permission \ --function-name MySecretsManagerRotationFunction \ --principal secretsmanager.amazonaws.com \ --action lambda:InvokeFunction \ --statement-id SecretsManagerAccess { "Statement": "{\"Sid\":\"SecretsManagerAccess\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"secretsmanager.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws-cn:lambda:us-west-2:123456789012:function:aws-serverless-repository-SecretsManagerRDSMySQLRo-10WGBDAXQ6ZEH\"}" }
  5. 如果您在 VPC 中运行数据库,则需要使用以下命令。如果您没有 VPC,请跳过该命令。该命令将 Lambda 轮换函数配置为在运行 Amazon RDS 数据库实例的 VPC 中运行。请使用 Amazon RDS 控制台或 aws rds describe-instances CLI 命令查找 Amazon RDS 数据库实例的 VPC 信息。然后,在以下命令中添加信息并执行该命令。

    $ aws lambda update-function-configuration \ --function-name arn:aws-cn:lambda:us-west-2:123456789012:function:MySecretsManagerRotationFunction \ --vpc-config SubnetIds=<COMMA SEPARATED LIST OF VPC SUBNET IDS>,SecurityGroupIds=<COMMA SEPARATED LIST OF SECURITY GROUP IDs> \
  6. 如果具有数据库实例和 Lambda 轮换函数的 VPC 无法访问 Internet,则必须为您的 VPC 配置 Secrets Manager 私有服务终端节点。这样,轮换函数可访问位于 VPC 内终端节点的 Secrets Manager。

    $ aws ec2 create-vpc-endpoint --vpc-id <VPC ID> \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.<region>.secretsmanager \ --subnet-ids <COMMA SEPARATED LIST OF VPC SUBNET IDS> \ --security-group-ids <COMMA SEPARATED LIST OF SECURITY GROUP IDs> \ --private-dns-enabled
  7. 此时,您可以将代码输入到 Lambda 轮换函数中。

    通过以下网址打开 AWS Lambda 控制台:https://console.amazonaws.cn/lambda/

  8. 自定义代码以实施选定的轮换方案。有关详细信息,请参阅 了解并自定义您的 Lambda 旋转功能

  9. 最后,您可以将轮换配置应用于密钥并执行初始轮换。使用 --rotation-rules 参数指定连续轮换间隔的天数,并将 AutomaticallyAfterDays 设置为所需的天数。

    $ aws secretsmanager rotate-secret \ --secret-id production/MyAwesomeAppSecret \ --rotation-lambda-arn arn:aws-cn:lambda:us-west-2:123456789012:function:MySecretsManagerRotationFunction \ --rotation-rules AutomaticallyAfterDays=7

将立即轮换一次密钥,然后开始按指定的频率进行轮换。