将硬编码的数据库凭据移至 AWS Secrets Manager - AWS Secrets Manager

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

将硬编码的数据库凭据移至 AWS Secrets Manager

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

对于 Amazon RDS、Amazon Redshift 和 Amazon DocumentDB 数据库,请使用本页中的步骤将硬编码的凭证移动到 Secrets Manager。对于其他类型的凭证和其他密钥,请参阅将硬编码的机密移至 AWS Secrets Manager

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

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

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

第 1 步:创建密钥

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

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

  2. 选择 存储新密钥

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

    1. 对于密钥类型,选择要存储的数据库凭证类型:

      • Amazon RDS 数据库

      • Amazon DocumentDB 数据库

      • 亚马逊 Redshift 数据仓库

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

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

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

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

    5. 选择下一步

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

    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:轮换秘密

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

设置轮换包括确保 Lambda 轮换函数可以访问 Secrets Manager 和您的数据库。启用自动轮换后,Secrets Manager 会与您的数据库相同的 VPC 中创建 Lambda 轮换函数,以确保它拥有数据库的网络访问权限。Lambda 轮换函数还必须能够调用 Secrets Manager 以更新密钥。我们建议您在 VPC 中创建一个 Secrets Manager 终端节点,这样从 Lambda 到 Secrets Manager 的调用就不会离开基础架构 AWS 。有关说明,请参阅使用 AWS 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. 选择保存

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

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

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

    如果密钥值改变,则说明轮换已经成功。如果密钥值没有更改,则需要 轮换问题排查查看轮换功能的 CloudWatch 日志。

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

后续步骤

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