

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

# AWS Secrets Manager 教程
<a name="tutorials"></a>

**Topics**
+ [

# 使用 Amazon CodeGuru Reviewer 查找代码中未受保护的机密
](integrating-codeguru.md)
+ [

# 将硬编码的机密移至 AWS Secrets Manager
](hardcoded.md)
+ [

# 将硬编码的数据库凭据移至 AWS Secrets Manager
](hardcoded-db-creds.md)
+ [

# 为用户设置交替轮换 AWS Secrets Manager
](tutorials_rotation-alternating.md)
+ [

# 为设置单用户轮换 AWS Secrets Manager
](tutorials_rotation-single.md)

# 使用 Amazon CodeGuru Reviewer 查找代码中未受保护的机密
<a name="integrating-codeguru"></a>

Amazon CodeGuru Reviewer 是一项使用程序分析和机器学习来检测开发人员难以发现的潜在缺陷的服务，并提供改进您的 Java 和 Python 代码的建议。 CodeGuru Reviewer 与 Secrets Manager 集成，可在你的代码中查找未受保护的机密。有关它能找到的机密类型，请参阅 *Amazon Reviewer 用户指南中的 CodeGuru Reviewer 检测到的 CodeGuru 机*[密类型](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/recommendations.html#secrets-found-types)。

找到硬编码的密钥后，请立即将其替换：
+ [将硬编码的数据库凭据移至 AWS Secrets Manager](hardcoded-db-creds.md)
+ [将硬编码的机密移至 AWS Secrets Manager](hardcoded.md)

# 将硬编码的机密移至 AWS Secrets Manager
<a name="hardcoded"></a>

如果代码中存在明文密钥，我们建议将其轮换并存储到 Secrets Manager 中。将密钥移动到 Secrets Manager 后，您的代码将直接从 Secrets Manager 中检索密钥，从而解决了任何看到代码的人会看到密钥的问题。轮换密钥会吊销当前硬编码的密钥，使其不再有效。

关于数据库凭证密钥，请参见[将硬编码的数据库凭据移至 AWS Secrets Manager](hardcoded-db-creds.md)。

在开始之前，您需要确定谁需要访问该密钥。我们建议使用两个 IAM 角色来管理密钥的权限：
+ 负责管理组织中的密钥的角色。有关更多信息，请参阅 [Secrets Manager 管理员权限](auth-and-access.md#auth-and-access_admin)。您将使用此角色创建和轮换密钥。
+ 可以在运行时使用密钥的角色，例如在本教程中使用的角色*RoleToRetrieveSecretAtRuntime*。您的代码将代入此角色以检索密钥。在本教程中，您将向该角色仅授予检索一个密钥值的权限，并您将使用密钥的资源策略授予权限。有关其他替代方法，请参阅[后续步骤](#hardcoded_step-next)。

**Topics**
+ [

## 第 1 步：创建密钥
](#hardcoded_step-1)
+ [

## 第 2 步：更新代码
](#hardcoded_step-2)
+ [

## 第 3 步：更新密钥
](#hardcoded_step-3)
+ [

## 后续步骤
](#hardcoded_step-next)

## 第 1 步：创建密钥
<a name="hardcoded_step-1"></a>

第一步是将现有硬编码的密钥复制到 Secrets Manager 中的密钥中。如果密钥与 AWS 资源相关，请将其存储在与该资源相同的区域。否则，请将其存储在对于您的使用场景而言延迟最低的区域中。

**创建密钥（控制台）**

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

1. 选择**存储新密钥**。

1. 在 **Choose secret type**（选择密钥类型）页面上，执行以下操作：

   1. 对于**密钥类型**，请选择**其他密钥类型**。

   1. 以 **Key/value pairs**（键值对）或者 **Plaintext**（明文）格式输入密钥。一些示例：

------
#### [ API key ]

       key/value 成对输入：

      **ClientID** : *my\$1client\$1id*

      **ClientSecret** : *wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY*

------
#### [ OAuth token ]

      输入明文：

      *AKIAI44QH8DHBEXAMPLE*

------
#### [ Digital certificate ]

      输入明文：

      ```
      -----BEGIN CERTIFICATE-----
      EXAMPLE
      -----END CERTIFICATE-----
      ```

------
#### [ Private key ]

      输入明文：

      ```
      –--- BEGIN PRIVATE KEY ----
      EXAMPLE
      ––-- END PRIVATE KEY –---
      ```

------

   1. 对于 **Encryption key**（加密密钥），选择 **aws/secretsmanager** 使用 Secrets Manager 的 AWS 托管式密钥 。使用此密钥不产生任何费用。例如，您还可以使用自己的客户管理型密钥来[访问来自其他 AWS 账户的密钥](auth-and-access_examples_cross.md)。有关使用客户托管密钥的成本的信息，请参阅 [定价](intro.md#asm_pricing)。

   1. 选择**下一步**。

1. 在 **Choose secret type**（选择密钥类型）页面上，执行以下操作：

   1. 输入一个描述性的 **Secret name**（密钥名称）和 **Description**（说明）。

   1. 在 **Resource permissions**（资源权限）中，选择 **Edit permissions**（编辑权限）。粘贴以下允许*RoleToRetrieveSecretAtRuntime*检索密钥的策略，然后选择 “**保存**”。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:role/RoleToRetrieveSecretAtRuntime"
                  },
                  "Action": "secretsmanager:GetSecretValue",
                  "Resource": "*"
              }
          ]
      }
      ```

------

   1. 在页面底部，选择**下一步**。

1. 在 **Configure rotation**（配置轮换）页面上，将轮换禁用。选择**下一步**。

1. 在 **Review (审核)** 页上，审核您的密钥详细信息，然后选择 **Store (存储)**。

## 第 2 步：更新代码
<a name="hardcoded_step-2"></a>

您的代码必须担任 IAM 角色*RoleToRetrieveSecretAtRuntime*才能检索密钥。有关更多信息，请参阅[切换到 IAM 角色 (AWS API)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-api.html)。

然后，您可以使用 Secrets Manager 提供的示例代码更新您的代码，以检索 Secrets Manager 中的密钥。

**查找示例代码**

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

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

1. 向下滚动到 **Sample code**（示例代码）。选择您的编程语言，然后复制代码片段。

移除应用程序中的硬编码密钥并粘贴此代码片段。根据代码语言的不同，您可能需要在片段中添加对函数或方法的调用。

使用密钥代替硬编码密钥，测试您的应用程序是否符合预期。

## 第 3 步：更新密钥
<a name="hardcoded_step-3"></a>

最后一步是吊销并更新硬编码的密钥。请参阅密钥的来源以查找吊销和更新密钥的说明。例如，您可能需要停用当前密钥并生成一个新密钥。

**用新值更新密钥**

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

1. 选择 **Secrets**（密钥），然后选择该密钥。

1. 在 **Secret details**（密钥详细信息）页面上，向下滚动并选择 **Retrieve secret value**（检索密钥值），然后选择 **Edit**（编辑）。

1. 更新密钥然后选择 **Save**（保存）。

然后，测试您的应用程序按照预期那样在使用新密钥。

## 后续步骤
<a name="hardcoded_step-next"></a>

从代码中移除硬编码的密钥后，接下来需要注意以下事项：
+ 要在你的 Java 和 Python 应用程序中查找硬编码的机密，我们建议使用 [Amazon CodeGuru Reviewer](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/welcome.html)。
+ 您可以通过缓存密钥来提高性能并降低成本。有关更多信息，请参阅 [从中获取秘密 AWS Secrets Manager](retrieving-secrets.md)。
+ 对于从多个区域访问的密钥，请考虑复制密钥以减少延迟。有关更多信息，请参阅 [跨区域复制 AWS Secrets Manager 密钥](replicate-secrets.md)。
+ 在本教程中，您*RoleToRetrieveSecretAtRuntime*仅授予了检索密钥值的权限。要向角色授予更多权限（例如获取有关密钥的元数据或查看密钥列表），请参阅[基于资源的策略](auth-and-access_resource-policies.md)。
+ 在本教程中，您使用密钥的资源策略授予了权限。*RoleToRetrieveSecretAtRuntime*有关授予权限的其他方法，请参阅[基于身份的策略](auth-and-access_iam-policies.md)。

# 将硬编码的数据库凭据移至 AWS Secrets Manager
<a name="hardcoded-db-creds"></a>

如果代码中存在明文数据库凭证，我们建议您将凭证移动到 Secrets Manager，然后立即将其轮换。将凭证移动到 Secrets Manager 后，您的代码将直接从 Secrets Manager 中检索凭证，从而解决了任何看到代码的人会看到凭证的问题。轮换密钥会更新密码，然后吊销当前硬编码的密码，使其不再有效。

对于 Amazon RDS、Amazon Redshift 和 Amazon DocumentDB 数据库，请使用本页中的步骤将硬编码的凭证移动到 Secrets Manager。对于其他类型的凭证和其他密钥，请参阅[将硬编码的机密移至 AWS Secrets Manager](hardcoded.md)。

在开始之前，您需要确定谁需要访问该密钥。我们建议使用两个 IAM 角色来管理密钥的权限：
+ 负责管理组织中的密钥的角色。有关更多信息，请参阅 [Secrets Manager 管理员权限](auth-and-access.md#auth-and-access_admin)。您将使用此角色创建和轮换密钥。
+ 在本教程中，一个可以在运行时使用凭据*RoleToRetrieveSecretAtRuntime*的角色。您的代码将代入此角色以检索密钥。

**Topics**
+ [

## 第 1 步：创建密钥
](#hardcoded-db-creds_step2)
+ [

## 第 2 步：更新代码
](#hardcoded-db-creds_step3)
+ [

## 步骤 3：轮换秘密
](#hardcoded-db-creds_step5)
+ [

## 后续步骤
](#hardcoded-db-creds_nextsteps)

## 第 1 步：创建密钥
<a name="hardcoded-db-creds_step2"></a>

第一步是将现有硬编码的凭证复制到 Secrets Manager 中的密钥中。为了实现低延迟，可将密钥存储在与数据库相同的区域中。

**创建密钥**

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

1. 选择**存储新密钥**。

1. 在 **Choose secret type**（选择密钥类型）页面上，执行以下操作：

   1. 对于**密钥类型**，选择要存储的数据库凭证类型：
      + **Amazon RDS 数据库**
      + **Amazon DocumentDB 数据库**
      + **Amazon Redshift 数据仓库**。
      + 有关其他类型的密钥，请参阅[替换硬编码的密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/hardcoded.html)。

   1. 对于**凭证**，请输入数据库现有的硬编码凭证。

   1. 对于 **Encryption key**（加密密钥），选择 **aws/secretsmanager** 使用 Secrets Manager 的 AWS 托管式密钥 。使用此密钥不产生任何费用。例如，您还可以使用自己的客户管理型密钥来[访问来自其他 AWS 账户的密钥](auth-and-access_examples_cross.md)。有关使用客户托管密钥的成本的信息，请参阅 [定价](intro.md#asm_pricing)。

   1. 对于 **Database**（数据库），请选择您的数据库。

   1. 选择**下一步**。

1. 在 **Configure secret**（配置密钥）页面上，执行以下操作：

   1. 输入一个描述性的 **Secret name**（密钥名称）和 **Description**（说明）。

   1. 在 **Resource permissions**（资源权限）中，选择 **Edit permissions**（编辑权限）。粘贴以下*RoleToRetrieveSecretAtRuntime*允许检索密钥的策略，然后选择**保存**。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:role/RoleToRetrieveSecretAtRuntime"
                  },
                  "Action": "secretsmanager:GetSecretValue",
                  "Resource": "*"
              }
          ]
      }
      ```

------

   1. 在页面底部，选择**下一步**。

1. 在 **Configure rotation**（配置轮换）页面上，暂时将轮换禁用。稍后您会将其启用。选择**下一步**。

1. 在 **Review (审核)** 页上，审核您的密钥详细信息，然后选择 **Store (存储)**。

## 第 2 步：更新代码
<a name="hardcoded-db-creds_step3"></a>

您的代码必须担任 IAM 角色*RoleToRetrieveSecretAtRuntime*才能检索密钥。有关更多信息，请参阅[切换到 IAM 角色 (AWS API)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-api.html)。

然后，您可以使用 Secrets Manager 提供的示例代码更新您的代码，以检索 Secrets Manager 中的密钥。

**查找示例代码**

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

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

1. 向下滚动到 **Sample code**（示例代码）。选择您的语言，然后复制代码片段。

移除应用程序中的硬编码凭证并粘贴此代码片段。根据代码语言的不同，您可能需要在片段中添加对函数或方法的调用。

使用密钥代替硬编码凭证，测试您的应用程序是否符合预期。

## 步骤 3：轮换秘密
<a name="hardcoded-db-creds_step5"></a>

最后一步是通过轮换密钥来吊销硬编码的凭证。*Rotation* 是定期更新密钥的过程。轮换密钥时，您会同时更新密钥和数据库中的凭证。Secrets Manager 可以按照您设定的计划自动为您轮换密钥。

设置轮换包括确保 Lambda 轮换函数可以访问 Secrets Manager 和您的数据库。启用自动轮换后，Secrets Manager 会与您的数据库相同的 VPC 中创建 Lambda 轮换函数，以确保它拥有数据库的网络访问权限。Lambda 轮换函数还必须能够调用 Secrets Manager 以更新密钥。我们建议您在 VPC 中创建一个 Secrets Manager 终端节点，这样从 Lambda 到 Secrets Manager 的调用就不会离开基础架构 AWS 。有关说明，请参阅[使用 AWS Secrets Manager VPC 终端节点](vpc-endpoint-overview.md)。

**启用轮换**

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**（轮换计划）下，以 UTC 时区格式输入您的计划。

   1. 选择 **Rotate immediately when the secret is stored**（在存储密钥时立即轮换），以在保存更改时轮换密钥。

   1. 在 **Rotation function**（轮换函数）下，选择 **Create a new Lambda function**（创建新的 Lambda 函数），然后为新函数输入一个名称。Secrets Manager 将 "SecretsManager" 添加到您的函数名称的开头。

   1. 对于**轮换策略**，选择**单用户**。

   1. 选择**保存**。

**检查密钥是否已轮换**

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

1. 选择 **Secrets**（密钥），然后选择该密钥。

1. 在 **Secret details**（秘密详细信息）页面上，向下滚动并选择 **Retrieve secret value**（检索秘密值）。

   如果密钥值改变，则说明轮换已经成功。如果密钥值没有更改，则需要[轮换问题排查](troubleshoot_rotation.md)查看轮换功能的 CloudWatch 日志。

测试您的应用程序按照预期那样在使用轮换后的密钥。

## 后续步骤
<a name="hardcoded-db-creds_nextsteps"></a>

从代码中移除硬编码的密钥后，接下来需要注意以下事项：
+ 您可以通过缓存密钥来提高性能并降低成本。有关更多信息，请参阅 [从中获取秘密 AWS Secrets Manager](retrieving-secrets.md)。
+ 您可以选择不同的轮换计划。有关更多信息，请参阅 [轮换计划](rotate-secrets_schedule.md)。
+ 要在你的 Java 和 Python 应用程序中查找硬编码的机密，我们建议使用 [Amazon CodeGuru Reviewer](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/welcome.html)。

# 为用户设置交替轮换 AWS Secrets Manager
<a name="tutorials_rotation-alternating"></a>

在本教程中，您将学习如何为包含数据库凭证的秘密设置交替用户轮换。*Alternating users rotation*（交替用户轮换）是一种轮换策略，在该策略中，Secrets Manager 将克隆用户，然后替换被更新的那些用户凭证。如果您需要为密钥实现高可用性，则此策略是一个不错的选择，因为其中一个交替用户拥有数据库的最新凭证，而另一个则正在更新。有关更多信息，请参阅 [轮换策略：交替用户](rotation-strategy.md#rotating-secrets-two-users)。

要设置交替用户轮换，您需要两个秘密：
+ 其中一个秘密包含您想轮换的凭证。
+ 具有管理员凭证的第二个密钥。

  此用户有权克隆第一个用户并更改第一个用户的密码。在本教程中，您将让 Amazon RDS 为管理员用户创建此密钥。Amazon RDS 还会管理管理员密码轮换。有关更多信息，请参阅 [AWS Secrets Manager 密钥的托管轮换](rotate-secrets_managed.md)。

本教程的第一部分内容是介绍如何设置真实环境。为了向您展示轮换的工作原理，本教程使用了一个示例 Amazon RDS MySQL 数据库。为了安全起见，数据库位于限制入站互联网访问的 VPC 中。要通过互联网从本地电脑连接到数据库，请使用*堡垒主机*，它是 VPC 中可以连接到数据库的服务器，但也允许从互联网进行 SSH 连接。本教程中的堡垒主机是 Amazon EC2 实例，该实例的安全组会阻止其他类型的连接。

完成本教程后，我们建议您清理教程中的资源。请勿在生产环境中使用它们。

Secrets Manager 轮换使用 AWS Lambda 函数来更新密钥和数据库。有关使用 Lambda 函数的成本的信息，请参阅 [定价](intro.md#asm_pricing)。

**Topics**
+ [

## Permissions
](#tutorials_rotation-alternating-permissions)
+ [

## 先决条件
](#tutorials_rotation-alternating-step-setup)
+ [

## 步骤 1：创建 Amazon RDS 数据库用户
](#tutorials_rotation-alternating-step-database)
+ [

## 步骤 2：为用户凭证创建秘密
](#tutorials_rotation-alternating_step-rotate)
+ [

## 步骤 3：测试已轮换的秘密
](#tutorials_rotation-alternating_step-test-secret)
+ [

## 步骤 4：清理资源
](#tutorials_rotation-alternating_step-cleanup)
+ [

## 后续步骤
](#tutorials_rotation-alternating_step-next)

## Permissions
<a name="tutorials_rotation-alternating-permissions"></a>

本教程的先决条件为，您需要对 AWS 账户的管理权限。在生产环境中，最佳实践是为每个步骤使用不同的角色。例如，具有数据库管理员权限的角色将创建 Amazon RDS 数据库，而具有网络管理员权限的角色将设置 VPC 和安全组。在执行教程步骤时，我们建议您继续使用相同身份。

有关如何在生产环境中设置权限的信息，请参阅 [的身份验证和访问控制 AWS Secrets Manager](auth-and-access.md)。

## 先决条件
<a name="tutorials_rotation-alternating-step-setup"></a>

**Topics**
+ [

### 先决条件 A：Amazon VPC
](#tutorials_rotation-alternating-step-vpc)
+ [

### 先决条件 B：Amazon EC2 实例
](#tutorials_rotation-alternating-step-setup_ec2)
+ [

### 先决条件 C：Amazon RDS 数据库和管理员凭证的 Secrets Manager 密钥
](#tutorials_rotation-alternating-step-database)
+ [

### 先决条件 D：允许本地计算机连接到 EC2 实例
](#tutorials_rotation-alternating-step-ec2connect)

### 先决条件 A：Amazon VPC
<a name="tutorials_rotation-alternating-step-vpc"></a>

在此步骤中，您将创建可在其中启动 Amazon RDS 数据库和 Amazon EC2 实例的 VPC。在后续步骤中，您将使用计算机通过互联网连接到堡垒机，然后连接到数据库，因此您需要允许来自 VPC 的流量。为此，Amazon VPC 会将互联网网关连接到 VPC 并在路由表中添加路由，以将发往 VPC 外部的流量发送到互联网网关。

在 VPC 中，您可以创建一个 Secrets Manager 端点和一个 Amazon RDS 端点。在稍后的步骤中设置自动轮换时，Secrets Manager 会在 VPC 内创建 Lambda 轮换函数，以便它可以访问数据库。Lambda 轮换函数还会调用 Secrets Manager 来更新密钥，并调用 Amazon RDS 来获取数据库连接信息。通过在 VPC 内创建终端节点，您可以确保从 Lambda 函数对 Secrets Manager 和 Amazon RDS 的调用不会离开 AWS 基础设施。相反，这些调用将被路由到 VPC 内的端点。

**创建 VPC**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 选择**创建 VPC**。

1. 在 **Create VPC**（创建 VPC）页面上，选择 **VPC and more**（VPC 等）。

1. 在 **Name tag auto-generation**（名称标签自动生成）下的 **Auto-generate**（自动生成）下，输入 **SecretsManagerTutorial**。

1. 对于 **DNS options**（DNS 选项），请同时选择 **Enable DNS hostnames** 和 **Enable DNS resolution**。

1. 选择**创建 VPC**。

**在 VPC 内创建 Secrets Manager 端点**

1. 在 Amazon VPC 控制台的 **Endpoints**（端点）下，选择 **Create Endpoint**（创建端点）。

1. 在 **Endpoint settings**（端点设置）下，为 **Name**（名称）输入 **SecretsManagerTutorialEndpoint**。

1. 在 **Services**（服务）下，输入 **secretsmanager** 以筛选列表，然后在您的 AWS 区域中选择 Secrets Manager 端点。例如，在美国东部（弗吉尼亚州北部），选择 `com.amazonaws.us-east-1.secretsmanager`。

1. 对于 **VPC**，选择 **vpc\$1\$1\$1\$1 (SecretsManagerTutorial)**。

1. 对于 **Subnets**（子网），选择所有 **Availability Zones**（可用性区域），然后对于每个区域，选择要包含的 **Subnet ID**（子网 ID）。

1. 对于 **IP address type**（IP 地址类型），选择 **IPv4**。

1. 对于 **Security groups**（安全组），选择默认安全组。

1. 对于 **Policy**（策略），选择 **Full access**。

1. 选择**创建端点**。

**在 VPC 内创建 Amazon RDS 端点**

1. 在 Amazon VPC 控制台的 **Endpoints**（端点）下，选择 **Create Endpoint**（创建端点）。

1. 在 **Endpoint settings**（端点设置）下，为 **Name**（名称）输入 **RDSTutorialEndpoint**。

1. 在 **Services**（服务）下，输入 **rds** 以筛选列表，然后在您的 AWS 区域中选择 Amazon RDS 端点。例如，在美国东部（弗吉尼亚州北部），选择 `com.amazonaws.us-east-1.rds`。

1. 对于 **VPC**，选择 **vpc\$1\$1\$1\$1 (SecretsManagerTutorial)**。

1. 对于 **Subnets**（子网），选择所有 **Availability Zones**（可用性区域），然后对于每个区域，选择要包含的 **Subnet ID**（子网 ID）。

1. 对于 **IP address type**（IP 地址类型），选择 **IPv4**。

1. 对于 **Security groups**（安全组），选择默认安全组。

1. 对于 **Policy**（策略），选择 **Full access**。

1. 选择**创建端点**。

### 先决条件 B：Amazon EC2 实例
<a name="tutorials_rotation-alternating-step-setup_ec2"></a>

您在后续步骤中创建的 Amazon RDS 数据库将位于 VPC 中，因此要访问它，您需要堡垒主机。该堡垒主机也位于 VPC 中，但在稍后步骤中，您将配置一个安全组，以允许本地计算机使用 SSH 连接到堡垒主机。

**为堡垒主机创建 EC2 实例**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 选择 **Instances**（实例），然后选择 **Launch Instances**（启动实例）。

1. 在 **Name and tags**（名称和标签）下，对于 **Name**（名称），输入 **SecretsManagerTutorialInstance**。

1. 在 **Application and OS Images**（应用程序和操作系统映像）下，保留默认值 **Amazon Linux 2 AMI (HMV) Kernel 5.10**。

1. 在 **Instance type**（实例类型）下，保留默认值 **t2.micro**。

1. 在 **Key pair**（密钥对）下，选择 **Create key pair**（创建密钥对）。

   在 **Create key pair**（创建密钥对）对话框中，对于 **Key pair name**（密钥对名称），输入 **SecretsManagerTutorialKeyPair**，然后选择 **Create key pair**（创建密钥对）。

   此时会自动下载密钥对。

1. 在 **Network settings**（网络设置）下，选择 **Edit**（编辑），然后执行以下操作：

   1. 对于 **VPC**，选择 **vpc-\$1\$1\$1\$1 SecretsManagerTutorial**。

   1. 对于 **Auto-assign Public IP**（自动分配公有 IP），选择 **Enable**。

   1. 对于 **Firewall**（防火墙），选择 **Select existing security group**（选择现有安全组）。

   1. 对于 **Common security groups**（常见安全组），选择 **default**。

1. 选择**启动实例**。

### 先决条件 C：Amazon RDS 数据库和管理员凭证的 Secrets Manager 密钥
<a name="tutorials_rotation-alternating-step-database"></a>

在此步骤中，您将创建一个 Amazon RDS MySQL 数据库并对其进行配置，以便 Amazon RDS 创建包含管理员凭证的密钥。然后，Amazon RDS 会自动为您管理管理员密钥的轮换。有关更多信息，请参阅 [托管轮换](rotate-secrets_managed.md)。

在创建数据库过程中，请指定您在上一步中创建的堡垒主机。然后，Amazon RDS 会设置安全组，以便数据库和实例能够相互访问。您可向连接到实例的安全组添加规则，以允许您的本地计算机也连接到该实例。

**使用包含管理员凭证的 Secrets Manager 密钥创建 Amazon RDS 数据库**

1. 在 Amazon RDS 控制台中，选择 **Create database**（创建数据库）。

1. 在 **Engine options**（引擎选项）部分，为 **Engine type**（引擎类型）选择 **MySQL**。

1. 在 **Templates**（模板）部分，选择 **Free tier**。

1. 在 **Settings**（设置）部分，执行以下操作：

   1. 对于 **DB instance identifier**（数据库实例标识符），输入 **SecretsManagerTutorial**。

   1. 在 “**凭据设置”** 下，选择**中的管理主凭证。 AWS Secrets Manager**

1. 在 **Connectivity**（连接）部分，对于 **Computer resource**（计算机资源），选择 **Connect to an EC2 computer resource**（连接到 EC2 计算机资源），然后对于 **EC2 Instance**（EC2 实例），选择 **SecretsManagerTutorialInstance**。

1. 选择**创建数据库**。

### 先决条件 D：允许本地计算机连接到 EC2 实例
<a name="tutorials_rotation-alternating-step-ec2connect"></a>

在此步骤中，您将在“先决条件 B”中创建的 EC2 实例配置为允许本地计算机连接到该实例。为此，您将编辑 Amazon RDS 在“先决条件 C”中添加的安全组，使其包含允许您的计算机的 IP 地址与 SSH 连接的规则。该规则允许本地计算机（通过当前 IP 地址识别）通过 Internet 使用 SSH 连接到堡垒主机。

**允许本地计算机连接到 EC2 实例**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在 EC2 实例上 **SecretsManagerTutorialInstance**，在 “**安全**” 选项卡上的 “**安全组**” 下，选择**sg-\$1\$1\$1 (ec2-rds-X)**。

1. 在 **Input rules**（输入规则）下，选择**Edit inbound rules**（编辑入站规则）。

1. 选择 **Add rule**（添加规则），然后对该规则执行以下操作：

   1. 对于**类型**，选择 **SSH**。

   1. 对于 **Source type**（源类型），选择 **My IP**。

## 步骤 1：创建 Amazon RDS 数据库用户
<a name="tutorials_rotation-alternating-step-database"></a>

首先，您需要一个用户，其凭证将被存储在秘密中。要创建用户，请使用管理员凭证登录 Amazon RDS 数据库。为简单起见，在本教程中，您将创建具有数据库完全权限的用户。在生产环境中，这并不常见，建议您遵循最低权限原则。

要连接到数据库，请使用 MySQL 客户端工具。在本教程中，您将使用基于 GUI 的应用程序 MySQL Workbench。要安装 MySQL Workbench，请参阅[下载 MySQL Workbench](http://dev.mysql.com/downloads/workbench/)。

要连接到数据库，请在 MySQL Workbench 中创建连接配置。对于配置，您需要获得来自 Amazon EC2 和 Amazon RDS 的一些信息。

**在 MySQL Workbench 中创建数据库连接**

1. 在 MySQL Workbench 中，选择 **MySQL Connections**（MySQL 连接）旁边的 (\$1) 按钮。

1. 在 **Setup New Connection**（设置新连接）对话框中，执行以下操作：

   1. 对于 **Connection Name**（连接名称），输入 **SecretsManagerTutorial**。

   1. 对于 **Connection Method**（连接方法），选择 **Standard TCP/IP over SSH**。

   1. 在 **Parameters**（参数）选项卡上，执行以下操作：

      1. 对于 **SSH Hostname**（SSH 主机名），输入 Amazon EC2 实例的公有 IP 地址。

         您可以通过选择实例在 Amazon EC2 控制台上找到 IP 地址**SecretsManagerTutorialInstance**。复制 “**公共 IPv4 DNS**” 下的 IP 地址。

      1. 对于 **SSH Username**（SSH 用户名），输入 **ec2-user**。

      1. 对于 **SSH Keyfile**，请选择您在前面的先决条件中下载的密钥对文件 **SecretsManagerTutorialKeyPair.pem**。

      1. 对于 **MySQL Hostname**（MySQL 主机名），输入 Amazon RDS 端点地址。

         您可以在 Amazon RDS 控制台上通过选择数据库实例 **secretsmanagertutorialdb** 查找端点地址。复制 **Endpoint**（端点）下的地址。

      1. 对于 **Username**（用户名），输入 **admin**。

   1. 选择**确定**。

**检索管理员密码**

1. 在 Amazon RDS 控制台中，导航到您的数据库。

1. 在 **Configuration**（配置）选项卡的 **Master Credentials ARN**（主凭证 ARN）下，选择 **Manage in Secrets Manager**（在 Secrets Manager 中管理）。

   此时将打开 Secrets Manager 控制台。

1. 在密钥详细信息页面上，选择 **Retrieve secret value**（检索密钥值）。

1. 密码显示在 **Secret value**（密钥值）部分中。

**创建数据库用户**

1. 在 MySQL 工作台中，选择连接**SecretsManagerTutorial**。

1. 输入从密钥中检索到的管理员密码。

1.  在 MySQL Workbench 中，在 **Query**（查询）窗口中，输入以下命令（包括强密码），然后选择 **Execute**（执行）。轮换函数使用 SELECT 测试更新的密钥，因此 **appuser** 必须至少具有该权限。

   ```
   CREATE DATABASE myDB;
   CREATE USER 'appuser'@'%' IDENTIFIED BY 'EXAMPLE-PASSWORD';
   GRANT SELECT ON myDB . * TO 'appuser'@'%';
   ```

   在 **Output**（输出）窗口中，您会看到这些命令执行成功。

## 步骤 2：为用户凭证创建秘密
<a name="tutorials_rotation-alternating_step-rotate"></a>

接下来，您将创建秘密，用于存储您刚创建的用户凭证。这是您将要轮换的秘密。启用自动轮换，要指示交替用户策略，您应选择一个单独的超级用户秘密，它应有权限更改第一个用户的密码。

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

1. 选择**存储新密钥**。

1. 在 **Choose secret type**（选择密钥类型）页面上，执行以下操作：

   1. 对于 **Secret type**（秘密类型），选择 **Credentials for Amazon RDS database**（Amazon RDS 数据库凭证）。

   1. 对于 **Credentials**（凭证），输入用户名 **appuser**，以及您为使用 MySQL Workbench 创建的数据库用户输入的密码。

   1. 对于 **Database**（数据库），选择 **secretsmanagertutorialdb**。

   1. 选择**下一步**。

1. 在 **Configure secret**（配置密钥）页面上，对于 **Secret name**（密钥名称），输入 **SecretsManagerTutorialAppuser**，然后选择 **Next**（下一步）。

1. 在 **Configure rotation**（配置轮换）页面上，执行以下操作：

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

   1. 对于 **Rotation schedule**（轮换计划），设置计划 **Days**（天数）：**2** 天，以及 **Duration**（持续时间）：**2h**。使 **Rotate immediately**（立即轮换）处于已选择状态。

   1. 对于 **Rotation function**（轮换函数），选择 **Create a rotation function**（创建轮换函数），然后对于函数名称，输入 **tutorial-alternating-users-rotation**。

   1. 对于**轮换策略**，选择**交替用户**，然后在**管理员凭证密钥**下，选择名为 **rds\$1cluster...**，并且**描述**包含您在本教程 **secretsmanagertutorial** 中所创建数据库的名称的密钥，例如 `Secret associated with primary RDS DB instance: arn:aws:rds:Region:AccountId:db:secretsmanagertutorial`。

   1. 选择**下一步**。

1. 在 **Review**（检查）页面上，选择 **Store**（存储）。

   Secrets Manager 会返回到密钥详细信息页面。您可以在该页面顶部查看轮换配置状态。Secrets CloudFormation Manager 用于创建资源，例如 Lambda 轮换函数和运行 Lambda 函数的执行角色。 CloudFormation 完成后，横幅将变**为预定轮换的 Secret**。第一次轮换已完成。

## 步骤 3：测试已轮换的秘密
<a name="tutorials_rotation-alternating_step-test-secret"></a>

在密钥轮换后，您可以检查该密钥是否包含有效凭证。秘密中的密码已从原始凭证发生更改。

**从秘密中检索新密码**

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

1. 选择 **Secrets**（秘密），然后选择秘密 **SecretsManagerTutorialAppuser**。

1. 在 **Secret details**（秘密详细信息）页面上，向下滚动并选择 **Retrieve secret value**（检索秘密值）。

1. 在 **Key/value**（键/值）表中，为 **password** 复制 **Secret value**（秘密值）。

**测试凭证**

1. 在 MySQL Workbench 中，右键单击该连接，**SecretsManagerTutorial**然后选择 “**编辑连接”**。

1. 在 **Manage Server Connections**（管理服务器连接）对话框中，对于 **Username**（用户名），输入 **appuser**，然后选择 **Close**（关闭）。

1. 回到 MySQL 工作台，选择连接**SecretsManagerTutorial**。

1. 在 **Open SSH Connection**（打开 SSH 连接）对话框中，对于 **Password**（密码），粘贴您从秘密中检索到的密码，然后选择 **OK**（确定）。

   如果凭证有效，则 MySQL Workbench 将打开至数据库的设计页面。

这表明秘密轮换是成功的。秘密中的凭证已更新，它是用于连接到数据库的有效密码。

## 步骤 4：清理资源
<a name="tutorials_rotation-alternating_step-cleanup"></a>

如果您想尝试另一种轮换策略*单用户轮换*，请跳过清理资源，然后转到 [为设置单用户轮换 AWS Secrets Manager](tutorials_rotation-single.md)。

否则，为了避免潜在费用，并删除有权访问互联网的 EC2 实例，请删除您在本教程及其先决条件中创建的以下资源：
+ Amazon RDS 数据库实例。有关说明，请参阅《*Amazon RDS 用户指南*》中的[删除数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DeleteInstance.html)。
+ Amazon EC2 实例。有关说明，请参阅《*Amazon EC2 用户指南*》中的[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#terminating-instances-console)。
+ Secrets Manager 秘密 `SecretsManagerTutorialAppuser`。有关说明，请参阅[删除密 AWS Secrets Manager 钥](manage_delete-secret.md)。
+ Secrets Manager 端点。有关说明，请参阅《*AWS PrivateLink 指南*》中的[删除 VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/delete-vpc-endpoint.html)。
+ VPC 端点。有关说明，请参阅《*AWS PrivateLink 指南*》中的[删除 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#VPC_Deleting)。

## 后续步骤
<a name="tutorials_rotation-alternating_step-next"></a>
+ 了解如何[在您的应用程序中检索密钥](retrieving-secrets.md)。
+ 了解[其他轮换计划](rotate-secrets_schedule.md)。

# 为设置单用户轮换 AWS Secrets Manager
<a name="tutorials_rotation-single"></a>

在本教程中，您将学习如何为包含数据库凭证的密钥设置单用户轮换。*单用户轮换*是一种轮换策略，在该策略中，Secrets Manager 将同时在密钥和数据库中更新用户的凭证。有关更多信息，请参阅 [轮换策略：单用户](rotation-strategy.md#rotating-secrets-one-user-one-password)。

完成本教程后，我们建议您清理教程中的资源。请勿在生产环境中使用它们。

Secrets Manager 轮换使用 AWS Lambda 函数来更新密钥和数据库。有关使用 Lambda 函数的成本的信息，请参阅 [定价](intro.md#asm_pricing)。

**Contents**
+ [

## Permissions
](#tutorials_rotation-single_permissions)
+ [

## 先决条件
](#tutorials_rotation-single_step-setup)
+ [

## 步骤 1：创建 Amazon RDS 数据库用户
](#tutorials_rotation-single_step-dbuser)
+ [

## 步骤 2：为数据库用户凭证创建密钥
](#tutorials_rotation-single_step-rotate)
+ [

## 步骤 3：测试轮换的密码
](#tutorials_rotation-single_step-connect-again)
+ [

## 步骤 4：清理资源
](#tutorials_rotation-single_step-cleanup)
+ [

## 后续步骤
](#tutorials_rotation-single_step-next)

## Permissions
<a name="tutorials_rotation-single_permissions"></a>

本教程的先决条件为，您需要对 AWS 账户的管理权限。在生产环境中，最佳实践是为每个步骤使用不同的角色。例如，具有数据库管理员权限的角色将创建 Amazon RDS 数据库，而具有网络管理员权限的角色将设置 VPC 和安全组。在执行教程步骤时，我们建议您继续使用相同身份。

有关如何在生产环境中设置权限的信息，请参阅 [的身份验证和访问控制 AWS Secrets Manager](auth-and-access.md)。

## 先决条件
<a name="tutorials_rotation-single_step-setup"></a>

本教程的先决条件是 [为用户设置交替轮换 AWS Secrets Manager](tutorials_rotation-alternating.md)。在第一个教程结束时，请不要清理资源。在该教程之后，您将拥有一个现实环境，其中包含一个 Amazon RDS 数据库和一个内含数据库管理员凭证的 Secrets Manager 密钥。您还有另一个密钥包含数据库用户的凭证，但您在本教程中不使用该密钥。

您还在 MySQL Workbench 中配置了一条连接，可以使用管理员凭证连接到数据库。

## 步骤 1：创建 Amazon RDS 数据库用户
<a name="tutorials_rotation-single_step-dbuser"></a>

首先，您需要一个用户，其凭证将被存储在秘密中。要创建用户，请使用存储在密钥中的管理员凭证登录 Amazon RDS 数据库。为简单起见，在本教程中，您将创建具有数据库完全权限的用户。在生产环境中，这并不常见，建议您遵循最低权限原则。

**检索管理员密码**

1. 在 Amazon RDS 控制台中，导航到您的数据库。

1. 在 **Configuration**（配置）选项卡的 **Master Credentials ARN**（主凭证 ARN）下，选择 **Manage in Secrets Manager**（在 Secrets Manager 中管理）。

   此时将打开 Secrets Manager 控制台。

1. 在密钥详细信息页面上，选择 **Retrieve secret value**（检索密钥值）。

1. 密码显示在 **Secret value**（密钥值）部分中。

**创建数据库用户**

1. 在 MySQL 工作台中，右键单击该连接 **SecretsManagerTutorial**，然后选择 “**编辑连接”**。

1. 在 **Manage Server Connections**（管理服务器连接）对话框中，对于 **Username**（用户名），输入 **admin**，然后选择 **Close**（关闭）。

1. 回到 MySQL 工作台，选择连接**SecretsManagerTutorial**。

1. 输入从密钥中检索到的管理员密码。

1.  在 MySQL Workbench 中，在 **Query**（查询）窗口中，输入以下命令（包括强密码），然后选择 **Execute**（执行）。轮换函数使用 SELECT 测试更新的密钥，因此 **dbuser** 必须至少具有该权限。

   ```
   CREATE USER 'dbuser'@'%' IDENTIFIED BY 'EXAMPLE-PASSWORD';
   GRANT SELECT ON myDB . * TO 'dbuser'@'%';
   ```

   在 **Output**（输出）窗口中，您会看到这些命令执行成功。

## 步骤 2：为数据库用户凭证创建密钥
<a name="tutorials_rotation-single_step-rotate"></a>

接下来，您将创建一个密钥用于存储您刚创建的用户的凭证，并且将启用自动轮换（包括立即轮换）。Secrets Manager 会轮换密钥，这意味着密码是以编程方式生成的 – 没有人看到过这个新密码。立即开始轮换也可以帮助您确定轮换设置是否正确。

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

1. 选择**存储新密钥**。

1. 在 **Choose secret type**（选择密钥类型）页面上，执行以下操作：

   1. 对于 **Secret type**（秘密类型），选择 **Credentials for Amazon RDS database**（Amazon RDS 数据库凭证）。

   1. 对于 **Credentials**（凭证），输入用户名 **dbuser**，以及您为使用 MySQL Workbench 创建的数据库用户输入的密码。

   1. 对于 **Database**（数据库），选择 **secretsmanagertutorialdb**。

   1. 选择**下一步**。

1. 在 **Configure secret**（配置密钥）页面上，对于 **Secret name**（密钥名称），输入 **SecretsManagerTutorialDbuser**，然后选择 **Next**（下一步）。

1. 在 **Configure rotation**（配置轮换）页面上，执行以下操作：

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

   1. 对于 **Rotation schedule**（轮换计划），设置计划 **Days**（天数）：**2** 天，以及 **Duration**（持续时间）：**2h**。使 **Rotate immediately**（立即轮换）处于已选择状态。

   1. 对于 **Rotation function**（轮换函数），选择 **Create a rotation function**（创建轮换函数），然后对于函数名称，输入 **tutorial-single-user-rotation**。

   1. 对于**轮换策略**，选择**单用户**。

   1. 选择**下一步**。

1. 在 **Review**（检查）页面上，选择 **Store**（存储）。

   Secrets Manager 会返回到密钥详细信息页面。您可以在该页面顶部查看轮换配置状态。Secrets CloudFormation Manager 用于创建资源，例如 Lambda 轮换函数和运行 Lambda 函数的执行角色。 CloudFormation 完成后，横幅变**为预定轮换的 Secret**。第一次轮换已完成。

## 步骤 3：测试轮换的密码
<a name="tutorials_rotation-single_step-connect-again"></a>

在第一次密钥轮换（可能需要几秒钟）之后，您可以检查秘密是否仍包含有效凭证。秘密中的密码已从原始凭证发生更改。

**从秘密中检索新密码**

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

1. 选择 **Secrets**（秘密），然后选择秘密 **SecretsManagerTutorialDbuser**。

1. 在 **Secret details**（秘密详细信息）页面上，向下滚动并选择 **Retrieve secret value**（检索秘密值）。

1. 在 **Key/value**（键/值）表中，为 **password** 复制 **Secret value**（秘密值）。

**测试凭证**

1. 在 MySQL 工作台中，右键单击该连接 **SecretsManagerTutorial**，然后选择 “**编辑连接”**。

1. 在 **Manage Server Connections**（管理服务器连接）对话框中，对于 **Username**（用户名），输入 **dbuser**，然后选择 **Close**（关闭）。

1. 回到 MySQL 工作台，选择连接**SecretsManagerTutorial**。

1. 在 **Open SSH Connection**（打开 SSH 连接）对话框中，对于 **Password**（密码），粘贴您从秘密中检索到的密码，然后选择 **OK**（确定）。

   如果凭证有效，则 MySQL Workbench 将打开至数据库的设计页面。

## 步骤 4：清理资源
<a name="tutorials_rotation-single_step-cleanup"></a>

为避免潜在费用，请删除您在本教程中创建的秘密。有关说明，请参阅[删除密 AWS Secrets Manager 钥](manage_delete-secret.md)。

要清理前面教程中创建的资源，请参阅 [步骤 4：清理资源](tutorials_rotation-alternating.md#tutorials_rotation-alternating_step-cleanup)。

## 后续步骤
<a name="tutorials_rotation-single_step-next"></a>
+ 了解如何在您的应用程序中检索秘密。请参阅[从中获取秘密 AWS Secrets Manager](retrieving-secrets.md)。
+ 了解其他轮换计划。请参阅[轮换计划](rotate-secrets_schedule.md)。