

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

# 将硬编码的机密移至 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)。