AWS Secrets Manager 的主要术语和概念 - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

AWS Secrets Manager 的主要术语和概念

以下术语和概念对了解 AWS Secrets Manager 及其工作原理来说很重要。

Secret

在 Secrets Manager 中,密钥包含一组凭证、用户名和密码以及用于访问受保护服务的连接详细信息。您希望安全地存储它们,并确保仅授权的用户可以访问它们。Secrets Manager 始终以加密形式存储密钥文本,并对传输中的密钥进行加密。

Secrets Manager 使用 IAM 权限策略,以确保仅授权的用户可以访问或修改密钥。您可以将这些策略附加到用户或角色,并指定用户可以访问哪些密钥。有关控制密钥访问的更多详细信息,请参阅 AWS Secrets Manager 的身份验证和访问控制

在存储凭证时,不同的受保护服务可能需要使用不同的信息。Secrets Manager 通过将密钥存储为文本字符串的键/值对来提供此灵活性。如果选择 Secrets Manager 支持的数据库,则 Secrets Manager 根据所选的数据库的轮换函数要求定义键值对。Secrets Manager 将该对的格式设置为 JSON 文本。如果选择 Secrets Manager 没有提供 Lambda 函数的某种其他服务或数据库,您可以将密钥指定为用户定义的 JSON 键值对。

生成的存储加密密钥文本可能与以下示例类似:

{ "host" : "ProdServer-01.databases.example.com", "port" : "8888", "username" : "administrator", "password" : "My-P@ssw0rd!F0r+Th3_Acc0unt", "dbname" : "MyDatabase", "engine" : "mysql" }

如果您使用命令行工具或 API,则还可以在密钥中存储二进制数据。Secrets Manager 控制台不支持二进制数据。

Secrets Manager 可以按照指定的计划自动为您轮换密钥。如果您选择存储用户或账户的一组完整凭证而不是仅存储密码,您可以在不中断服务的情况下轮换凭证。如果您仅更改或轮换密码,则旧密码立即废弃,客户端必须立即开始使用新密码,否则,将会失败。如果您可以创建使用新密码的新用户,或者至少在两个用户之间切换,则旧用户和密码可以继续与新用户和密码并行使用,直到您选择弃用旧用户和密码。这为您提供了一个时段,在此期间,在您测试和验证新凭证的同时,所有客户端可以继续正常工作。在新凭证通过测试后,所有客户端才会使用新凭证并删除旧凭证。

支持的数据库

如果您使用 Secrets Manager 控制台并为 Secrets Manager 内在支持的数据库之一指定密钥,则 Secrets Manager 为您管理所有结构和解析。控制台提示您输入特定类型的数据库的详细信息。然后,Secrets Manager 构建所需的结构,存储信息,并在您检索信息时将其解析回易于理解的文本信息。

其他数据库或服务

如果为“自定义”数据库或服务指定密钥,您可以控制在检索密钥文本后对其执行哪些操作以及如何解释该文本。Secrets Manager 控制台接受您的密钥作为键/值字符串,并自动将它们转换为 JSON 结构来进行存储。如果您在控制台中检索密钥,则 Secrets Manager 会自动将密钥解析回键/值文本字符串以供您查看。如果您以编程方式检索密钥,您可以使用适用于几乎每种编程语言的相应 JSON 解析库,以使用对您有用的任何方式解析密钥。如果密钥需要的字节数超过每个密钥 65536 字节的限制,则可以在两个密钥之间拆分键/值对,然后在检索它们时将其重新连接在一起。

Secrets Manager 密钥的基本结构

在 Secrets Manager 中,密钥不仅可以包含加密密钥文本,还可以包含描述密钥并定义 Secrets Manager 应如何处理密钥的多个元数据元素:

  • 元数据 – 秘诀详情

    • 基本信息包括密钥名称、描述和用作唯一标识符的 Amazon 资源名称 (ARN)。

    • Secrets Manager 用于加密和解密密钥中的受保护文本的 AWS Key Management Service (AWS KMS) 密钥的 ARN。如果未提供该信息,则 Secrets Manager 使用账户的默认 AWS KMS 密钥。

    • 有关轮换密钥的频率以及用于执行轮换的 Lambda 函数的信息。

    • 用户提供的一组标签。您可以将标签作为一个键值对附加到 AWS 资源以进行组织、逻辑分组和成本分配

  • 版本 – 一个或多个 版本 加密机密文本的

    • 虽然通常每次仅有密钥的一个版本处于活动状态,但在为数据库或服务轮换密钥时,可以存在多个版本。每次更改密钥时,Secrets Manager 将创建一个新版本。

    • 每个版本包含加密的密钥值的副本。

    • 每个版本可以附加一个或多个暂存标签,以指定密钥轮换周期的阶段。

受保护服务

Secrets Manager 将受保护服务定义为在网络服务器上运行的数据库或其他服务,并由密钥中存储的凭证控制访问。受保护服务可能指单个服务器或采用相同访问方法的一大组服务器。您需要使用密钥才能成功访问受保护服务。密钥包含客户端访问受保护服务所需的所有信息。本指南将“受保护服务”术语作为通用术语,用于表示 AWS Secrets Manager 可保护其密钥的所有不同类型的数据库和服务。

Rotation

Secrets Manager 将轮换定义为以下过程:您定期更改密钥以使攻击者更难访问受保护服务。借助 Secrets Manager,您不必手动更改密钥并在您的所有客户端上更新它。取而代之的是,Secrets Manager 使用 AWS Lambda 函数为您定期执行轮换的所有步骤。

假设您具有一大组客户端,它们全部运行访问数据库(受保护服务)的应用程序。该应用程序在需要时向 Secrets Manager 发送请求并接收密钥详细信息,而不是将凭证硬编码到应用程序中。在轮换密钥时,Lambda 轮换函数自动执行以下步骤:

  1. 轮换函数访问受保护服务身份验证系统,并创建一组新的凭证以访问数据库。这些凭证通常包含用户名、密码和连接详细信息,但可能因系统而异。Secrets Manager 将这些新凭证作为密钥文本存储在附加了 AWSPENDING 暂存标签的新密钥版本中。

  2. 然后,轮换函数测试密钥的 AWSPENDING 版本以确保凭证正常工作,并授予受保护服务的所需访问级别。

  3. 如果测试成功,则轮换函数会将标签 AWSCURRENT 移动到新版本以将其标记为默认版本。然后,所有客户端开始使用该版本的密钥,而不是旧版本。函数还将标签 AWSPREVIOUS 分配给旧版本,将其标记为“上次已知良好的”版本。具有 AWSPREVIOUS 暂存标签的版本现在没有标签,因此,将弃用该版本。

您可以在控制台中选择轮换密钥来手动触发 Lambda 轮换函数,也可以通过指定轮换计划来每隔 n 天自动触发它。如果您使用 Secrets Manager 内在支持的 AWS 数据库之一,则 Secrets Manager 提供 Lambda 函数以轮换数据库凭证。该函数自动为您执行基本轮换,您也可以自定义该函数以支持高级自定义轮换策略。

如果您选择为自定义服务创建密钥,则必须创建 Lambda 函数。在函数的代码中,您确定如何在函数中编写 JSON 结构并解析它。

对于您的密钥使用的任何服务或数据库,密钥的 Lambda 轮换函数必须能够访问数据库或服务以及 Secrets Manager 服务终端节点。如果 Lambda 轮换函数和数据库或服务位于 Amazon VPC 提供的 VPC 中,您必须为 VPC 配置 Secrets Manager VPC 服务终端节点使用 NAT 网关的直接 Internet 连接,以允许访问公有 Secrets Manager 服务终端节点。

有关轮换的更多信息,请参阅轮换您的 AWS Secrets Manager 密钥

暂存标签

Secrets Manager 使用分段标签(简单的文本串)来帮助您识别 版本轮换. 每次查询加密的密钥值时,您可以指定要检索的密钥版本。如果您未指定版本(通过版本 ID 或暂存标签),Secrets Manager 默认为附加了 AWSCURRENT 暂存标签的版本。Secrets Manager 始终将 AWSCURRENT 暂存标签附加到密钥的一个版本。有关轮换工作原理的示例,请参阅轮换的简要说明。

密钥版本可附加 0 至 20 个暂存标签。你可以定义这些

暂存标签每次只能附加到一个密钥版本。两个密钥版本不能具有相同的暂存标签。如果您将暂存标签附加到一个版本,并且存在具有相同标签的不同版本,您还必须指定该版本以删除标签,否则,Secrets Manager 将返回错误。

密钥的一个版本必须始终具有 AWSCURRENT 暂存标签,并且 API 操作强制实施该行为。Secrets Manager 提供的 Lambda 轮换函数自动在相应的版本上保留 AWSPENDINGAWSCURRENTAWSPREVIOUS 标签。

Versioning

存在密钥的多个版本以支持密钥轮换。Secrets Manager 按暂存标签区分不同的版本。对于大多数情况,您不必担心密钥版本问题。Secrets Manager 和提供的 Lambda 轮换函数为您管理这些详细信息。不过,如果创建 Lambda 轮换函数,则代码必须管理密钥的多个版本,并在版本之间相应地移动暂存标签。版本还具有唯一标识符(通常是 UUID 值),该标识符始终保持相同版本,这与可以在版本之间移动的暂存标签不同。的 UUID 对应 ClientRequestTokenPutSecretValue, CreateSecret、和 UpdateSecret API。

将客户端配置为始终请求附加了 AWSCURRENT 标签的密钥的默认版本。可能存在其他版本,但您只能请求特定的版本 ID 或暂存标签以访问其他版本。如果您请求密钥值,并且未指定版本 ID 或暂存标签,默认情况下,您会看到具有 AWSCURRENT 暂存标签的版本。

在轮换期间,Secrets Manager 会创建新的密钥版本并附加 AWSPENDING 暂存标签。轮换函数使用 AWSPENDING 标签标识版本,直到版本通过测试为止。在轮换函数确认新凭证正常工作后,Secrets Manager 将 AWSPREVIOUS 标签移动到具有 AWSCURRENT 的旧版本,将 AWSCURRENT 标签移动到较新的 AWSPENDING 版本,最后删除 AWSPENDING

有关暂存标签如何工作以支持轮换的更多信息,请参阅轮换您的 AWS Secrets Manager 密钥

为密钥保留的每个版本包含以下元素:

  • 版本的唯一 ID。

  • 一组用于标识版本的暂存标签,它们在密钥中是唯一的。Secrets Manager 弃用没有暂存标签的版本,可能会删除这些版本。

  • 加密并存储的密钥文本。

每次查询加密的密钥值时,您可以指定密钥的版本。如果您未指定版本(通过版本 ID 或暂存标签),Secrets Manager 默认为附加了 AWSCURRENT 暂存标签的版本。Secrets Manager 始终将 AWSCURRENT 暂存标签附加到密钥的一个版本。