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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

AWS Secrets Manager 的主要术语和概念

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

Secret

在 Secrets Manager 中,密钥包含一组凭证、用户名和密码以及用于访问受保护服务。您需要安全存储它们,并确保只有授权用户可以访问它们。密钥管理器始终以加密形式存储密钥文本,并在传输过程中加密密密钥。

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

在存储凭证时,不同的受保护服务可能需要使用不同的信息。密钥管理器通过将密钥存储为文本字符串的键/值对来提供此灵活性。如果选择 Secrets Manager 支持的数据库,密钥管理器将根据所选数据库的轮换函数的要求定义键/值对。Secrets Manager 将对格式化为JSON文本。如果您选择没有为其提供 Lambda 函数的某个其他服务或数据库 Secret Secrets Manager,则可以将密钥指定为用户定义的 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 结构来进行存储。如果您在控制台中检索密钥,则 Secret Manager 会自动将密钥解析回键/值文本字符串以供您查看。如果您以编程方式检索密钥,您可以使用适用于几乎每种编程语言的相应 JSON 解析库,以使用对您有用的任何方式解析密钥。如果密钥需要的字节数超过每个密钥 65536 字节的限制,则可以在两个密钥之间拆分键/值对,然后在检索它们时将其重新连接在一起。

多区域密钥

Secrets Manager 和多区域密钥使用两种不同类型的秘密:

  • 主密钥-Secrets Manager 使用主密钥将其和相关元数据复制到应用程序可以使用它的其他区域。

  • 复本密钥-您复制主密钥以在其他区域创建相同的密钥。副本密钥与主密钥共享一个公用名称,以便您可以轻松地搜索它。Secrets Manager 使用 AWS Key Management Service 和 KMS 托管密钥以及区域客户托管密钥 (CMK)。

密钥 Secrets Manager 钥的基本结构

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

  • 元数据 — 有关密钥的详细信息

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

    • AWS KMS) 密钥管理服务的 ARN 用于加 Secrets Manager 和解密密密钥中的受保护文本。如果未提供该信息,则 Secrets Manager 会为账户使用默认的 AWS KMS 密钥。

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

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

  • 版本 — 包含一个或多个版本加密的机密文本

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

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

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

受保护服务

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

Rotation

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

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

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

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

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

您可以手动触发 Lambda 旋转功能,当您选择轮换密钥,或者您可以在每个n天通过指定轮换计划。如果您使用Secrets Manager 本身支持的 AWS 数据库之一,则 Secrets Manager 提供 Lambda 函数以轮换数据库凭证。该函数自动为您执行基本轮换,您也可以自定义该函数以支持高级自定义轮换策略。

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

对于您的密钥使用的任何服务或数据库,密钥的 Lambda 轮换函数必须能够访问数据库或服务以及密钥管理器服务终端节点。如果 Lambda Rotation 函数和数据库或服务位于 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 个暂存标签。例如,如果SecretAVersion1具有 20 个临时标签,并且您希望将临时标签添加到SecretBVersion1,则必须从SecretAVersion1,然后将临时标签添加到SecretBVersion1

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

密钥的一个版本必须始终具有 AWSCURRENT 暂存标签,并且 API 操作强制实施该行为。Secrets Manager 提供的 Lambda 旋转函数会自动维护AWSPENDINGAWSCURRENT, 和AWSPREVIOUS标签上的相应版本。

Versioning

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

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

在轮换期间,Secrets Manager 会创建新的密钥版本并附加暂存标签。AWSPENDING。轮换函数使用 AWSPENDING 标签标识版本,直到版本通过测试为止。旋转函数验证新的凭据工作后,Secrets Manager 移动标签AWSPREVIOUS添加到旧版本AWSCURRENT,然后移动标签AWSCURRENT更新版本的AWSPENDING版本。

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

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

  • 版本的唯一 ID。

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

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

每次查询加密的密钥值时,您可以指定密钥的版本。如果未通过版本 ID 或暂存标签指定版本,则 Secrets Manager 默认使用暂存标签的版本。AWSCURRENT附加。Secrets Manager 始终附加临时标签AWSCURRENT更新为密钥的一个版本。