本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将硬编码的数据库凭证移动到 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 中的密钥中。为了实现低延迟,可将密钥存储在与数据库相同的区域中。
创建密钥
-
在 https://console.aws.amazon.com/secretsmanager/
打开 Secrets Manager 控制台。 -
选择 存储新密钥。
-
在 Choose secret type(选择密钥类型)页面上,执行以下操作:
-
对于密钥类型,选择要存储的数据库凭证类型:
-
Amazon RDS 数据库
-
Amazon DocumentDB 数据库
-
Amazon Redshift 数据仓库。
-
有关其他类型的密钥,请参阅替换硬编码的密钥。
-
-
对于凭证,请输入数据库现有的硬编码凭证。
-
对于 Encryption key(加密密钥),选择 aws/secretsmanager 使用 Secrets Manager 的 AWS 托管式密钥。使用此密钥不产生任何费用。例如,您还可以使用自己的客户管理型密钥来访问来自其他 AWS 账户 的密钥。有关使用客户托管密钥的成本的信息,请参阅 定价。
-
对于 Database(数据库),请选择您的数据库。
-
选择下一步。
-
-
在 Configure secret(配置密钥)页面上,执行以下操作:
-
输入一个描述性的 Secret name(密钥名称)和 Description(说明)。
-
在 Resource permissions(资源权限)中,选择 Edit permissions(编辑权限)。粘贴以下策略(允许
RoleToRetrieveSecretAtRuntime
检索密钥),然后选择 Save(保存)。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountId
:role/
" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] }RoleToRetrieveSecretAtRuntime
-
在页面底部,选择 Next。
-
-
在 Configure rotation(配置轮换)页面上,暂时将轮换禁用。稍后您会将其启用。选择下一步。
-
在 Review (审核) 页上,审核您的密钥详细信息,然后选择 Store (存储)。
第 2 步:更新代码
您的代码必须代入 IAM 角色 RoleToRetrieveSecretAtRuntime
才能检索密钥。有关更多信息,请参阅切换到 IAM 角色(AWS)。
然后,您可以使用 Secrets Manager 提供的示例代码更新您的代码,以检索 Secrets Manager 中的密钥。
查找示例代码
打开 Secrets Manager 控制台:https://console.aws.amazon.com/secretsmanager/
。 -
在密钥列表页上,选择您的密钥。
-
向下滚动到 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终端节点。
启用轮换
打开 Secrets Manager 控制台:https://console.aws.amazon.com/secretsmanager/
。 -
在密钥列表页上,选择您的密钥。
-
在 Secret details (密钥详细信息) 页上的 Rotation configuration (轮换配置) 部分中,选择 Edit rotation (编辑轮换)。
-
在编辑轮换配置对话框中,执行以下操作:
-
启用 Automatic rotation(自动轮换)。
-
在 Rotation schedule(轮换计划)下,以 UTC 时区格式输入您的计划。
-
选择 Rotate immediately when the secret is stored(在存储密钥时立即轮换),以在保存更改时轮换密钥。
-
在 Rotation function(轮换函数)下,选择 Create a new Lambda function(创建新的 Lambda 函数),然后为新函数输入一个名称。Secrets Manager 将 "SecretsManager" 添加到您的函数名称的开头。
-
对于轮换策略,选择单用户。
-
选择保存。
-
检查密钥是否已轮换
打开 Secrets Manager 控制台,网址为 https://console.aws.amazon.com/secretsmanager/
。 -
选择 Secrets(密钥),然后选择该密钥。
在 Secret details(秘密详细信息)页面上,向下滚动并选择 Retrieve secret value(检索秘密值)。
如果密钥值改变,则说明轮换已经成功。如果密钥值没有改变,您需要检查该轮换函数的 CloudWatch 日志,以进行轮换问题排查。
测试您的应用程序按照预期那样在使用轮换后的密钥。
后续步骤
从代码中移除硬编码的密钥后,接下来需要注意以下事项:
-
您可以通过缓存密钥来提高性能并降低成本。有关更多信息,请参阅 从中获取秘密 AWS Secrets Manager。
-
您可以选择不同的轮换计划。有关更多信息,请参阅 轮换计划。
-
要在 Java 和 Python 应用程序中找到硬编码的密钥,我们建议使用 Amazon CodeGuru Reviewer。