将硬编码的数据库凭证移动到 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 RDS、Amazon Redshift 和 Amazon DocumentDB 数据库,请使用本页中的步骤将硬编码的凭证移动到 Secrets Manager。对于其他类型的凭证和其他密钥,请参阅将硬编码的密钥移动到 Amazon Secrets Manager

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

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

  • 一个可以在运行时 RoleToRetrieveSecretAtRuntime 使用本教程中的凭证的角色。您的代码将代入此角色以检索密钥。

第 1 步:创建密钥

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

创建密钥
  1. https://console.aws.amazon.com/secretsmanager/ 打开 Secrets Manager 控制台。

  2. 选择 Store a new secret (存储新密钥)

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

    1. 对于 Secret type(密钥类型)中,请选择要存储的数据库凭证类型:

      • Amazon RDS 数据库

      • Amazon DocumentDB 数据库

      • Amazon Redshift 集群

      • 有关其他类型的密钥,请参阅替换硬编码的密钥

    2. 对于凭证,请输入数据库现有的硬编码凭证。

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

    4. 对于 Database(数据库),请选择您的数据库。

    5. 选择下一步

  4. Configure secret(配置密钥)页面上,执行以下操作:

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

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

      { "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)

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

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

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

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

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

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

步骤 3:轮换秘密

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

设置轮换包括确保 Lambda 轮换函数可以访问 Secrets Manager 和您的数据库。启用自动轮换后,Secrets Manager 会与您的数据库相同的 VPC 中创建 Lambda 轮换函数,以确保它拥有数据库的网络访问权限。Lambda 轮换函数还必须能够调用 Secrets Manager 以更新密钥。我们建议在该 VPC 内创建一个 Secrets Manager 端点,以便从 Lambda 对 Secrets Manager 的调用不会离开 Amazon 基础设施。有关说明,请参阅 使用 Amazon Secrets Manager VPC 终端节点

启用轮换
  1. 打开 Secrets Manager 控制台:https://console.aws.amazon.com/secretsmanager/

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

  3. Secret details (密钥详细信息) 页上的 Rotation configuration (轮换配置) 部分中,选择 Edit rotation (编辑轮换)

  4. 编辑轮换配置对话框中,执行以下操作:

    1. 启用 Automatic rotation(自动轮换)。

    2. Rotation schedule(轮换计划)下,以 UTC 时区格式输入您的计划。

    3. 选择 Rotate immediately when the secret is stored(在存储密钥时立即轮换),以在保存更改时轮换密钥。

    4. Rotation function(轮换函数)下,选择 Create a new Lambda function(创建新的 Lambda 函数),然后为新函数输入一个名称。Secrets Manager 将 "SecretsManager" 添加到您的函数名称的开头。

    5. 对于轮换策略,选择单用户

    6. 选择 Save(保存)。

检查密钥是否已轮换
  1. https://console.aws.amazon.com/secretsmanager/ 打开 Secrets Manager 控制台。

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

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

    如果密钥值改变,则说明轮换已经成功。如果密钥值没有改变,您需要检查该轮换函数的 CloudWatch 日志,以进行轮换问题排查

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

后续步骤

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