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

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

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

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

有关数据库密钥的信息,请参阅 自动轮换数据库密钥

警告

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

步骤 1:创建通用旋转函数

首先,创建一个 Lambda 旋转函数。它里面没有用来轮换你的密钥的代码,所以你将在稍后的步骤中写出来。有关旋转函数的工作原理的信息,请参见Lambda 旋转函数

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

创建通用旋转函数
  1. 要确定您所在的地区 Amazon Serverless Application Repository 是否支持,请参阅Amazon 一般参考中的Amazon Serverless Application Repository 终端节点和配额

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

    • 如果您 Amazon Serverless Application Repository 所在的地区支持:

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

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

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

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

      5. 选择方SecretsManagerRotationTemplate块。

      6. 在 “查看、配置和部署” 页面的 “应用程序设置” 栏中,填写必填字段。

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

        • 要将 Lambda 函数放在 VPC 中,请包括 vpcSecurityGroupID 和。vpcSubnetIds

      7. 选择部署

    • 如果您所在的地区 Amazon Serverless Application Repository 不支持:

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

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

        1. 选择从头开始创作

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

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

        4. 选择创建函数

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

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

步骤 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 执行角色授予这些权限。如果密钥使用 Amazon 托管式密钥 aws/secretsmanager 以外的 KMS 密钥进行加密,则您需要向 Lambda 执行角色授予使用该密钥的权限。您可以使用 SecretARN 加密上下文 来限制解密函数的使用,从而确保轮换函数角色只能解密其负责轮换的密钥。有关策略示例,请参阅 轮换权限

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

第 5 步:允许 Secrets Manager 调用轮换功能

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

我们建议您在轮换函数的资源策略中包括上下文密钥 aws:SourceAccount,以防止 Lambda 被用作混淆代理。对于某些 Amazon 服务,为了避免混淆副手的情况, Amazon 建议您同时使用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 将多次尝试轮换。您也可以按照中的说明立即开始轮换立即轮换密钥

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