使用控制台,为 Amazon Secrets Manager 密钥设置自动轮换 - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用控制台,为 Amazon Secrets Manager 密钥设置自动轮换

Rotation 是定期更新密钥的过程。轮换密钥时,会同时更新密钥以及拥有密钥的数据库或服务中的凭证。

Secrets Manager 会使用 Lambda 函数轮换密钥。有关概述,请参阅轮换的工作原理

您也可以使用 Amazon CLI 设置轮换。有关更多信息,请参阅自动轮换(Amazon CLI)

要使用控制台设置轮换,首先要配置密钥以进行轮换。在该步骤中,您还将创建一个空的 Lambda 轮换函数。接下来,您将为轮换函数和 Lambda 执行角色设置权限。然后,编写轮换函数代码。最后一步是确保 Lambda 轮换函数可以通过网络访问 Secrets Manager 和数据库或服务。

有关数据库密钥的信息,请参阅 使用控制台为 Amazon RDS、Amazon Redshift 或 Amazon DocumentDB 密钥设置自动轮换

要启用自动轮换,您必须具有创建 IAM 执行角色并向其附加权限策略的权限。您需要拥有 iam:CreateRoleiam:AttachRolePolicy 两个权限。

警告

授予身份 iam:CreateRoleiam:AttachRolePolicy 两个权限允许身份向自己授予任何权限。

步骤 1:配置密钥以进行轮换

在此步骤中,您将为密钥设置轮换计划并创建空轮换函数。您的密钥会在轮换函数编写完成后进行轮换。如果您在编写轮换函数之前进行轮换,或者由于任何原因轮换失败,Secrets Manager 会多次重试轮换函数。

配置轮换并创建空轮换函数
  1. 打开 Secrets Manager 控制台:https://console.aws.amazon.com/secretsmanager/

  2. 密钥列表页上,选择您的密钥。

  3. Secret details (密钥详细信息) 页上的 Rotation configuration (轮换配置) 部分中,选择 Edit rotation (编辑轮换)。在编辑轮换配置对话框中,执行以下操作:

    1. 启用 Automatic rotation(自动轮换)。

    2. Rotation schedule(轮换计划)下,在 Schedule expression builder(计划表达式生成器)或 Schedule expression(计划表达式)中,以 UTC 时区格式输入您的计划。Secrets Manager 会将您的计划存储为 rate()cron() 表达式。轮换时段将自动从午夜开始,除非您指定 Start time(开始时间)。有关更多信息,请参阅计划表达式

    3. (可选)对于 Window duration(时段持续时间),选择您希望 Secrets Manager 在其间轮换密钥的时段长度,例如 3h 表示三个小时的时段。该时段不得延伸到下一个轮换时段。如果未指定 Window duration(时段持续时间),则对于以小时为单位的轮换计划,时段将在一小时后自动关闭。对于以天为单位的轮换计划,时段将在一天结束时自动关闭。

    4. (可选)请选择 Rotate immediately when the secret is stored(在存储密钥时立即轮换),以在保存更改时轮换密钥。如果您清除该复选框,则第一次轮换将按照您设置的计划开始。

    5. Rotation function(轮换函数)下,选择 Create function(创建函数)。此时将在新窗口中打开 Lambda 控制台。

      1. 在 Lambda 控制台的 Create function(创建函数)页面上,执行下列操作之一:

        • 如果显示 Browse serverless app repository(浏览无服务器应用程序存储库),请选择此选项。

          1. Public applications(公有应用程序)下的搜索框中,输入 SecretsManagerRotationTemplate

          2. 选择 Show apps that create custom IAM roles or resource policies(显示创建自定义 IAM 角色或资源策略的应用程序)。

          3. 选择 SecretsManagerRotationTemplate 磁贴。

          4. Review, configure and deploy(查看、配置和部署)页面的 Application settings(应用程序设置)磁贴中,填写必填字段,然后选择 Deploy(部署)。有关 终端节点的列表,请参阅Secrets Manager 端点

        • 如果没有显示 Browse serverless app repository(浏览无服务器应用程序存储库),则您的 Amazon Web Services 区域 可能不支持 Amazon Serverless Application Repository。选择 Author from scratch (从头创作)

          1. Function name(函数名称)中,输入轮换函数的名称。

          2. 对于 Runtime(运行时),选择 Python 3.9

          3. 打开新的 Lambda 函数后,向下滚动以选择 Configuration(配置),然后在左侧选择 Permissions(权限)。

          4. 向下滚动到 Resource-based policy(基于资源的策略),然后选择 Add permissions(添加权限)以向 Secrets Manager 授予调用函数的权限。要将资源策略附加到 Lambda 函数,请参阅将基于资源的策略用于 Lambda

            以下策略显示如何允许 Secrets Manager 调用 Lambda 函数。

            { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "secretsmanager.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "LambdaRotationFunctionARN" } ] }
    6. 切换回 Secrets Manager 控制台,以将新的轮换函数附加到密钥。

    7. 对于 Lambda rotation function(Lambda 轮换函数),选择刷新按钮。然后在函数列表中,选择您的新函数。

    8. 选择 Save(保存)。

步骤 2:为轮换函数设置权限

Lambda 轮换函数需要权限才能访问 Secrets Manager 中的密钥,并且需要权限才能访问您的数据库或服务。在此步骤中,您将向 Lambda 执行角色授予这些权限。如果密钥使用 Amazon 托管式密钥 aws/secretsmanager 以外的 KMS 密钥进行加密,则您需要向 Lambda 执行角色授予使用该密钥的权限。有关策略示例,请参阅 轮换权限

有关说明,请参阅《Amazon Lambda 开发人员指南》中的 Lambda 执行角色

步骤 3:(可选)为轮换函数设置额外的权限条件

我们建议您在轮换函数的资源策略中包括上下文密钥 aws:SourceAccount,以防止 Lambda 被用作混淆代理。对于某些 Amazon 服务,为了避免混淆代理情况,Amazon 建议您同时使用 aws:SourceArnaws:SourceAccount 全局条件密钥。但如果轮换函数策略中包括 aws:SourceArn 条件,则轮换函数只能用于轮换该 ARN 指定的密钥。我们建议您仅在其中包括上下文键 aws:SourceAccount,以便对多个密钥使用轮换函数。

更新轮换函数资源策略
  1. 在 Secrets Manager 控制台中选择您的密钥,然后在详细信息页面中的 Rotation configuration(轮换配置)下,选择 Lambda 轮换函数。Lambda 控制台将打开。

  2. 按照 Using resource-based policies for Lambda(将基于资源的策略用于 Lambda)中的说明添加 aws:sourceAccount 条件。

    "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" },

步骤 4:为轮换函数设置网络访问

为了能够轮换密钥,Lambda 轮换函数必须能够访问该密钥。如果您的密钥包含凭证,则 Lambda 函数还必须能够访问这些凭证的来源,例如数据库或服务。

访问密钥

Lambda 轮换功能必须能够访问 Secrets Manager 端点。如果您的 Lambda 函数可以访问互联网,则可以使用公共终端节点。若要查找端点,请参阅 Secrets Manager 端点

如果您的 Lambda 函数在不具备互联网访问权限的 VPC 中运行,我们建议您在 VPC 内配置 Secrets Manager 服务私有终端节点。然后,您的 VPC 可以拦截发往公共区域终端节点的请求并将其重定向到私有终端节点。有关更多信息,请参阅VPC 终端节点

或者,您可以通过向 VPC 添加 NAT 网关互联网网关(这将允许来自您 VPC 的流量访问公有端点),允许 Lambda 函数访问 Secrets Manager 公有端点。这会使 VPC 面临一定的风险,因为网关的 IP 地址可能会受到来自公有 Internet 的攻击。

(可选)访问数据库或服务

对于诸如 API 密钥之类的密钥,无需随密钥更新源数据库或服务。

如果数据库或服务在 VPC 中的 Amazon EC2 实例上运行,建议将 Lambda 函数配置为在同一 VPC 中运行。然后轮换功能可以直接与您的服务通信。有关更多信息,请参阅配置 VPC 访问

要允许 Lambda 函数访问数据库或服务,您必须确保附加到 Lambda 轮换函数的安全组允许与数据库或服务的出站连接。您还必须确保附加到数据库或服务的安全组允许来自 Lambda 轮换函数进行入站连接。

步骤 5:编写轮换函数代码

您在步骤 1 中创建的轮换函数是您函数的起点。您可以为特定的使用案例编写代码。对于可以轮换 Amazon ElastiCache 密钥的函数,您可以从 Secrets Manager 提供的相应模板复制代码。

编写函数时,请谨慎包括调试或日志记录语句。鉴于这些语句可能会导致函数中的信息写入 Amazon CloudWatch 中,因此您需要确保日志不包含开发期间收集的任何敏感信息。

有关日志语句的示例,请参阅 Amazon Secrets Manager 轮换函数模板 源代码。

例如,如果您使用外部二进制文件和库来连接资源,则需要对其修补进行管理并使其保持最新状态。

有关调试建议,请参阅测试和调试无服务器应用程序

打开 Lambda 轮换函数以进行编辑
  1. 在 Secrets Manager 控制台中,选择您的密钥。

  2. Rotation configuration(轮换配置)部分下的 Lambda rotation function(Lambda 轮换函数)中,选择轮换函数。

    Lambda 控制台将打开。向下滚动到 Code source(代码源)部分。

如果您的函数尚未拥有代码源,请从 SecretsManagerRotationTemplate 复制代码。

轮换密钥包含四个步骤,分别对应 Lambda 轮换函数的以下四种方法。

create_secret

create_secret 中,请首先通过传入的 ClientRequestToken 调用 get_secret_value 来检查是否存在密钥。如果没有密钥,请使用 create_secret 创建一个新密钥,并将令牌作为 VersionId。然后您可以使用 get_random_password 生成新的密钥值。您必须确保新的密钥值仅包含对数据库或服务有效的字符。使用 ExcludeCharacters 参数排除字符。调用 put_secret_value 以将其与暂存标签 AWSPENDING 一起存储。将新的密钥值存储在 AWSPENDING 中有助于确保幂等性。如果由于任何原因轮换失败,您可以在后续调用中引用该密钥值。请参阅如何使我的 Lambda 函数具有幂等性

测试函数时,使用 Amazon CLI 查看版本阶段:调用 describe-secret 并查看 VersionIdsToStages

set_secret

set_secret 中,更改数据库或服务中的凭证,以匹配密钥 AWSPENDING 版本中的新密钥值。

如果将语句传递给数据库等语句解读服务,请使用查询参数化。有关更多信息,请参阅 OWASP 网站上的查询参数化备忘单

轮换函数作为特权代理,有权访问和修改 Secrets Manager 密钥和目标资源中的客户凭证。为防范潜在的混淆代理攻击,您需要确保攻击者无法使用该函数访问其他资源。在更新凭证之前:

  • 检查密钥 AWSCURRENT 版本中的凭证是否有效。如果 AWSCURRENT 凭证无效,请放弃轮换尝试。

  • 检查 AWSCURRENTAWSPENDING 密钥值是否适用于同一资源。对于用户名和密码,检查 AWSCURRENTAWSPENDING 用户名是否相同。

  • 检查目标服务资源是否相同。对于数据库,检查 AWSCURRENTAWSPENDING 主机名是否相同。

test_secret

test_secret 中,通过使用密钥的 AWSPENDING 版本访问数据库或服务,以对其进行测试。

finish_secret

finish_secret 中,使用 update_secret_version_stage 将暂存标签 AWSCURRENT 从早期密钥版本移动到新的密钥版本。Secrets Manager 会将 AWSPREVIOUS 暂存标签自动添加到早期版本,以便您保留上次已知良好的密钥版本。

后续步骤

请参阅Amazon Secrets Manager 轮换问题排查