本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将硬编码的数据库凭据移至 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 数据库
-
亚马逊 Redshift 数据仓库。
-
有关其他类型的密钥,请参阅替换硬编码的密钥。
-
-
对于凭证,请输入数据库现有的硬编码凭证。
-
对于 Encryption key(加密密钥),选择 aws/secretsmanager 使用 Secrets Manager 的 AWS 托管式密钥 。使用此密钥不产生任何费用。例如,您还可以使用自己的客户管理型密钥来访问来自其他 AWS 账户的密钥。有关使用客户托管密钥的成本的信息,请参阅 定价。
-
对于 Database(数据库),请选择您的数据库。
-
选择下一步。
-
-
在 Configure secret(配置密钥)页面上,执行以下操作:
-
输入一个描述性的 Secret name(密钥名称)和 Description(说明)。
-
在 Resource permissions(资源权限)中,选择 Edit permissions(编辑权限)。粘贴以下允许
RoleToRetrieveSecretAtRuntime
检索密钥的策略,然后选择 “保存”。{ "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 API)。
然后,您可以使用 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。