将硬编码的数据库凭证移动到 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. 选择 Store a new secret (存储新密钥)

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

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

      • Amazon RDS 数据库

      • Amazon DocumentDB 数据库

      • Amazon Redshift 集群

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

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

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

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

    5. 选择 Next (下一步)

  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(配置轮换)页面上,暂时将轮换禁用。稍后您会将其启用。选择 Next (下一步)

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

第 2 步:更新代码

您的代码必须代入 IAM 角色 RoleToRetrieveSecretAtRuntime 才能检索密钥。有关更多信息,请参阅切换到 IAM 角色(AWS)

然后,您可以使用 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. 对于 Use separate credentials to rotate this secret(使用单独的凭证轮换此密钥),选择 No(否)。

    6. 选择保存

检查密钥是否已轮换

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

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

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

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

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

后续步骤

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