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

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

使用控制台为 Amazon RDS、Amazon Aurora、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 提供以下两种轮换策略:

单用户轮换策略

此策略在一个密钥中更新一个用户的凭证。对于 Amazon RDS Db2 实例,由于用户无法更改自己的密码,因此您必须在单独的秘密中提供管理员凭证。这是最简单的轮换策略,适用于大多数使用场景。具体而言,建议您为一次性(临时)用户或交互式用户的凭证使用此策略。

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

交替用户轮换策略

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

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

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

重要

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

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

适用于 Amazon RDS(Oracle 和 Db2 除外)和 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. 对于轮换策略,选择单用户交替用户策略。有关更多信息,请参阅步骤 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 服务管理交替用户轮换,Lambda 轮换函数必须能够调用服务端点以获取数据库连接信息。我们建议您为数据库服务配置 VPC 端点。有关更多信息,请参阅:

步骤 5:(可选)自定义轮换函数

在极少数情况下,您可能需要自定义轮换函数。例如,对于交替用户轮换,Secrets Manager 通过复制第一个用户的运行时配置参数来创建克隆用户。如果要包含更多属性,或更改授予克隆用户的属性,则需要更新 set_secret 函数中的代码。

再举一个例子,对于 Amazon RDS MySQL,在交替用户轮换中,Secrets Manager 会创建一个名称不超过 16 个字符的克隆用户。您可以修改轮换函数以允许使用更长的用户名。MySQL 5.7 及更高版本支持最多 32 个字符的用户名,但 Secrets Manager 会在用户名末尾附加“_clone”(六个字符),因此用户名最多必须保持在 26 个字符以内。

打开 Lambda 轮换函数以进行编辑
  1. 在 Secrets Manager 控制台中,选择您的密钥。

  2. Rotation configuration(轮换配置)部分下的 Lambda rotation function(Lambda 轮换函数)中,选择轮换函数。

    Lambda 控制台将打开。

    • 若要更改函数中的代码,请向下滚动到代码源部分。

    • 对于 MySQL 5.7 及更高版本,对于交替用户轮换,要更改用户名的最大长度,请在环境变量下更改 USERNAME_CHARACTER_LIMIT

后续步骤

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