

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

# 将硬编码的数据库凭据移至 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)。