将硬编码的机密移至 AWS Secrets Manager - AWS Secrets Manager

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

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

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

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

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

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

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

第 1 步:创建密钥

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

创建密钥(控制台)
  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 的 AWS 托管式密钥 。使用此密钥不产生任何费用。例如,您还可以使用自己的客户管理型密钥来访问来自其他 AWS 账户的密钥。有关使用客户托管密钥的成本的信息,请参阅 定价

    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角色 (AWS 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

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

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

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

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