将硬编码的机密移至 Amazon Secrets Manager - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将硬编码的机密移至 Amazon Secrets Manager

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

关于数据库凭证密钥,请参见将硬编码的数据库凭据移至 Amazon Secrets Manager

在开始之前,您需要确定谁需要访问该密钥。我们建议使用两个IAM角色来管理您的密钥的权限:

  • 负责管理组织中的密钥的角色。有关更多信息,请参阅 Secrets Manager 管理员权限。您将使用此角色创建和轮换密钥。

  • 一个可以在运行时使用密钥的角色,例如在本教程中你使用 RoleToRetrieveSecretAtRuntime。 您的代码扮演此角色来检索密钥。在本教程中,您将向该角色仅授予检索一个密钥值的权限,并您将使用密钥的资源策略授予权限。有关其他替代方法,请参阅后续步骤

第 1 步:创建密钥

第一步是将现有硬编码的密钥复制到 Secrets Manager 中的密钥中。如果密钥与 Amazon 资源相关,请将其存储在与该资源相同的区域。否则,请将其存储在您的用例延迟最低的区域。

创建密钥(控制台)
  1. 打开 Secrets Manager 控制台,网址为https://console.aws.amazon.com/secretsmanager/

  2. 选择 存储新密钥

  3. Choose secret type(选择密钥类型)页面上,执行以下操作:

    1. 对于密钥类型,请选择其他密钥类型

    2. Key/value pairs(键值对)或者 Plaintext(明文)格式输入密钥。一些示例:

      API key

      以键/值对的形式输入:

      ClientID : my_client_id

      ClientSecret : wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

      OAuth token

      以纯文本形式输入:

      AKIAI44QH8DHBEXAMPLE

      Digital certificate

      以纯文本形式输入:

      -----BEGIN CERTIFICATE----- EXAMPLE -----END CERTIFICATE-----
      Private key

      以纯文本形式输入:

      –--- BEGIN PRIVATE KEY ---- EXAMPLE ––-- END PRIVATE KEY –---
    3. 对于 Encryption key(加密密钥),选择 aws/secretsmanager 使用 Secrets Manager 的 Amazon 托管式密钥 。使用此密钥不产生任何费用。例如,您还可以使用自己的客户管理型密钥来访问来自其他 Amazon Web Services 账户的密钥。有关使用客户托管密钥的成本的信息,请参阅 定价

    4. 选择下一步

  4. Choose secret type(选择密钥类型)页面上,执行以下操作:

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

    2. Resource permissions(资源权限)中,选择 Edit permissions(编辑权限)。粘贴以下政策,该策略允许 RoleToRetrieveSecretAtRuntime 检索密钥,然后选择保存

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountId:role/RoleToRetrieveSecretAtRuntime" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] }
    3. 在页面底部,选择 Next

  5. Configure rotation(配置轮换)页面上,将轮换禁用。选择下一步

  6. Review (审核) 页上,审核您的密钥详细信息,然后选择 Store (存储)

第 2 步:更新代码

你的代码必须扮IAM演这个角色 RoleToRetrieveSecretAtRuntime 以便能够检索秘密。有关更多信息,请参阅切换到IAM角色 (Amazon API)

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

查找示例代码
  1. 打开 Secrets Manager 控制台,网址为https://console.aws.amazon.com/secretsmanager/

  2. 密钥列表页上,选择您的密钥。

  3. 向下滚动到 Sample code(示例代码)。选择您的编程语言,然后复制代码片段。

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

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

第 3 步:更新密钥

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

用新值更新密钥
  1. 打开 Secrets Manager 控制台,网址为https://console.aws.amazon.com/secretsmanager/

  2. 选择 Secrets(密钥),然后选择该密钥。

  3. Secret details(密钥详细信息)页面上,向下滚动并选择 Retrieve secret value(检索密钥值),然后选择 Edit(编辑)。

  4. 更新密钥然后选择 Save(保存)。

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

后续步骤

从代码中移除硬编码的密钥后,接下来需要注意以下事项:

  • 要在你的 Java 和 Python 应用程序中查找硬编码的机密,我们建议使用 Amazon CodeGuru Reviewer

  • 您可以通过缓存密钥来提高性能并降低成本。有关更多信息,请参阅 从中获取秘密 Amazon Secrets Manager

  • 对于从多个区域访问的密钥,请考虑复制密钥以减少延迟。有关更多信息,请参阅 跨区域复制 Amazon Secrets Manager 密钥

  • 在本教程中,您授予了 RoleToRetrieveSecretAtRuntime 只有检索机密值的权限。要向角色授予更多权限(例如获取有关密钥的元数据或查看密钥列表),请参阅基于资源的策略

  • 在本教程中,您授予了以下权限 RoleToRetrieveSecretAtRuntime 通过使用密钥的资源策略。有关授予权限的其他方法,请参阅基于身份的策略