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

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

为只有一个密码的一个用户轮换 AWS Secrets Manager 密钥

您可以将 AWS Secrets Manager 配置为自动轮换受保护资源的密钥。在本主题中,我们介绍了为系统配置轮换,从而允许您创建具有单个密码的单个用户。您可以在需要时更改用户的密码。该方案非常简单,但没有提供具有最高可用性的解决方案。在密码发生变化时,客户端可以继续访问受保护资源。可能会导致一些“拒绝访问”情况。

在更改实际密码以及更改相应密钥以指示客户端使用哪个密码之间可能存在时间滞后,这会带来一定的风险。如果在“服务器场”上托管受保护资源,并且需要一些时间以将密码更改传播到所有成员服务器,这种风险可能会增加。但是,使用适当的重试策略,此风险会明显降低。

一种常见方案是,服务是由访问服务的用户以外的其他人拥有的。服务所有者允许客户创建一个 用户账户,这通常是使用以下信息创建的:将用户电子邮件地址作为用户名或至少作为唯一性键。服务通常允许用户根据需要多次更改密码。但是,服务不允许用户创建其他用户或更改用户名。

轮换如何使用标签来管理更改密码的单个用户

下面将更详细地介绍此方案:

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

  2. 密钥轮换过程创建新的密钥版本“B”(不是新密钥,而是相同密钥的新版本)。该密钥版本 B 最初具有轮换过程附加的 AWSPENDING 暂存标签。密钥版本 B 获得生成的新密码。在 Secrets Manager 成功存储密钥后,轮换过程立即在数据库身份验证系统中更改用户的密码。此时,在数据库上更改密码以及将标签移动到新密钥版本之间,可能会在步骤 4 中发生客户端登录失败。由于此风险,轮换过程立即转到下一个步骤非常重要。

  3. 密钥版本 B 变为使用实时密码,并且轮换过程将 AWSCURRENT 暂存标签从 A 版本移动到密钥的新 B 版本。这还会自动将 AWSPREVIOUS 暂存标签移动到以前使用 AWSCURRENT 暂存标签标记的版本。这样,密钥可以作为“上次已知良好的”版本,以防需要进行恢复。

  4. 来自自定义应用程序的下一个请求现在收到密钥的 B 版本,因为 B 现在具有 AWSCURRENT 标签。此时,客户应用程序依赖于密钥的新版本。

将轮换配置为仅更改密码

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

为仅密码轮换配置轮换

  1. 在保护受保护资源的身份验证系统中创建单个用户。记下密码。

  2. 创建一个 Secrets Manager 密钥以存储您在上一步中创建的凭证的详细信息:

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

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

    3. 对于 Select secret type(选择密钥类型),选择最适合您服务的选项。然后,配置包括用户名和初始密码在内的数据库或服务的详细信息。

    4. 对于 AWS KMS 加密密钥,选择要用于加密该密钥的客户主密钥 (CMK),或者为账户保留设置的值 DefaultMasterKey。要使用默认密钥,访问该密钥的凭证必须来自于拥有该密钥的同一账户。如果用户凭证位于不同的账户中,则必须创建并指定自定义 CMK 的 Amazon 资源名称 (ARN)。

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

      注意

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

    6. 对于 What credentials can rotate this secret? (哪些凭证可以轮换此密钥?),选择 Use the same credentials (使用相同凭证)

      注意

      该示例方案假定用户可以更改其密码,并且您无法使用第二个有权更改第一个用户的密码的用户。

    7. 选择下一步

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

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

  3. 检查您的新密钥以获取 Lambda 轮换函数的 ARN。

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

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

    3. 自定义轮换函数以满足您的特定要求。您可以使用以下每个步骤的要求作为编写函数的基础。

      • createSecret 步骤

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

        • SecretString 字段中提取受保护密钥文本,并将其存储在可修改的结构中。

        • 使用一种算法生成新密码,该算法生成的密码满足受保护资源支持的最大长度和复杂性要求。

        • 使用在上一步中生成的新密码覆盖结构中的 password 字段。将所有其他详细信息保持不变,如 username 和连接详细信息。

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

      • setSecret 步骤

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

        • 向受保护资源身份验证系统发出命令,以将现有用户密码更改为密钥的新 AWSPENDING 版本中存储的密码。

      • testSecret 步骤

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

        • 向受保护资源发出命令以尝试使用密钥中的凭证访问它。

      • finishSecret 步骤

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

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

重要

请注意,在此方案中,在创建并验证新版本时,您的用户无法继续使用旧版本操作。因此,在 setSecret 阶段中更改密码与在 finishSecret 阶段中将 AWSCURRENT 标签移动到新版本之间,客户端可能会使用错误的凭证并出现“拒绝被访问”错误。对于这种情况,请务必在客户端应用程序中包括合理的重试功能,以帮助减轻这种风险。