为 Amazon Redshift 密钥启用轮换 - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

为 Amazon Redshift 密钥启用轮换

您可以使用 AWS Secrets Manager 控制台、AWS CLI 或某个 AWS 开发工具包为具有 Amazon Redshift 服务凭证的密钥启用轮换。

警告

启用轮换将导致在保存密钥时立即轮换一次密钥。在启用轮换之前,请确保更新使用该密钥凭证的所有应用程序以从 Secrets Manager 中检索密钥。在初始轮换后,可能无法使用原始凭证。在旧凭证失效后,您没有更新的任何应用程序将会立即失败。

先决条件:启用轮换的网络要求

要成功启用轮换,您必须正确配置网络环境。

  • Lambda 函数必须能够与 Amazon Redshift 服务通信。 如果您在 VPC 中运行 Amazon Redshift 集群,我们建议您将 Lambda 函数配置为在同一 VPC 中运行。这样可在轮换函数与服务之间启用直接连接。要配置该功能,请在 Lambda 函数的详细信息页面中向下滚动到网络部分,然后从下拉列表中选择 VPC 以匹配运行您的实例的 VPC。您还必须确保附加到集群的 EC2 安全组允许在集群和 Lambda 之间进行通信。

  • Lambda 函数必须能够与 Secrets Manager 服务终端节点通信。 如果 Lambda 轮换函数可以访问 Internet(由于您未将该函数配置为在 VPC 中运行,或者 VPC 具有连接的 NAT 网关),您可以使用 Secrets Manager 的任何可用的公有终端节点。或者,如果将 Lambda 函数配置为在无法访问 Internet 的 VPC 中运行,您可以为 VPC 配置私有 Secrets Manager 服务终端节点

为支持的 Amazon Redshift 集群密钥启用和配置轮换

请按照以下选项卡之一中的步骤进行操作:

使用 AWS 管理控制台
最小权限

要在控制台中启用和配置轮换,您必须具有以下托管策略提供的权限:

  • SecretsManagerReadWrite – 提供所有 Secrets Manager、Lambda 和 AWS CloudFormation 权限。

  • IAMFullAccess – 提供创建角色并向其附加权限策略所需的 IAM 权限。

  1. 登录 AWS Secrets Manager 控制台 (https://console.amazonaws.cn/secretsmanager/)。

  2. 选择要启用轮换的密钥的名称。

  3. 配置自动轮换部分中,选择启用自动轮换。这会启用该部分中的其他控件。

  4. 对于选择轮换间隔,请选择其中一个预定义值 —,或者选择自定义,然后键入所需的轮换间隔天数。如果轮换密钥以满足合规性要求,我们建议您将该值设置为至少比合规性规定的间隔少 1 天。

    Secrets Manager 在上一次轮换完成时计划下一次轮换。Secrets Manager 通过向上次轮换的实际日期添加轮换间隔(天数)来计划日期。该服务随机选择 24 小时日期窗口中的小时。分钟也以某种方式随机选择,但会根据小时的起始进行加权并受帮助分布负载的各种因素影响。

    注意

    如果使用 Secrets Manager 提供的 Lambda 函数在两个用户之间切换(如果在下一步中选择第二个“主密钥”选项,则控制台使用该模板),您应该将轮换期设置为合规性指定的最小间隔的一半。即使当前未使用,Secrets Manager 也会将旧证书在一个额外的轮换期内保持可用。仅在第二次轮换时使用新密码更新用户后,才会使旧凭证失效。

    如果修改轮换函数以在新密钥变为活动状态后使旧凭证立即失效,则可以将轮换间隔延长到合规性规定的完整最小间隔。通过在一个额外的周期内使用 AWSPREVIOUS 暂存标签将旧凭证保持活动状态,可以提供一组可用于快速恢复的“上次已知良好的”凭证。如果出现问题而导致当前凭证中断,您只需将 AWSCURRENT 暂存标签移动到具有 AWSPREVIOUS 标签的版本。然后,您的客户应该能够再次访问资源。有关更多信息,请参阅通过在两个现有用户之间交替来轮换 AWS Secrets Manager 密钥

  5. 请选择以下任一选项:

    • 您需要创建新的 Lambda 转换函数

      1. 选择 Create a new Lambda function to perform rotation (创建新的 Lambda 函数来执行轮换)

      2. 对于 Lambda 函数名称,输入要分配给 Secrets Manager 为您创建的 Lambda 函数的名称。

      3. 指定具有轮换函数可使用的凭证的密钥。它们必须有权在受保护的服务上更新用户名和密码。

        • 使用此密钥:如果该密钥中的凭证有权在服务中更改其密码,请选择该选项。选择该选项将导致 Secrets Manager 创建一个 Lambda 函数,以便在每次轮换时更改密码后轮换单个用户的密钥。

          注意

          Secrets Manager 提供该选项以作为“低可用性”选项。在轮换功能删除旧密码以及更新的密码可作为密钥的新版本访问之间,可能会发生登录失败。该时间段可能非常短,数量级为一秒或更短。

          如果选择该选项,请确保客户端应用程序在其代码中实施了相应的“后退并使用抖动重试”策略。只有在较长时间内登录失败几次时,这些应用程序才会生成错误。

        • 使用我之前存储在 AWS Secrets Manager 中的密钥:如果当前密钥中的凭证无权自行更新,或者如果需要实现密钥的高可用性,请选择该选项。要选择该选项,您必须创建一个具有相应凭证的单独“主”密钥,这些凭证有权更新该密钥的凭证。然后,从列表中选择该主密钥。选择该选项将导致 Secrets Manager 创建一个 Lambda 函数,它在每次轮换时创建新用户和密码并弃用旧用户和密码以轮换密钥。

          注意

          Secrets Manager 提供该选项以作为“高可用性”选项,因为在准备和测试新版本时旧版本的密钥继续运行并处理服务请求。在客户端切换到新版本后,Secrets Manager 才会弃用旧版本。在版本之间进行切换时,不会发生停机。

          该选项要求 Lambda 函数克隆原始用户的权限,并将其应用于新用户。然后,该函数在每次轮换时在两个用户之间切换。

          如果您需要更改为用户授予的权限,请确保更改两个用户的权限。

    • 您需要使用您已为其他密钥创建的 Lambda 函数

      1. 选择 Use an existing Lambda function to perform rotation (使用现有 Lambda 函数来执行轮换)

      2. 从下拉列表中选择 Lambda 函数。

      3. 指定您选择的轮换函数的类型:

        • 单用户轮换:密钥的一种轮换函数,密钥存储有权更改自己的密码的用户的凭证。如果在您创建函数时选择使用此密钥选项,Secrets Manager 将创建这种类型的函数。

        • 多用户轮换:密钥的一种轮换函数,密钥存储无权更改其密码的用户的凭证。该函数需要使用单独的主密钥,以存储有权更改该密钥的用户凭证的用户的凭证。

        • 在选择使用我之前存储在 AWS Secrets Manager 中的密钥选项时,Secrets Manager 将创建这种类型的函数。

      4. 如果指定了第二个“主密钥”选项,您还必须选择提供主用户凭证的密钥。主密钥中的凭证必须有权更新存储在此密钥中的凭证。

  6. 选择保存以存储更改并触发初始密钥轮换。

  7. 如果您选择使用单独的主密钥轮换您的密钥,必须手动为 Lambda 轮换函数授予权限以访问主密钥。按照以下说明进行操作:

    1. 在轮换配置完成时,页面顶部可能会显示以下消息:

      您的密钥 <secret name> 已成功存储且已启用密钥轮换。要完成配置轮换,您需要提供角色权限来访问密钥 <您的主密钥的 Amazon 资源名称 (ARN)> 值。

      如果显示此消息,您必须手动修改角色的策略以便向 secretsmanager:GetSecretValue 轮换函数授予对主密钥的访问权限。出于安全考虑,Secrets Manager 无法为您执行该操作。如果此函数无法访问主密钥,密钥轮换将失败,直至您完成以下步骤。

    2. 将消息中的 Amazon 资源名称 (ARN) 复制到剪贴板中。

    3. 选择消息中“角色”一词上的链接。在 IAM 控制台中,这将针对附加到 Secrets Manager 为您创建的 Lambda 轮换函数上的角色打开角色详细信息页。

    4. 权限选项卡上,选择添加内联策略,然后设置以下值:

      • 对于服务,请选择 Secrets Manager

      • 对于操作,请选择 GetSecretValue

      • 对于资源,请选择密钥 资源类型条目旁边的添加 ARN

      • 添加 ARN 对话框中,粘贴以前复制的主密钥的 ARN。

    5. 选择查看策略,然后选择创建策略

      注意

      您可以将以下语句粘贴到现有或新策略中,而不是按照前面步骤中所述使用可视化编辑器:

      { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "<ARN of the master secret>" }
    6. 返回到 AWS Secrets Manager 控制台。

如果您还没有将 Lambda 函数的 ARN 分配给密钥,Secrets Manager 将创建该函数,分配所需的所有权限,并将函数配置为处理您的服务。Secrets Manager 将倒计时轮换间隔中指定的天数。当轮换间隔到达零时,Secrets Manager 将再次轮换密钥并重置下一个周期的间隔。将继续执行该过程,直到您禁用轮换。

使用 AWS CLI 或开发工具包操作
最小权限

要在控制台中启用和配置轮换,您必须具有以下托管策略提供的权限:

  • SecretsManagerReadWrite – 提供所有 Secrets Manager、Lambda 和 AWS CloudFormation 权限。

  • IAMFullAccess – 提供创建角色并向其中附加权限策略所需的 IAM 权限。

您可以使用以下 Secrets Manager 命令为 Amazon Redshift 的现有密钥配置轮换:

您还需要使用 AWS CloudFormation 和 AWS Lambda 中的命令。有关以下命令的更多信息,请参阅这些服务的文档。

重要

要用于密钥的轮换函数确定必须在密钥中使用的密钥值的确切格式。有关每个轮换函数的密钥值要求的详细信息,请参阅可用于创建 Lambda 轮换函数的 AWS 模板 中的相关轮换函数下面的预期的 SecretString 值条目。

使用 AWS Serverless Application Repository 模板创建 Lambda 轮换函数

以下 AWS CLI 会话示例执行与基于控制台的轮换配置等效的操作,如使用 AWS 管理控制台选项卡中所述。您可使用 AWS CloudFormation 更改集创建函数。然后,为生成的函数配置所需的权限。最后,使用完成的函数的 ARN 配置密钥,并轮换一次以对其进行测试。

以下示例使用通用模板,因此,该模板使用前面显示的最后一个 ARN。

第一个命令根据 Secrets Manager 提供的模板设置一个 AWS CloudFormation 更改集。

如果服务位于 Amazon VPC 提供的 VPC 中,则必须包含以下命令中的第四个以将函数配置为与 VPC 进行通信。如果不涉及 VPC,则可以跳过该命令。

如果您的 VPC 无法访问 Internet,则必须为您的 VPC 配置 Secrets Manager 私有服务终端节点。以下命令中的第五个可执行此操作。

您可以使用 --application-id 参数来指定要使用的模板。值为模板的 ARN。有关 AWS 提供的模板的列表及其 ARN,请参阅可用于创建 Lambda 轮换函数的 AWS 模板

模板还要求使用随 --parameter-overrides 提供的额外参数,如以下示例中所示。Secrets Manager 需要使用该参数,以将两条信息作为名称和值对发送到模板,从而影响创建轮换函数的过程:

  • endpoint – 您希望轮换函数查询的服务终端节点的 URL。通常为 https://secretsmanager.region.amazonaws.com

  • functionname – 该过程创建的已完成 Lambda 轮换函数的名称。

$ aws serverlessrepo create-cloud-formation-change-set \ --application-id arn:aws-cn:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate \ --parameter-overrides '[{"Name":"endpoint","Value":"https://secretsmanager.region.amazonaws.com"},{"Name":"functionName","Value":"MyLambdaRotationFunction"}]' \ --stack-name MyLambdaCreationStack { "ApplicationId": "arn:aws-cn:serverlessrepo:us-west-2:297356227824:applications/SecretsManagerRDSMySQLRotationSingleUser", "ChangeSetId": "arn:aws-cn:cloudformation:us-west-2:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE", "StackId": "arn:aws-cn:cloudformation:us-west-2:123456789012:stack/aws-serverless-repository-MyLambdaCreationStack/EXAMPLE3-90ab-cdef-fedc-ba987EXAMPLE" }

下一个命令运行刚创建的更改集。change-set-name 参数来自于上一个命令的 ChangeSetId 输出。该命令不会生成任何输出。

$ aws cloudformation execute-change-set --change-set-name arn:aws-cn:cloudformation:us-west-2:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE

以下命令为 Secrets Manager 服务授予代表您调用函数的权限。输出显示添加到角色信任策略的权限。

$ aws lambda add-permission \ --function-name MyLambdaRotationFunction \ --principal secretsmanager.amazonaws.com \ --action lambda:InvokeFunction \ --statement-id SecretsManagerAccess { "Statement": "{\"Sid\":\"SecretsManagerAccess\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"secretsmanager.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws-cn:lambda:us-west-2:123456789012:function:MyLambdaRotationFunction\"}" }

如果在 VPC 中运行服务,则 Secrets Manager 要求使用以下命令。否则,请跳过该命令。请使用 Amazon RDS 控制台或 aws rds describe-instances CLI 命令查找 Amazon Redshift 集群的 VPC 信息。然后,在以下命令中使用该信息并执行该命令。

$ aws lambda update-function-configuration \ --function-name arn:aws-cn:lambda:us-west-2:123456789012:function:MyLambdaRotationFunction \ --vpc-config SubnetIds=<COMMA SEPARATED LIST OF VPC SUBNET IDS>,SecurityGroupIds=<COMMA SEPARATED LIST OF SECURITY GROUP IDs>

如果具有服务实例和 Lambda 轮换函数的 VPC 无法访问 Internet,则必须为您的 VPC 配置 Secrets Manager 私有服务终端节点。这样,轮换函数可访问位于 VPC 内终端节点的 Secrets Manager。

$ aws ec2 create-vpc-endpoint --vpc-id <VPC ID> / --vpc-endpoint-type Interface / --service-name com.amazonaws.<region>.secretsmanager / --subnet-ids <COMMA SEPARATED LIST OF VPC SUBNET IDS> / --security-group-ids <COMMA SEPARATED LIST OF SECURITY GROUP IDs> / --private-dns-enabled

如果您使用模板创建一个需要主密钥的函数,您还必须在函数角色策略中添加以下语句。此时将向轮换函数授予为主密钥检索密钥值的权限。有关完整说明,请参阅 为轮换函数授予权限以访问单独的主密钥

{ "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws-cn:secretsmanager:region:123456789012:secret:MyDatabaseMasterSecret", "Effect": "Allow" },

最后,您可以将轮换配置应用于密钥并执行初始轮换。

$ aws secretsmanager rotate-secret \ --secret-id production/MyAwesomeAppSecret \ --rotation-lambda-arn arn:aws-cn:lambda:us-west-2:123456789012:function:aws-serverless-repository-SecretsManagerRDSMySQLRo-10WGBDAXQ6ZEH \ --rotation-rules AutomaticallyAfterDays=7

如果要为 Amazon Redshift 创建自己的 Lambda 轮换函数,我们建议您应执行使用 SecretsManagerRotationTemplate AWS CloudFormation 模板的上述步骤。通过使用模板,Secrets Manager 可以为您设置大多数权限和配置设置。