为 Amazon RDS 数据库密钥启用轮换 - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

为 Amazon RDS 数据库密钥启用轮换

您可以使用 AWS Secrets Manager 控制台、AWS CLI 或某个 AWS 开发工具包,为具有支持的 Amazon RDS 数据库的凭证的密钥启用轮换。

警告

启用轮换将导致在保存密钥时立即轮换一次密钥。在启用轮换之前,请确保更新使用该密钥凭证的所有应用程序以从 Secrets Manager 中检索密钥。在初始轮换后,可能无法使用原始凭证。在旧凭证失效后,您无法更新的任何应用程序将会立即中断。

先决条件:启用轮换的网络要求

要成功启用轮换,您必须正确配置网络环境。

  • Lambda 函数必须能够与数据库通信。 如果在 VPC 中运行 RDS 数据库实例,我们建议您将 Lambda 函数配置为在同一 VPC 中运行。这样可在轮换函数与服务之间启用直接连接。要配置该功能,请在 Lambda 函数详细信息页面中向下滚动到网络部分,然后从下拉列表中选择 VPC 以匹配您的实例所在的 VPC。您还必须确保附加到实例的 EC2 安全组允许在实例和 Lambda 之间进行通信。

  • Lambda 函数必须能够与 Secrets Manager 服务终端节点通信。 如果 Lambda 轮换函数可以访问 Internet(由于您未将该函数配置为在 VPC 中运行,或者 VPC 具有连接的 NAT 网关),您可以使用 Secrets Manager 的任何可用的公有终端节点。或者,如果将 Lambda 函数配置为在无法访问 Internet 的 VPC 中运行,您可以为 VPC 配置私有 Secrets Manager 服务终端节点

为支持的 Amazon RDS 数据库密钥启用和配置轮换

请按照以下选项卡之一中的步骤进行操作:

使用 AWS 管理控制台
最小权限

要在控制台中启用和配置轮换,您必须具有以下托管策略提供的权限:

  • SecretsManagerReadWrite – 提供所有 Secrets Manager、Lambda 和 AWS CloudFormation 权限。

  • IAMFullAccess – 提供创建角色并向其附加权限策略所需的 IAM 权限。

  1. 登录 AWS Secrets Manager 控制台 (https://console.amazonaws.cn/secretsmanager/)。

  2. 选择要启用轮换的密钥的名称。

  3. 配置自动轮换部分中,选择启用自动轮换。这会启用该部分中的其他控件。

  4. 对于选择轮换间隔,请选择其中一个预定义值 —,或者选择自定义,然后键入所需的轮换间隔天数。如果轮换密钥以满足合规性要求,我们建议您将该值设置为至少比合规性规定的间隔少 1 天。

    Secrets Manager 在上一次轮换完成时计划下一次轮换。Secrets Manager 通过向上次轮换的实际日期添加轮换间隔(天数)来计划日期。该服务随机选择 24 小时日期窗口中的小时。分钟也以某种方式随机选择,但会根据小时的起始进行加权并受帮助分布负载的各种因素影响。

    注意

    如果使用 Secrets Manager 提供的 Lambda 函数在两个用户之间切换(如果在下一步中选择第二个“主密钥”选项,则控制台使用该模板),您应该将轮换期设置为合规性指定的最小间隔的一半。即使当前未使用,Secrets Manager 也会将旧证书在一个额外的轮换期内保持可用。仅在第二次轮换时使用新密码更新用户后,Secrets Manager 才会使旧凭证失效。

    如果修改轮换函数以在新密钥变为活动状态后使旧凭证立即失效,则可以将轮换间隔延长到合规性规定的完整最小间隔。通过在一个额外的周期内使用 AWSPREVIOUS 暂存标签将旧凭证保持活动状态,可以提供一组可用于快速恢复的上次已知 良好的凭证。如果出现问题而导致当前凭证中断,您只需将 AWSCURRENT 暂存标签移动到具有 AWSPREVIOUS 标签的版本。然后,您的客户应该能够再次访问资源。有关更多信息,请参阅通过在两个现有用户之间交替来轮换 AWS Secrets Manager 密钥

  5. 请选择以下任一选项:

    • 您需要创建新的 Lambda 转换函数

      1. 选择 Create a new Lambda function to perform rotation (创建新的 Lambda 函数来执行轮换)

      2. 对于 Lambda 函数名称,输入要分配给 Secrets Manager 为您创建的 Lambda 函数的名称。

      3. 指定具有轮换函数可使用的凭证的密钥。这些凭证必须包含在受保护数据库上更新用户名和密码的权限。

        • 使用此密钥:如果该密钥中的凭证有权在数据库中更改密码,请选择该选项。选择该选项将导致 Secrets Manager 创建一个 Lambda 函数以轮换单个用户的密钥,并在每次轮换时更改密码。

          注意事项

          Secrets Manager 提供该选项以作为“低可用性”选项。在轮换功能删除旧密码以及更新的密码可作为密钥的新版本访问之间,可能会发生登录失败。该时间段可能非常短,数量级为一秒或更短。如果选择该选项,请确保客户端应用程序在其代码中实施了相应的“后退并使用抖动重试”策略。只有在较长时间内登录失败几次时,这些应用程序才会生成错误。

        • 使用我之前存储在 AWS Secrets Manager 中的密钥:如果当前密钥中的凭证无权进行更新,或者您要求密钥具有高可用性,请选择该选项。要选择该选项,您必须创建一个单独的主密钥,并具有有权更新密钥凭证的凭证。然后,从列表中选择主密钥。

          选择该选项将导致 Secrets Manager 创建一个 Lambda 函数,它在每次轮换时创建新用户和密码并弃用旧用户和密码以轮换密钥。

          注意事项

          Secrets Manager 提供该选项以作为“高可用性”选项,因为在准备和测试新版本时旧版本的密钥继续运行并处理服务请求。在客户端切换到新版本后,Secrets Manager 才会弃用旧版本。在版本之间进行切换时,不会发生停机。

          该选项要求 Lambda 函数克隆原始用户的权限,并将其应用于新用户。然后,该函数在每次轮换时在两个用户之间切换。

          如果您需要更改为用户授予的权限,请确保更改两个用户的权限。

    • 您需要使用您已为其他密钥创建的 Lambda 函数

      1. 选择 Use an existing Lambda function to perform rotation (使用现有 Lambda 函数来执行轮换)

      2. 从下拉列表中选择 Lambda 函数。

      3. 指定轮换函数的类型:

        • 单用户轮换:密钥的一种轮换函数,密钥存储有权更改自己的密码的用户的凭证。在您选择使用此密钥选项时,Secrets Manager 将创建这种类型的函数。

        • 多用户轮换:密钥的一种轮换函数,密钥存储无法更改其密码的用户的凭证。该函数需要使用单独的主密钥,以存储有权更改该密钥的用户凭证的用户的凭证。在选择使用我之前存储在 AWS Secrets Manager 中的密钥选项时,Secrets Manager 将创建这种类型的函数。

      4. 如果指定了第二个“主密钥”选项,您还必须选择密钥以提供主用户凭证。主密钥中的凭证必须有权更新存储在此密钥中的凭证。

  6. 选择保存以存储更改并触发初始密钥轮换。

如果您没有将 Lambda 函数的 ARN 分配给密钥,Secrets Manager 将创建该函数,分配所需的所有权限,并将该函数配置为使用您的数据库。Secrets Manager 将倒计时轮换间隔中指定的天数。当间隔到达零时,Secrets Manager 将再次轮换密钥并重置下一个周期的间隔。将继续执行该过程,直到您禁用轮换。

使用 AWS CLI 或开发工具包操作
最小权限

要在控制台中启用和配置轮换,您必须具有以下托管策略提供的权限:

  • SecretsManagerReadWrite – 提供所有 Secrets Manager、Lambda 和 AWS CloudFormation 权限。

  • IAMFullAccess – 提供创建角色并向其附加权限策略所需的 IAM 权限。

您可以使用以下 Secrets Manager 命令为支持的 Amazon RDS 数据库的现有密钥配置轮换:

您还需要使用 AWS CloudFormation 和 AWS Lambda 中的命令。有关以下命令的更多信息,请参阅这些服务的文档。

重要

轮换函数确定使用该密钥的轮换函数在密钥中使用的密钥值的确切格式。有关每个轮换函数针对密钥值需要的内容的详细信息,请参阅可用于创建 Lambda 轮换函数的 AWS 模板 中相关轮换函数下的预期的 SecretString 值条目。

使用 AWS Serverless Application Repository 模板创建 Lambda 轮换函数

以下 AWS CLI 会话示例执行与基于控制台的轮换配置等效的操作,如使用 AWS 管理控制台选项卡中所述。您可使用 AWS CloudFormation 更改集创建函数。然后,为生成的函数配置所需的权限。最后,使用完成的函数的 ARN 配置密钥,并轮换一次以对其进行测试。

以下示例使用通用模板,因此,该模板使用前面显示的最后一个 ARN。

第一个命令根据 Secrets Manager 提供的模板设置 AWS CloudFormation 更改集。

如果数据库或服务位于 Amazon VPC 提供的 VPC 中,则必须包含以下命令中的第四个以将函数配置为与 VPC 进行通信。如果您没有 VPC,则可以跳过该命令。

此外,如果您的 VPC 无权访问公有 Internet,则必须为您的 VPC 配置 Secrets Manager 私有服务终端节点。以下命令中的第五个可执行此操作。

您可以使用 --application-id 参数来指定要使用的模板。值为模板的 ARN。有关 AWS 提供的模板的列表及其 ARN,请参阅可用于创建 Lambda 轮换函数的 AWS 模板

模板还需要使用随 --parameter-overrides 提供的额外参数,如以下示例所示。轮换模板要求使用该参数,以将两条信息作为名称和值对发送到模板,从而影响创建轮换函数的过程:

  • endpoint – 您希望轮换函数查询的服务终端节点的 URL。通常为 https://secretsmanager.region.amazonaws.com

  • functionname – 该过程创建的已完成 Lambda 轮换函数的名称。

$ aws serverlessrepo create-cloud-formation-change-set \ --application-id arn:aws-cn:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate \ --parameter-overrides '[{"Name":"endpoint","Value":"https://secretsmanager.region.amazonaws.com"},{"Name":"functionName","Value":"MyLambdaRotationFunction"}]' \ --stack-name MyLambdaCreationStack { "ApplicationId": "arn:aws-cn:serverlessrepo:us-west-2:297356227824:applications/SecretsManagerRDSMySQLRotationSingleUser", "ChangeSetId": "arn:aws-cn:cloudformation:us-west-2:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE", "StackId": "arn:aws-cn:cloudformation:us-west-2:123456789012:stack/aws-serverless-repository-MyLambdaCreationStack/EXAMPLE3-90ab-cdef-fedc-ba987EXAMPLE" }

下一个命令运行刚创建的更改集。change-set-name 参数来自于上一个命令的 ChangeSetId 输出。该命令不会生成任何输出。

$ aws cloudformation execute-change-set --change-set-name arn:aws-cn:cloudformation:us-west-2:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE

以下命令为 Secrets Manager 服务授予权限以调用该函数。输出显示添加到角色信任策略的权限。

$ aws lambda add-permission \ --function-name MyLambdaRotationFunction \ --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:MyLambdaRotationFunction\"}" }

只有在 VPC 中运行数据库时,Secrets Manager 才要求使用以下命令。如果不在 VPC 上运行数据库,请跳过该命令。使用 Amazon RDS 控制台或 aws rds describe-instances 命令查找 Amazon RDS 数据库实例的 VPC 信息。然后,在以下命令中添加信息并运行该命令。

$ aws lambda update-function-configuration \ --function-name arn:aws-cn:lambda:us-west-2:123456789012:function:MyLambdaRotationFunction \ --vpc-config SubnetIds=<COMMA SEPARATED LIST OF VPC SUBNET IDS>,SecurityGroupIds=<COMMA SEPARATED LIST OF SECURITY GROUP IDs>

如果具有数据库实例和 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

如果您使用模板创建一个需要主密钥的函数,您还必须在函数角色策略中添加以下语句。此时将向轮换函数授予为主密钥检索密钥值的权限。有关完整说明,请参阅 为轮换函数授予权限以访问单独的主密钥

{ "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws-cn:secretsmanager:region:123456789012:secret:MyDatabaseMasterSecret", "Effect": "Allow" },

最后,您可以将轮换配置应用于密钥并执行初始轮换。

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

如果要为支持的 Amazon RDS 数据库创建自己的 Lambda 轮换函数,我们建议您应执行使用 SecretsManagerRotationTemplate AWS CloudFormation 模板的上述步骤。Secrets Manager 为您设置大多数权限和配置设置。