为非数据库 AWS Secrets Manager 密钥设置自动轮换 - AWS Secrets Manager

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为非数据库 AWS Secrets Manager 密钥设置自动轮换

本教程介绍了如何为非数据库密钥设置 通过 Lambda 函数进行轮换。Rotation 是定期更新密钥的过程。轮换密钥时,会同时更新密钥以及拥有密钥的数据库或服务中的凭证。

有关数据库密钥的信息,请参阅 自动轮换数据库密钥(控制台)

警告

要启用自动轮换,您必须有权为 Lambda 轮换函数创建 IAM 执行角色并向其附加权限策略。您需要拥有 iam:CreateRoleiam:AttachRolePolicy 两个权限。授予这些权限允许身份授予自己任何权限。

步骤 1:创建通用轮换函数

首先,创建一个 Lambda 轮换函数。它不包含用于轮换您的密钥的代码,因此您将在后面的步骤中编写该代码。有关轮换函数如何工作的信息,请参阅 Lambda 轮换函数

在支持的区域中,您可以使用 AWS Serverless Application Repository 从模板创建函数。有关支持的区域列表,请参阅 AWS Serverless Application Repository 常见问题。在其他区域,您将从头开始创建函数并将模板代码复制到函数中。

创建通用轮换函数
  1. 要确定您的区域是否支持 AWS Serverless Application Repository,请参阅《AWS 一般参考》中的 AWS Serverless Application Repository endpoints and quotas

  2. 请执行以下操作之一:

    • 如果您的区域支持 AWS Serverless Application Repository:

      1. 在 Lambda 控制台中,选择应用程序,然后选择创建应用程序

      2. 创建应用程序页面上,选择无服务器应用程序选项卡。

      3. 公用应用程序下的搜索框中,输入 SecretsManagerRotationTemplate

      4. 选择显示创建自定义 IAM 角色或资源策略的应用程序

      5. 选择 SecretsManagerRotationTemplate 磁贴。

      6. 查看、配置和部署页面上的应用程序设置磁贴中,填写必填字段。

        • 对于端点,输入您所在区域的端点,包括 https://。有关 终端节点的列表,请参阅AWS Secrets Manager 端点

        • 要将 Lambda 函数放在 VPC 中,请包括 vpcSecurityGroupIdsvpcSubnetIds

      7. 选择部署

    • 如果您的区域不支持 AWS Serverless Application Repository:

      1. 在 Lambda 控制台中,选择函数,然后选择创建函数

      2. Create function (创建函数) 页面上,执行以下操作:

        1. 选择从头开始创作

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

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

        4. 选择 Create function (创建函数)

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

在此步骤中,您将编写用于更新密钥以及该密钥所针对的服务或数据库的代码。有关轮换函数作用的信息(包括编写自己的轮换函数的提示),请参阅 Lambda 轮换函数。您可以使用 轮换函数模板 作为参考。

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

在此步骤中,您将为密钥设置轮换计划,并将轮换函数连接到密钥。

配置轮换并创建空轮换函数
  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. 轮换函数下,选择在步骤 1 中创建的 Lambda 函数。

    6. 选择保存

步骤 4:允许轮换函数访问 Secrets Manager 以及您的数据库或服务

Lambda 轮换函数需要权限才能访问 Secrets Manager 中的密钥,并且需要权限才能访问您的数据库或服务。在此步骤中,您将向 Lambda 执行角色授予这些权限。如果密钥使用 AWS 托管式密钥 aws/secretsmanager 以外的 KMS 密钥进行加密,则您需要向 Lambda 执行角色授予使用该密钥的权限。您可以使用 SecretARN 加密上下文 来限制解密函数的使用,从而确保轮换函数角色只能解密其负责轮换的密钥。有关策略示例,请参阅 轮换权限

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

步骤 5:允许 Secrets Manager 调用轮换函数

要允许 Secrets Manager 按照您设置的轮换计划调用轮换函数,您需要在 Lambda 函数的资源策略中向 Secrets Manager 服务主体授予 lambda:InvokeFunction 权限。

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

要将资源策略附加到 Lambda 函数,请参阅将基于资源的策略用于 Lambda

以下策略允许 Secrets Manager 调用 Lambda 函数。

{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "secretsmanager.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" } }, "Resource": "LambdaRotationFunctionARN" } ] }

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

在此步骤中,您将允许轮换函数连接到 Secrets Manager 以及该密钥所针对的服务或数据库。旋转函数必须能够访问两者才能轮换密钥。请参阅 Lambda 轮换函数的网络访问

后续步骤

当在步骤 3 中配置轮换时,您会设置一个轮换密钥的计划。如果轮换在计划时失败,Secrets Manager 将多次尝试轮换。您也可以按照 立即轮换密钥 中的说明立即开始轮换。

如果轮换失败,请参阅 轮换问题排查