本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为非数据库 Amazon Secrets Manager 密钥设置自动轮换
本教程介绍如何设置通过 Lambda 函数进行旋转非数据库密钥。Rotation 是定期更新密钥的过程。轮换密钥时,会同时更新密钥以及拥有密钥的数据库或服务中的凭证。
有关数据库密钥的信息,请参阅 自动轮换数据库密钥(控制台)。
警告
要启用自动轮换,您必须有权为 Lambda 轮换函数创建IAM执行角色并向其附加权限策略。您需要拥有 iam:CreateRole
和 iam:AttachRolePolicy
两个权限。授予这些权限允许身份向自己授予任何权限。
步骤:
步骤 1:创建通用旋转函数
首先,创建一个 Lambda 旋转函数。它里面没有用来轮换你的密钥的代码,所以你将在稍后的步骤中写出来。有关旋转函数的工作原理的信息,请参见Lambda 旋转函数。
在支持的区域中 Amazon Serverless Application Repository ,您可以使用从模板创建函数。有关支持的区域列表,请参阅Amazon Serverless Application Repository FAQs
创建通用旋转函数
-
要确定您所在的地区 Amazon Serverless Application Repository 是否支持,请参阅《Amazon 一般参考》中的Amazon Serverless Application Repository 终端节点和配额。
-
请执行以下操作之一:
如果您 Amazon Serverless Application Repository 所在的地区支持:
在 Lambda 控制台中,选择应用程序,然后选择创建应用程序。
在创建应用程序页面上,选择无服务器应用程序选项卡。
在公共应用程序下的搜索框中,输入
SecretsManagerRotationTemplate
。选择 “显示创建自定义IAM角色或资源策略的应用程序”。
选择方SecretsManagerRotationTemplate块。
-
在 “查看、配置和部署” 页面的 “应用程序设置” 栏中,填写必填字段。
对于终端节点,请输入您所在地区的终端节点,包括
https://
。有关 终端节点的列表,请参阅Amazon Secrets Manager 端点。要将 Lambda 函数放入 a 中VPC,请包含 vpcSecurityGroupID 和。vpcSubnetIds
选择部署。
如果您所在的地区 Amazon Serverless Application Repository 不支持:
在 Lambda 控制台中,选择函数,然后选择创建函数。
在 Create function (创建函数) 页面上,执行以下操作:
选择从头开始创作。
在 Function name(函数名称)中,输入轮换函数的名称。
对于 Runtime(运行时),选择 Python 3.9。
选择创建函数。
步骤 2:编写轮换函数代码
在此步骤中,您将编写更新密钥以及该密钥所针对的服务或数据库的代码。有关旋转函数的作用信息,包括编写自己的旋转函数的提示,请参阅Lambda 旋转函数。您也可以使用 a 轮换函数模板 s 作为参考。
步骤 3:配置密钥以进行轮换
在此步骤中,您将为密钥设置轮换计划,并将轮换功能连接到该密钥。
配置轮换并创建空轮换函数
打开 Secrets Manager 控制台,网址为https://console.aws.amazon.com/secretsmanager/
。 -
在密钥列表页上,选择您的密钥。
-
在 Secret details (密钥详细信息) 页上的 Rotation configuration (轮换配置) 部分中,选择 Edit rotation (编辑轮换)。在编辑轮换配置对话框中,执行以下操作:
启用 Automatic rotation(自动轮换)。
-
在 “轮换计划” 下,在计划表达式生成器中按UTC时区输入您的日程安排,或者以计划表达式的形式输入。Secrets Manager 会将您的计划存储为
rate()
或cron()
表达式。轮换时段将自动从午夜开始,除非您指定 Start time(开始时间)。您可以每四小时轮换一次密钥。有关更多信息,请参阅 轮换时间表。 -
(可选)对于 Window duration(时段持续时间),选择您希望 Secrets Manager 在其间轮换密钥的时段长度,例如
3h
表示三个小时的时段。该时段不得延伸到下一个轮换时段。如果未指定 Window duration(时段持续时间),则对于以小时为单位的轮换计划,时段将在一小时后自动关闭。对于以天为单位的轮换计划,时段将在一天结束时自动关闭。 (可选)请选择 Rotate immediately when the secret is stored(在存储密钥时立即轮换),以在保存更改时轮换密钥。如果您清除该复选框,则第一次轮换将按照您设置的计划开始。
在旋转函数下,选择您在步骤 1 中创建的 Lambda 函数。
选择保存。
第 4 步:允许轮换功能访问 Secrets Manager 以及你的数据库或服务
Lambda 轮换函数需要权限才能访问 Secrets Manager 中的密钥,并且需要权限才能访问您的数据库或服务。在此步骤中,您将向 Lambda 执行角色授予这些权限。如果使用非密钥对密KMS钥进行加密 Amazon 托管式密钥
aws/secretsmanager
,则需要向 Lambda 执行角色授予使用该密钥的权限。您可以使用 S ecret ARN 加密上下文来限制解密功能的使用,因此轮换函数角色只能解密它负责轮换的密钥。有关策略示例,请参阅 轮换权限。
有关说明,请参阅《Amazon Lambda 开发人员指南》中的 Lambda 执行角色。
第 5 步:允许 Secrets Manager 调用轮换功能
要允许 Secrets Manager 按照您设置的轮换计划调用轮换函数,您需要在 Lambda 函数的资源策略中向 Secrets Manager 服务主体授予lambda:InvokeFunction
权限。
我们建议您在轮换函数的资源策略中包括上下文密钥 aws:SourceAccount
,以防止 Lambda 被用作混淆代理。对于某些 Amazon 服务,为了避免混淆副手的情况, Amazon 建议您同时使用aws:SourceArn
和aws: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 将多次尝试轮换。您也可以按照中的说明立即开始轮换立即轮换密钥。
如果旋转失败,请参阅 轮换问题排查。