使用控制台为 Amazon RDS、Amazon Redshift 或 Amazon DocumentDB 密钥设置自动轮换 - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用控制台为 Amazon RDS、Amazon Redshift 或 Amazon DocumentDB 密钥设置自动轮换

Rotation 是定期更新密钥的过程。轮换密钥时,您会同时更新密钥和数据库中的凭证。在 Secrets Manager 中,您可以为数据库密钥设置自动轮换。

Secrets Manager 会使用 Lambda 函数轮换密钥。有关概述,请参阅轮换的工作原理

提示

对于某些 由其他服务管理的密钥,可使用托管轮换。要使用 托管轮换,请首先通过管理服务来创建密钥。

要使用控制台设置轮换,您需要先选择轮换策略。然后配置密钥以进行轮换,如果您还没有 Lambda 轮换函数,这将创建一个 Lambda 轮换函数。控制台还会为 Lambda 函数执行角色设置权限。最后一步是确保 Lambda 轮换函数可以通过网络访问 Secrets Manager 和数据库。

要启用自动轮换,您必须具有创建 IAM 执行角色并向其附加权限策略的权限。您需要拥有 iam:CreateRoleiam:AttachRolePolicy 两个权限。

警告

授予身份 iam:CreateRoleiam:AttachRolePolicy 两个权限允许身份向自己授予任何权限。

步骤 1:选择轮换策略并(可选)创建超级用户密钥

对于 Amazon RDS、Amazon Redshift 和 Amazon DocumentDB,Secrets Manager 提供以下两种轮换策略:

单用户轮换策略

此策略在一个密钥中更新一个用户的凭证。用户必须具有更新密码的权限。这是最简单的轮换策略,适用于大多数使用场景。具体而言,建议您为一次性(临时)用户或交互式用户的凭证使用此策略。

轮换密钥时,不会删除打开的数据库连接。在进行轮换时,在数据库中的密码更改后一小段时间,相应的密码才会更新。在此期间,数据库有较低的风险拒绝使用轮换凭证的调用。您可以使用适当的重试策略来降低风险。轮换后,新连接将使用新凭证。

交替用户轮换策略

此策略在一个密钥中更新两个用户的凭证。您创建第一个用户,然后在第一次轮换期间,轮换函数将进行克隆以创建第二个用户。每次轮换密钥时,轮换函数都会交替更新其更新的用户密码。由于大多数用户无权克隆自己,因此您必须在另一个密钥中为 superuser 提供凭证。如果数据库中的克隆用户与原始用户具有的权限不同,或者涉及一次性(临时)用户或交互式用户的凭证,我们建议使用单用户轮换策略。

此策略适用于具有权限模型的数据库,其中一个角色拥有数据库表,而另一个角色具有访问数据库表的权限。其也适用于需要高可用性的应用程序。如果应用程序在轮换期间检索密钥,则该应用程序仍会获得一组有效的凭证。轮换后,useruser_clone 凭证均有效。在这种类型的轮换期间,应用程序获得拒绝的可能性甚至比单用户轮换获得拒绝的可能性更小。如果数据库托管在服务器场中,密码更改需要时间传播到所有服务器,则存在数据库拒绝使用新凭证的调用的风险。您可以使用适当的重试策略来降低风险。

Secrets Manager 将创建权限与原始用户相同的克隆用户。如果您在创建克隆用户后更改了原始用户的权限,则还必须更改克隆用户的权限。

重要

如果选择 alternating users strategy(交替用户策略),您必须 创建数据库密钥 并在其中存储数据库超级用户凭证。您需要一个包含超级用户凭证的密钥,因为轮换会克隆第一个用户,而大多数用户没有该权限。

步骤 2:配置轮换并创建轮换函数

适用于 Amazon RDS(Oracle 除外)和 Amazon DocumentDB 的轮换函数将自动使用安全套接字层 (SSL) 或传输层安全性 (TLS) 来连接到数据库(如果可用)。否则,他们将使用未加密的连接。

为 Amazon RDS、Amazon DocumentDB 或 Amazon Redshift 密钥启用轮换
  1. 打开 Secrets Manager 控制台:https://console.aws.amazon.com/secretsmanager/

  2. 密钥列表页上,选择您的密钥。

  3. Secret details (密钥详细信息) 页上的 Rotation configuration (轮换配置) 部分中,选择 Edit rotation (编辑轮换)

  4. 编辑轮换配置对话框中,执行以下操作:

    1. 启用 Automatic rotation(自动轮换)。

    2. Rotation schedule(轮换计划)下,在 Schedule expression builder(计划表达式生成器)或 Schedule expression(计划表达式)中,以 UTC 时区格式输入您的计划。Secrets Manager 会将您的计划存储为 rate()cron() 表达式。轮换时段将自动从午夜开始,除非您指定 Start time(开始时间)。您可以每四小时轮换一次密钥。有关更多信息,请参阅计划表达式

    3. (可选)对于 Window duration(时段持续时间),选择您希望 Secrets Manager 在其间轮换密钥的时段长度,例如 3h 表示三个小时的时段。该时段不得延伸到下一个轮换时段。如果未指定 Window duration(时段持续时间),则对于以小时为单位的轮换计划,时段将在一小时后自动关闭。对于以天为单位的轮换计划,时段将在一天结束时自动关闭。

    4. (可选)请选择 Rotate immediately when the secret is stored(在存储密钥时立即轮换),以在保存更改时轮换密钥。如果您清除该复选框,则第一次轮换将按照您设置的计划开始。

      如果轮换失败,例如因为步骤 3 和 4 尚未完成,Secrets Manager 会多次重试轮换过程。

    5. Rotation function(轮换函数)下,执行以下操作之一:

      • 选择 Create a new Lambda function(创建新的 Lambda 函数),然后输入新函数的名称。Secrets Manager 会将 SecretsManager 添加到函数名称的开头。Secrets Manager 会基于相应的模板创建函数并为 Lambda 执行角色设置必要的权限

      • 选择 Use an existing Lambda function(使用现有 Lambda 函数),以重复使用用于另一个密钥的轮换函数。在 Recommended VPC configurations(建议的 VPC 配置)下列出的轮换函数,与数据库具有相同的 VPC 和安全组,有助于函数访问数据库。

    6. 对于 Use separate credentials to rotate this secret(使用单独的凭证轮换此密钥),请执行以下操作之一:

      • 对于 single user rotation strategy(单用户轮换策略),选择 No(否)。

      • 对于 alternating users rotation strategy(交替用户轮换策略),选择 Yes(是)。然后,选择您在步骤 1 中创建的超级用户密钥。

  5. 选择 Save(保存)。

第 3 步:(可选)为轮换函数设置额外的权限条件

我们建议您在轮换函数的资源策略中包括上下文密钥 aws:SourceAccount,以防止 Lambda 被用作混淆代理。对于某些 Amazon 服务,为了避免混淆代理情况,Amazon 建议您同时使用 aws:SourceArnaws:SourceAccount 全局条件密钥。但如果轮换函数策略中包括 aws:SourceArn 条件,则轮换函数只能用于轮换该 ARN 指定的密钥。我们建议您仅在其中包括上下文键 aws:SourceAccount,以便对多个密钥使用轮换函数。

更新轮换函数资源策略
  1. 在 Secrets Manager 控制台中选择您的密钥,然后在详细信息页面中的 Rotation configuration(轮换配置)下,选择 Lambda 轮换函数。Lambda 控制台将打开。

  2. 按照 Using resource-based policies for Lambda(将基于资源的策略用于 Lambda)中的说明添加 aws:sourceAccount 条件。

    "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" } },

如果密钥使用 Amazon 托管式密钥 aws/secretsmanager 以外的 KMS 密钥进行加密,则 Secrets Manager 会向 Lambda 执行角色授予使用该密钥的权限。您可以使用 SecretARN 加密上下文 来限制解密函数的使用,从而确保轮换函数角色只能解密其负责轮换的密钥。

更新轮换函数执行角色
  1. 从 Lambda 轮换函数中选择配置,然后在执行角色下,选择角色名称

  2. 按照 修改角色权限策略 中的说明添加 kms:EncryptionContext:SecretARN 条件。

    "Condition": { "StringEquals": { "kms:EncryptionContext:SecretARN": "SecretARN" } },

步骤 4:为轮换函数设置网络访问

为了能够轮换密钥,Lambda 轮换函数必须能够访问密钥和数据库或服务。

访问密钥

Lambda 轮换功能必须能够访问 Secrets Manager 端点。如果您的 Lambda 函数可以访问互联网,则可以使用公共终端节点。若要查找端点,请参阅 Amazon Secrets Manager 端点

如果您的 Lambda 函数在不具备互联网访问权限的 VPC 中运行,我们建议您在 VPC 内配置 Secrets Manager 服务私有终端节点。然后,您的 VPC 可以拦截发往公共区域终端节点的请求并将其重定向到私有终端节点。有关更多信息,请参阅VPC 终端节点

或者,您可以通过向 VPC 添加 NAT 网关互联网网关(这将允许来自您 VPC 的流量访问公有端点),允许 Lambda 函数访问 Secrets Manager 公有端点。这会使 VPC 面临一定的风险,因为网关的 IP 地址可能会受到来自公有 Internet 的攻击。

访问数据库或服务

如果数据库或服务在 VPC 中的 Amazon EC2 实例上运行,建议将 Lambda 函数配置为在同一 VPC 中运行。然后轮换功能可以直接与您的服务通信。有关更多信息,请参阅配置 VPC 访问

要允许 Lambda 函数访问数据库或服务,您必须确保附加到 Lambda 轮换函数的安全组允许与数据库或服务的出站连接。您还必须确保附加到数据库或服务的安全组允许来自 Lambda 轮换函数进行入站连接。

对于超级用户密钥由 Amazon RDS 管理交替用户轮换策略,Lambda 轮换函数必须能够调用 Amazon RDS 服务端点以获取数据库连接信息。建议为 Amazon RDS 配置 VPC 端点。有关更多信息,请参阅《Amazon RDS 用户指南》中的 Amazon RDS API 和接口 VPC 端点

后续步骤

请参阅Amazon Secrets Manager 轮换问题排查