

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

# 为 Amazon RDS、Amazon Aurora、Amazon Redshift 或 Amazon DocumentDB 密钥设置自动轮换
<a name="rotate-secrets_turn-on-for-db"></a>

本教程介绍了如何为数据库密钥设置 [通过 Lambda 函数进行轮换](rotate-secrets_lambda.md)。Rotation 是定期更新密钥的过程。轮换密钥时，您会同时更新密钥和数据库中的凭证。在 Secrets Manager 中，您可以为数据库密钥设置自动轮换。

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

**警告**  
要启用自动轮换，您必须有权为 Lambda 轮换函数创建 IAM 执行角色并向其附加权限策略。您需要拥有 `iam:CreateRole` 和 `iam:AttachRolePolicy` 两个权限。授予这些权限允许身份授予自己任何权限。

**Topics**
+ [步骤 1：选择轮换策略并（可选）创建超级用户密钥](#rotate-secrets_turn-on-for-db_step1)
+ [步骤 2：配置轮换并创建轮换函数](#rotate-secrets_turn-on-for-db_step2)
+ [第 3 步：（可选）为轮换函数设置额外的权限条件](#rotate-secrets_turn-on-for-db_step3)
+ [步骤 4：为轮换函数设置网络访问](#rotate-secrets_turn-on-for-db_step4)
+ [后续步骤](#rotate-secrets_turn-on-for-db_stepnext)

## 步骤 1：选择轮换策略并（可选）创建超级用户密钥
<a name="rotate-secrets_turn-on-for-db_step1"></a>

有关 Secrets Manager 提供的策略的信息，请参阅 [Lambda 函数轮换策略](rotation-strategy.md)。

如果选择 *alternating users strategy*（交替用户策略），您必须 [创建密钥](create_secret.md) 并在其中存储数据库超级用户凭证。您需要一个包含超级用户凭证的密钥，因为轮换会克隆第一个用户，而大多数用户没有该权限。请注意，Amazon RDS 代理不支持交替用户策略。

## 步骤 2：配置轮换并创建轮换函数
<a name="rotate-secrets_turn-on-for-db_step2"></a>

**为 Amazon RDS、Amazon DocumentDB 或 Amazon Redshift 密钥启用轮换**

1. 打开 Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在**密钥**列表页上，选择您的密钥。

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

1. 在**编辑轮换配置**对话框中，执行以下操作：

   1. 启用 **Automatic rotation**（自动轮换）。

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

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

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

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

   1. 在 **Rotation function**（轮换函数）下，执行以下操作之一：
      + 选择 **Create a new Lambda function**（创建新的 Lambda 函数），然后输入新函数的名称。Secrets Manager 会将 `SecretsManager` 添加到函数名称的开头。Secrets Manager 会基于相应的[模板](reference_available-rotation-templates.md)创建函数并为 Lambda 执行角色设置必要的[权限](rotating-secrets-required-permissions-function.md)。
      + 选择 **Use an existing Lambda function**（使用现有 Lambda 函数），以重复使用用于另一个密钥的轮换函数。在 **Recommended VPC configurations**（建议的 VPC 配置）下列出的轮换函数，与数据库具有相同的 VPC 和安全组，有助于函数访问数据库。

   1. 对于**轮换策略**，选择**单用户**或**交替用户**策略。有关更多信息，请参阅 [步骤 1：选择轮换策略并（可选）创建超级用户密钥](#rotate-secrets_turn-on-for-db_step1)。

1. 选择 **Save**。

## 第 3 步：（可选）为轮换函数设置额外的权限条件
<a name="rotate-secrets_turn-on-for-db_step3"></a>

我们建议您在轮换函数的资源策略中包括上下文密钥 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)，以防止 Lambda 被用作[混淆代理](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。对于某些 AWS 服务，为了避免混淆副手的情况， AWS 建议您同时使用[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)和[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)全局条件键。但如果轮换函数策略中包括 `aws:SourceArn` 条件，则轮换函数只能用于轮换该 ARN 指定的密钥。我们建议您仅在其中包括上下文键 `aws:SourceAccount`，以便对多个密钥使用轮换函数。

**更新轮换函数资源策略**

1. 在 Secrets Manager 控制台中选择您的密钥，然后在详细信息页面中的 **Rotation configuration**（轮换配置）下，选择 Lambda 轮换函数。Lambda 控制台将打开。

1. 按照 [Using resource-based policies for Lambda](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)（将基于资源的策略用于 Lambda）中的说明添加 `aws:sourceAccount` 条件。

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

如果密钥使用 AWS 托管式密钥 `aws/secretsmanager` 以外的 KMS 密钥进行加密，则 Secrets Manager 会向 Lambda 执行角色授予使用该密钥的权限。您可以使用 [SecretARN 加密上下文](security-encryption.md#security-encryption-encryption-context) 来限制解密函数的使用，从而确保轮换函数角色只能解密其负责轮换的密钥。

**更新轮换函数执行角色**

1. 从 Lambda 轮换函数中选择**配置**，然后在**执行角色**下，选择**角色名称**。

1. 按照 [修改角色权限策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy) 中的说明添加 `kms:EncryptionContext:SecretARN` 条件。

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

## 步骤 4：为轮换函数设置网络访问
<a name="rotate-secrets_turn-on-for-db_step4"></a>

有关更多信息，请参阅 [AWS Lambda 轮换功能的网络接入](rotation-function-network-access.md)。

## 后续步骤
<a name="rotate-secrets_turn-on-for-db_stepnext"></a>

请参阅[排除 AWS Secrets Manager 轮换故障](troubleshoot_rotation.md)。