为一个支持多个凭证的用户轮换 AWS Secrets Manager 密钥 - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

为一个支持多个凭证的用户轮换 AWS Secrets Manager 密钥

您可以将 AWS Secrets Manager 配置为自动轮换受保护资源的密钥。本主题介绍为身份验证系统配置轮换,从而允许您创建具有至少两个凭证集的单个用户。

作为最佳实践,我们建议您设置第二个“主”密钥,以存储有权删除和创建主用户的凭证的其他用户的凭证。这样,您就可以将为主用户授予的权限限制为应用程序所需的权限。通过这样做,您可以将管理任务分流到第二个用户,最终用户无法访问该用户。主密钥的轮换函数访问第二个用户,以删除旧访问密钥并创建新的密钥。

轮换如何使用标签来管理具有多个凭证的单个用户

以下示例将更详细地介绍此方案。它使用一个服务示例,该服务允许用户具有两个单独的“API 密钥”,它们是由该服务生成的,而不是由轮换函数生成的:

  1. 在该方案中,应用程序先使用具有单个版本“A”的密钥中存储的 API 密钥之一访问受保护资源(数据库)。此 A 版本的密钥已附加暂存标签 AWSCURRENT。应用程序请求具有 AWSCURRENT 暂存标签的版本以检索密钥(步骤 1 和 2)。然后,应用程序使用该版本的密钥中的 API 密钥访问数据库(步骤 3)以检索应用程序所需的数据(步骤 4)。

  2. 密钥轮换函数删除密钥版本“A”当前未引用的 API 密钥,并为相同用户创建新的 API 密钥。然后,轮换函数创建新的密钥版本“B”(不是新密钥,而是同一密钥的新版本)。轮换函数从“A”版本中克隆详细信息,但该函数使用新创建的 API 密钥中的信息替换 API 密钥详细信息。该密钥版本“B”最初具有轮换过程附加的 AWSPENDING 暂存标签。由于自定义应用程序始终请求 AWSCURRENT 标签并且该标签没有移动,因此,应用程序继续检索并使用密钥的原始 A 版本,以使 API 密钥访问受保护资源。

  3. 在测试密钥的版本“B”以确保密钥正常工作后,轮换过程移动“A”版本中的 AWSCURRENT 标签,并将其附加到密钥的新版本“B”。这还会自动将 AWSPENDING 暂存标签移动到具有 AWSCURRENT 暂存标签的版本。这样,密钥可以作为“上次已知良好的”版本,以防需要进行恢复。

  4. 来自自定义应用程序的下一个请求现在收到密钥的“B”版本,因为“B”现在具有 AWSCURRENT 标签。此时,客户应用程序使用密钥的新版本中的 API 密钥。在下一个轮换周期发生时,密钥的“B”版本将变为“A”版本,并再次开始执行步骤 a。

配置轮换以替换用户的凭证

要为只允许您具有一个用户的身份验证系统配置轮换机制,请按照以下过程中的步骤操作:

为具有两组凭证的用户配置轮换

  1. 在保护受保护资源的身份验证系统中创建您的用户。记下您设置的用户名和凭证。就本文而言,我们将它们称为 Creds1Creds2

  2. 创建一个 Secrets Manager 密钥以存储您在上一步中创建的凭证的详细信息。该密钥最初保存用户的 Creds1

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

    2. 选择 New secret (新密钥)。

    3. 对于 Select secret type (选择密钥类型),选择 Other type of secret (其他类型的密钥),包括用户名和第一组凭证。例如,为受保护的密钥文本输入两个密钥/值对。这些对可能类似于以下示例:

      UserName <您的用户名>
      APIKey <您的 API 密钥>
      APIKeyId <确定此版本中存储两个 API 密钥中的哪一个>
    4. 对于 AWS KMS 加密密钥,选择要用于加密该密钥的密钥,或者为账户保留设置的默认值 DefaultMasterKey。要使用默认密钥,访问此密钥的凭证必须来自拥有此密钥的同一账户。如果用户凭证位于不同的账户中,您必须创建并指定自定义客户主密钥 (CMK)。

    5. 对于 Select rotation period (选择轮换期),选择或键入轮换之间的天数。

      注意

      默认情况下,在使用 Secrets Manager 控制台配置轮换时,Secrets Manager 自动启用到期日期并设置为轮换间隔的天数 + 7。

    6. 对于 Select the Lambda rotation function (选择 Lambda 轮换函数),选择 Create function (创建函数)。

    7. 选择下一步

    8. 键入 Secret name (密钥名称) 和可选的 Description (描述)。(可选)您可以添加标签。

    9. 选择 Store secret (存储密钥)。

  3. 检查新密钥以查找 Lambda 轮换函数的 Amazon 资源名称 (ARN)。

    1. 密钥列表页面上,选择您在步骤 2 中创建的密钥的名称。

    2. 密钥详细信息/密钥轮换部分中,选择轮换函数的 ARN 以在 Lambda 中打开该函数。

    3. 使用以下逻辑作为编写轮换函数的基础:

      • createSecret 步骤

        • 使用 GetSecretValue 操作检索 AWSCURRENT 版本的密钥。

        • 从密钥中提取 SecretString 值,并将其存储在可修改的结构中。

        • 确定非活动 API 密钥,这是密钥的 AWSCURRENT 版本中未引用的密钥。

        • 向服务发出命令来删除在上一步中确定的非活动 API 密钥。

        • 向服务发出命令来为同一用户创建新的访问密钥。

        • 使用刚创建的新 API 密钥中的信息覆盖密钥结构副本中的 API 密钥和标识符。使所有其他详细信息保持相同。

        • 将受保护密钥文本的已修改副本作为调用中的 SecretString 参数传递给 PutSecretValue 以进行存储。Secrets Manager 使用 AWSPENDING 标记密钥的新版本。

      • setSecret 步骤

        • 该方案中的 setSecret 步骤不执行任何操作。您在 createSecret 步骤中创建了 API 密钥,因为您必须具有 API 密钥和标识符才能存储在密钥中。您不会像大多数其他情况那样生成自己的密钥。

      • testSecret 步骤

        • 使用 GetSecretValue 操作检索 AWSPENDING 版本的密钥。

        • 向受保护资源发出命令,以尝试使用该版本的密钥中的 API 密钥访问该资源。

      • finishSecret 步骤

        • 将标签 AWSCURRENT 移动到标记有 AWSPENDING 的版本。这还会自动将 AWSPREVIOUS 暂存标签移动到刚从中删除 AWSCURRENT 的密钥。

        • (可选)从密钥的版本中删除 AWSPENDING 标签。