本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将硬编码的密钥移动到 AWS Secrets Manager
如果代码中存在明文密钥,我们建议将其轮换并存储到 Secrets Manager 中。将密钥移动到 Secrets Manager 后,您的代码将直接从 Secrets Manager 中检索密钥,从而解决了任何看到代码的人会看到密钥的问题。轮换密钥会吊销当前硬编码的密钥,使其不再有效。
关于数据库凭证密钥,请参见将硬编码的数据库凭据移至 AWS Secrets Manager。
在开始之前,您需要确定谁需要访问该密钥。我们建议使用两个 IAM 角色来管理密钥的权限:
-
负责管理组织中的密钥的角色。有关更多信息,请参阅Secrets Manager 管理员权限。您将使用此角色创建和轮换密钥。
-
一个可以在运行时(例如在本教程中为
RoleToRetrieveSecretAtRuntime
)使用密钥的角色。您的代码将代入此角色以检索密钥。在本教程中,您将向该角色仅授予检索一个密钥值的权限,并您将使用密钥的资源策略授予权限。有关其他替代方法,请参阅后续步骤。
第 1 步:创建密钥
第一步是将现有硬编码的密钥复制到 Secrets Manager 中的密钥中。如果密钥与某个 AWS 资源相关,则应将其存储在与该资源相同的区域中。否则,请将其存储在对于您的使用案例而言延迟最低的区域中。
创建密钥(控制台)
通过 https://console.aws.amazon.com/secretsmanager/
打开 Secrets Manager 控制台。 -
选择 Store a new secret (存储新密钥)。
-
在 Choose secret type(选择密钥类型)页面上,执行以下操作:
-
对于 Secret type(密钥类型),请选择 Other type of secret(其他密钥类型)。
-
以 Key/value pairs(键值对)或者 Plaintext(明文)格式输入密钥。一些示例:
- API 密钥键值对:
-
ClientID
:my_client_id
ClientSecret
:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
- 凭证键值对:
-
Username
:saanvis
Password
:EXAMPLE-PASSWORD
- OAuth 令牌明文:
-
AKIAI44QH8DHBEXAMPLE
- 数字证书明文:
-
-----BEGIN CERTIFICATE----- EXAMPLE -----END CERTIFICATE-----
- 私有密钥明文:
-
–---BEGIN PRIVATE KEY –-- EXAMPLE ––-- END PRIVATE KEY –---
-
对于 Encryption key(加密密钥),选择 aws/secretsmanager 使用 Secrets Manager 的 AWS 托管式密钥。使用此密钥不产生任何费用。例如,您还可以使用自己的客户管理型密钥来访问来自其他 AWS 账户 的密钥。有关使用客户托管密钥的成本的信息,请参阅 定价。
-
选择 Next(下一步)。
-
-
在 Choose secret type(选择密钥类型)页面上,执行以下操作:
-
输入一个描述性的 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(配置轮换)页面上,将轮换禁用。选择 Next(下一步)。
-
在 Review (审核) 页上,审核您的密钥详细信息,然后选择 Store (存储)。
第 2 步:更新代码
您的代码必须代入 IAM 角色 RoleToRetrieveSecretAtRuntime
才能检索密钥。有关更多信息,请参阅切换到 IAM 角色(AWS)。
然后,您可以使用 Secrets Manager 提供的示例代码更新您的代码,以检索 Secrets Manager 中的密钥。
查找示例代码
通过 https://console.aws.amazon.com/secretsmanager/
打开 Secrets Manager 控制台。 -
在密钥列表页上,选择您的密钥。
-
向下滚动到 Sample code(示例代码)。选择您的编程语言,然后复制代码片段。
移除应用程序中的硬编码密钥并粘贴此代码片段。根据代码语言的不同,您可能需要在片段中添加对函数或方法的调用。
使用密钥代替硬编码密钥,测试您的应用程序是否符合预期。
第 3 步:更新密钥
最后一步是吊销并更新硬编码的密钥。请参阅密钥的来源以查找吊销和更新密钥的说明。例如,您可能需要停用当前密钥并生成一个新密钥。
用新值更新密钥
通过 https://console.aws.amazon.com/secretsmanager/
打开 Secrets Manager 控制台。 -
选择 Secrets(密钥),然后选择该密钥。
-
在 Secret details(密钥详细信息)页面上,向下滚动并选择 Retrieve secret value(检索密钥值),然后选择 Edit(编辑)。
-
更新密钥然后选择 Save(保存)。
然后,测试您的应用程序按照预期那样在使用新密钥。
后续步骤
从代码中移除硬编码的密钥后,接下来需要注意以下事项:
-
要在 Java 和 Python 应用程序中找到硬编码的密钥,我们建议使用 Amazon CodeGuru Reviewer。
-
您可以通过缓存密钥来提高性能并降低成本。有关更多信息,请参阅从 AWS Secrets Manager 中检索密钥。
-
对于从多个区域访问的密钥,请考虑复制密钥以减少延迟。有关更多信息,请参阅将 AWS Secrets Manager 密钥复制到其他 AWS 区域。
-
在本教程中,您将仅向
RoleToRetrieveSecretAtRuntime
授予检索该密钥值的权限。要向角色授予更多权限(例如获取有关密钥的元数据或查看密钥列表),请参阅AWS Secrets Manager 的权限策略示例。 -
在本教程中,您将使用密钥的资源策略向
RoleToRetrieveSecretAtRuntime
授予权限。有关授予权限的其他方法,请参阅将权限策略附加到身份。