AWS KMS 概念 - AWS Key Management Service

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

AWS KMS 概念

了解 AWS Key Management Service (AWS KMS) 中使用的基本术语和概念,以及它们如何协同工作以帮助保护您的数据。

AWS KMS keys

AWS KMS keys (KMS 密钥)是中的主要资源 AWS KMS。您可以使用 KMS 密钥加密、解密和重新加密数据。它还可以生成可在外部使用的数据密钥 AWS KMS。通常,您将使用对称加密 KMS 密钥,但也可以创建和使用非对称 KMS 密钥来进行加密或签名,并创建和使用 HMAC KMS 密钥来生成和验证 HMAC 标签。

注意

AWS KMS 正在将 “客户主密钥 (CMK)” 一词替换为 “AWS KMS keyKMS 密钥”。这一概念并未改变。为了防止重大更改, AWS KMS 保留了该术语的一些变体。

AWS KMS key 是加密密钥的逻辑表示形式。KMS 密钥包含密钥 ID、密钥规范密钥用法、创建日期、描述和密钥状态等元数据。最重要的是,其中包含对您使用 KMS 密钥运行加密操作时所用的密钥材料的引用。

您可以使用在 AWS KMS FIPS 验证的硬件安全模块中生成的加密密钥材料创建 KMS 密钥。对称 KMS 密钥的密钥材料和非对称 KMS 密钥的私有密钥永远不会让 AWS KMS 处于未加密状态。要使用或管理 KMS 密钥,您必须使用 AWS KMS。有关创建和管理 KMS 密钥的信息,请参阅 管理 密钥。有关使用 KMS 密钥的信息,请参阅 AWS Key Management Service API 参考

默认情况下,为 KMS 密钥 AWS KMS 创建密钥材料。您无法提取、导出、查看或管理此密钥材料。唯一的例外是非对称密钥对的公有密钥,您可以将其导出以供 AWS外部使用。此外,您无法删除此密钥材料;您必须删除 KMS 密钥。但是,您可以将自己的密钥材料导入 KMS 密钥中,也可以使用自定义密钥存储来创建 KMS 密钥,该密钥使用 AWS CloudHSM 集群中的密钥材料或您在集群之外拥有和管理的外部密钥管理器中的密钥材料 AWS。

AWS KMS 还支持多区域密钥,允许您将数据加密为一体, AWS 区域 然后在另一区域进行解密。 AWS 区域

有关创建和管理 KMS 密钥的信息,请参阅 管理 密钥。有关使用 KMS 密钥的信息,请参阅 AWS Key Management Service API 参考

客户密钥和 AWS 密钥

您创建的 KMS 密钥是客户托管式密钥。使用 KMS 密钥加密服务资源的 AWS 服务 通常会为您创建密钥。在您的 AWS 账户中 AWS 服务 创建的 KMS 密钥是AWS 托管式密钥。在服务账户中 AWS 服务 创建的 KMS 密钥是AWS 拥有的密钥

KMS 密钥的类型 可以查看 KMS 密钥元数据 可以管理 KMS 密钥 仅用于我的 AWS 账户 自动轮换 定价
客户托管的密钥 可选。每年(大约 365 天)

月度费用(按小时计费)

每次使用费用

AWS 托管式密钥 必需。每年(大约 365 天)

没有月度费用

按次使用费(有些人会为您 AWS 服务 支付此费用)

AWS 拥有的密钥 变化 无费用

AWS 与之集成的服务对 KMS 密钥的支持各不 AWS KMS相同。某些 AWS 服务默认使用 AWS 拥有的密钥 或加密您的数据 AWS 托管式密钥。某些 AWS 服务支持客户管理的密钥。其他 AWS 服务支持所有类型的 KMS 密钥 AWS 拥有的密钥,使您可以轻松获取 AWS 托管式密钥、查看或控制客户托管的密钥。有关 AWS 服务提供的加密选项的详细信息,请参阅该服务的用户指南或开发人员指南中的静态加密主题。

客户管理密钥

您创建的 KMS 密钥是客户托管式密钥。客户托管密钥是您 AWS 账户 自己创建、拥有和管理的 KMS 密钥。您可以完全控制这些 KMS 密钥,包括建立和维护其密钥策略、IAM policy 和授权启用和禁用它们、轮换其加密材料添加标签创建别名(引用了 KMS 密钥)以及计划删除 KMS 密钥

客户托管密钥显示在 AWS KMS的 AWS Management Console 的 Customer managed keys(客户托管密钥)页面上。要明确识别客户管理的密钥,请使用DescribeKey操作。对于客户托管密钥,DescribeKey 响应的 KeyManager 字段的值为 CUSTOMER

您可以在加密操作中使用客户托管密钥并在 AWS CloudTrail 日志中审核其使用情况。此外,许多与 AWS KMS集成的AWS 服务使您能够指定客户托管密钥以保护为您存储和管理的数据。

客户托管密钥会产生月费以及超过免费套餐使用量的费用。它们将计入您账户的 AWS KMS 配额。有关详细信息,请参阅 AWS Key Management Service 定价配额

AWS 托管式密钥

AWS 托管式密钥是您账户中的 KMS 密钥,由与集成的AWS 服务代表您创建、管理和使用 AWS KMS。

有些 AWS 服务允许您选择一个 AWS 托管式密钥 或一个客户托管的密钥来保护您在该服务中的资源。通常,除非要求您控制保护资源的加密密钥,否则 AWS 托管式密钥 不妨选择。您不必创建或维护密钥或密钥策略,并且永远不会产生 AWS 托管式密钥月度费用。

您有权 AWS 托管式密钥在您的账户中查看查看其密钥策略审核其在 AWS CloudTrail 日志中的使用情况。但是,您不能更改其任何属性 AWS 托管式密钥、轮换它们、更改其密钥策略或安排将其删除。而且,您不能直接 AWS 托管式密钥 在加密操作中使用;创建加密操作的服务会代表您使用它们。

AWS 托管式密钥 显示在 fo AWS 托管式密钥r AWS Management Console 的页面上 AWS KMS。您也可以 AWS 托管式密钥 通过别名进行识别,其格式为 aws/service-nameaws/redshift,例如。要明确识别 AWS 托管式密钥,请使用DescribeKey操作。对于 AWS 托管式密钥,DescribeKey 响应的 KeyManager 字段的值为 AWS

所有这些 AWS 托管式密钥 都是每年自动轮换的。您不能更改此轮换计划。

注意

2022年5月,将轮换时间表 AWS 托管式密钥 从每三年(约1,095天) AWS KMS 改为每年(约365天)。

新 AWS 托管式密钥 版本在创建一年后自动轮换,此后大约每年轮换一次。

现有 AWS 托管式密钥 人员在最近一次轮换一年后自动轮换,此后每年轮换。

不收取月费 AWS 托管式密钥. 超出免费套餐的使用可能会收取费用,但有些 AWS 服务会为您支付这些费用。有关详细信息,请参阅服务的用户指南或开发人员指南中的静态加密主题。有关详细信息,请参阅 AWS Key Management Service 定价

AWS 托管式密钥 不要计入您账户中每个区域的 KMS 密钥数量的资源配额。但是,当代表您账户中的委托人使用这些 KMS 密钥时,它们将计入请求配额。有关更多信息,请参阅 配额

AWS 拥有的密钥

AWS 拥有的密钥是 AWS 服务拥有和管理的 KMS 密钥的集合,用于多个密钥 AWS 账户。尽管 AWS 拥有的密钥 不在您的账户中 AWS 账户,但 AWS 服务可以使用 AWS 拥有的密钥 来保护您账户中的资源。

某些 AWS 服务允许您选择 AWS 拥有的密钥 或客户管理的密钥。通常,除非要求您审核或控制保护资源的加密密钥, AWS 拥有的密钥 否则不妨选择。 AWS 拥有的密钥 完全免费(没有月费或使用费),它们不计入您账户的AWS KMS 配额,而且易于使用。您不必创建或维护该密钥或其密钥策略。

的轮换因服务 AWS 拥有的密钥 而异。有关特定项轮换的信息 AWS 拥有的密钥,请参阅该服务的用户指南或开发者指南中的静态加密主题。

对称加密 KMS 密钥

创建时 AWS KMS key,默认情况下,您将获得用于对称加密的 KMS 密钥。这是基本和最常用的 KMS 密钥类型。

在中 AWS KMS,对称加密 KMS 密钥代表 256 位 AES-GCM 加密密钥,但中国地区除外,它代表 128 位 SM4 加密密钥。对称密钥材料永远不会处于 AWS KMS 未加密状态。要使用对称加密 KMS 密钥,必须调用 AWS KMS。对称加密密钥用在对称加密中,加密和解密采用的是相同的密钥。除非任务明确要求使用非对称加密,否则对称加密 KMS 密钥(永远不会让 AWS KMS 处于未加密状态)是个不错的选择。

AWS 与之集成的服务仅 AWS KMS使用对称加密 KMS 密钥来加密您的数据。这些服务不支持使用非对称 KMS 密钥进行加密。要获取确定 KMS 密钥是对称还是非对称的帮助,请参阅 识别非对称 KMS 密钥

从技术上讲,对称密钥的密钥规范是 SYMMETRIC_DEFAULT,密钥用法是 ENCRYT_DECHLOT,加密算法是 SYMMETRIC_DEFAULT。有关更多信息,请参阅 SYMMETRIC_DEFAULT 密钥规范

您可以使用中的对称加密 KMS 密钥 AWS KMS 来加密、解密和重新加密数据,并生成数据密钥和数据密钥对。您可以创建多区域对称加密 KMS 密钥,将自己的密钥材料导入对称加密 KMS 密钥中,并在自定义密钥存储中创建对称加密 KMS 密钥。有关您可以对不同类型 KMS 密钥执行的操作进行比较的表格,请参阅 密钥类型引用

非对称 KMS 密钥

您可以在 AWS KMS中创建非对称 KMS 密钥。非对称 KMS 密钥表示数学上相关的公有密钥和私有密钥对。私钥永远不会处于 AWS KMS 未加密状态。要使用私钥,您必须致电 AWS KMS。您可以 AWS KMS 通过调用 AWS KMS API 操作在内部使用公钥,也可以下载公钥并在外部使用 AWS KMS。您也可以创建多区域非对称 KMS 密钥。

您可以创建表示 RSA 密钥对、椭圆曲线密钥对或 SM2 密钥对的非对称 KMS 密钥(仅限中国区域)。带有 RSA 密钥对的 KMS 密钥可用于加密或解密数据或对消息进行签名和验证(但不能两者兼而有之)。带有 NIST 推荐的椭圆曲线密钥对的 KMS 密钥可用于签名和验证消息或派生共享密钥(但不能两者兼而有之)。带有密ECC_SECG_P256K1钥对的 KMS 密钥只能用于对消息进行签名和验证。带有 SM2(仅限中国区域)密钥对的 KMS 密钥可用于加密和解密数据、签名和验证消息或派生共享密钥(您必须选择一种密钥使用类型)。

有关创建和使用非对称 KMS 密钥的更多信息,请参阅 中的非对称密钥 AWS KMS

HMAC KMS 密钥

HMAC KMS 密钥表示长度不同的对称密钥,用于生成和验证 HMAC 散列消息认证码。HMAC 密钥的密钥材料永远不会处于 AWS KMS 未加密状态。要使用 HMAC 密钥,请调用 GenerateMacVerifyMac API 操作。

您也可以创建多区域 HMAC KMS 密钥。

有关创建和使用 HMAC KMS 密钥的更多信息,请参阅 AWS KMS 中的 HMAC 密钥

数据密钥

数据密钥是可用于加密数据的对称密钥,包括大量数据和其他数据加密密钥。与无法下载的对称 KMS 密钥不同,数据密钥会返回给您,供您在外部使用。 AWS KMS

AWS KMS 生成数据密钥时,它会返回一个供立即使用的纯文本数据密钥(可选)和数据密钥的加密副本,您可以安全地将其与数据一起存储。当你准备好解密数据时,你首先要求 AWS KMS 解密加密的数据密钥。

AWS KMS 生成、加密和解密数据密钥。但是, AWS KMS 不会存储、管理或跟踪您的数据密钥,也不会使用数据密钥执行加密操作。您必须在外部使用和管理数据密钥 AWS KMS。有关安全使用数据密钥的帮助,请参阅 AWS Encryption SDK

创建数据密钥

要创建数据密钥,请调用该GenerateDataKey操作。 AWS KMS 生成数据密钥。然后,它会在您指定的对称加密 KMS 密钥下加密数据密钥的副本。此操作会返回数据密钥的明文副本以及由 KMS 密钥加密的数据密钥的副本。下图展示了此操作。

生成数据密钥

AWS KMS 还支持该GenerateDataKeyWithoutPlaintext操作,该操作仅返回加密的数据密钥。当您需要使用数据密钥时,请要求对其 AWS KMS 进行解密

使用数据密钥加密数据

AWS KMS 无法使用数据密钥加密数据。但您可以在 AWS KMS之外使用数据密钥,例如使用 OpenSSL 或 AWS Encryption SDK 等加密库。

在使用明文数据密钥加密数据后,请尽快从内存中将其删除。您可以安全地存储加密数据密钥及加密数据,以便其可根据需要用于解密数据。

加密外部的用户数据 AWS KMS

使用数据密钥解密数据

要解密您的数据,请将加密的数据密钥传递给密操作。 AWS KMS 使用您的 KMS 密钥解密数据密钥,然后返回纯文本数据密钥。使用明文数据密钥解密数据,并尽快从内存中删除该明文数据密钥。

下图显示了如何使用 Decrypt 操作解密加密的数据密钥。

解密数据密钥

不可用的 KMS 密钥如何影响数据密钥

当 KMS 密钥不可用时,您可以立即发现(取决于最终一致性)。KMS 密钥的密钥状态会出现变更,以反映其新情况,并且加密操作中使用 KMS 密钥的所有请求都将失败。

但是,对由 KMS 密钥加密的数据密钥,以及由数据密钥加密的数据的影响会延迟,直至再次使用 KMS 密钥(例如用于解密数据密钥)。

KMS 密钥状态变为不可用的原因有许多,包括您可能执行的以下操作。

对于许多使用数据密钥保护服务管理 AWS 服务 的资源的人来说,这种效果尤其重要。以下几个示例使用 Amazon Elastic Block Store(Amazon EBS)和 Amazon Elastic Compute Cloud(Amazon EC2)。不同的 AWS 服务 使用数据密钥的方式不同。有关详细信息,请参阅 AWS 服务的“安全性”一章的“数据保护”部分。

例如,考虑以下情景:

  1. 创建加密 EBS 卷并指定 KMS 密钥来保护该卷。Amazon EBS AWS KMS 要求使用您的 KMS 密钥为该卷生成加密的数据密钥。Amazon EBS 使用该卷的元数据存储加密数据密钥。

  2. 当您将 EBS 卷附加到 EC2 实例时,Amazon EC2 使用您的 KMS 密钥来解密 EBS 卷的加密数据密钥。Amazon EC2 使用 Nitro 硬件中的数据密钥,该硬件负责对 EBS 卷的所有磁盘 I/O 进行加密。EBS 卷附加到 EC2 实例时,数据密钥会保留在 Nitro 硬件中。

  3. 您执行的操作会使 KMS 密钥不可用。这不会立即影响 EC2 实例或 EBS 卷。卷附加到实例时,Amazon EC2 使用数据密钥(而不是 KMS 密钥),来对所有磁盘输入/输出进行加密。

  4. 但是,当加密的 EBS 卷从 EC2 实例分离时,Amazon EBS 将从 Nitro 硬件中删除该数据密钥。下次将加密的 EBS 卷附加到 EC2 实例时,附加会失败,因为 Amazon EBS 无法使用 KMS 密钥来解密卷的加密数据密钥。要再次使用 EBS 卷,您必须使该 KMS 密钥可重新使用。

数据密钥对

数据密钥对是由数学上相关的公有密钥和私有密钥组成的非对称数据密钥。它们专为客户端加密和解密或外部的签名和验证而设计。 AWS KMS

与 OpenSSL 等工具生成的数据密钥对不同, AWS KMS 它使用您指定的对称加密 KMS 密钥保护每个数据密钥 AWS KMS 对中的私钥。但是, AWS KMS 不会存储、管理或跟踪您的数据密钥对,也不会使用数据密钥对执行加密操作。您必须在 AWS KMS之外使用和管理数据密钥对。

AWS KMS 支持以下类型的数据密钥对:

  • RSA 密钥对:RSA_2048、RSA_3072 和 RSA_4096

  • 椭圆曲线密钥对:ECC_NIST_P256、ECC_NIST_P384、ECC_NIST_P521 和 ECC_SECG_P256K1

  • SM 密钥对(仅限中国区域):SM2

选择何种数据密钥对通常取决于使用案例或法规要求。大多数证书需要 RSA 密钥。椭圆曲线密钥通常用于数字签名或派生共享密钥。ECC_SECG_P256K1 密钥通常用于加密货币。 AWS KMS 建议您使用 ECC 密钥对进行签名,并使用 RSA 密钥对进行加密或签名,但不能同时使用两者。但是, AWS KMS 不能对在之外使用数据密钥对施加任何限制 AWS KMS。

创建数据密钥对

要创建数据 key pair,请调用GenerateDataKeyPairGenerateDataKeyPairWithoutPlaintext操作。指定要用于加密私有密钥的对称加密 KMS 密钥

GenerateDataKeyPair 返回一个明文公有密钥、一个明文私有密钥和一个加密的私有密钥。如果您即刻需要明文私有密钥,例如生成数字签名,则可使用此操作。

GenerateDataKeyPairWithoutPlaintext 返回一个明文公有密钥和一个加密的私有密钥,但不返回明文私有密钥。如果您并非即刻需要明文私有密钥,例如使用公有密钥进行加密,则可使用此操作。稍后,如果您需要明文私有密钥来解密数据,则可调用 Decrypt 操作。

下图显示了 GenerateDataKeyPair 操作。GenerateDataKeyPairWithoutPlaintext 操作省略了明文私有密钥。

生成数据密钥对

使用数据密钥对加密数据

使用数据密钥对加密时,用该密钥对的公有密钥加密数据,然后用同一密钥对的私有密钥解密数据。通常,当多方需要加密数据,而只有持有私有密钥的一方才能解密该数据时,您可以使用数据密钥对。

持有公有密钥的多方使用该密钥加密数据,如下图所示。

使用 data key pair 之外的公钥对用户数据进行加密 AWS KMS

使用数据密钥对解密数据

要解密数据,请使用数据密钥对中的私有密钥。为使操作成功,公有密钥和私有密钥必须来自同一数据密钥对,并且必须使用相同的加密算法。

要对加密的私有密钥进行解密,请将其传递给 Decrypt 操作。使用明文私有密钥解密数据。然后尽快从内存中删除明文私有密钥。

下图显示了如何使用数据密钥对中的私有密钥解密密文。

在 AWS KMS外部使用数据密钥对中的私有密钥解密数据。

使用数据密钥对签署消息

要为消息生成加密签名,请使用数据密钥对中的私有密钥。持有公有密钥的任何人都可以使用该密钥来验证消息已使用私有密钥签名,并且自签名以后未曾更改。

如果您对私钥进行加密,请将加密的私钥传递给 Decrypt 操作。 AWS KMS 使用您的 KMS 密钥解密数据密钥,然后返回纯文本私钥。使用明文私有密钥生成签名。然后尽快从内存中删除明文私有密钥。

要签署消息,请使用加密哈希函数(如 OpenSSL 中的 dgst 命令)创建消息摘要。然后,将明文私有密钥传递给签名算法。结果是一个表示消息内容的签名。(您可能无需先创建摘要即可签署较短的消息。最大消息大小因您使用的签名工具而异。)

下图显示了如何使用数据密钥对中的私有密钥签署消息。

使用外部的数据密钥 pair 中的私钥生成加密签名。 AWS KMS

使用数据密钥对验证签名

持有数据密钥对中公有密钥的任何人,都可以使用该密钥来验证使用私有密钥生成的签名。验证确认已授权用户使用指定的私有密钥和签名算法签署了消息,并且消息自签名以后未曾更改。

要使验证成功,验证签名的一方必须生成相同类型的摘要,使用相同的算法,并使用与用于签署消息的私有密钥相对应的公有密钥。

下图显示了如何使用数据密钥对中的公有密钥验证消息签名。

在 AWS KMS外部使用数据密钥对中的公有密钥验证加密签名。

使用数据密钥对派生共享密钥

密钥协议使两个 Peer 节点能够通过不安全的通道建立共享密钥,每个节点都有一个椭圆曲线的公私密钥对。要获得共享密钥,两个对等体必须通过不安全的通信渠道(如互联网)交换其公钥。然后,各方使用其私钥和对等方的公钥,使用密钥协议算法计算相同的共享密钥。您可以使用共享密钥值派生对称密钥,该密钥可以加密和解密在两个对等体之间发送的数据,或者可以生成和验证 HMAC。

注意

AWS KMS 强烈建议在使用公钥派生共享密钥之前,先验证您收到的公钥是否来自预期方。

别名

使用别名作为 KMS 密钥的友好名称。例如,您可以将 KMS 密钥引用为 test-key,而不是 1234abcd-12ab-34cd-56ef-1234567890ab。

别名可以更轻松地识别 AWS Management Console中的 KMS 密钥。在某些 AWS KMS 操作(包括加密操作)中,您可以使用别名来标识 KMS 密钥。在应用程序中,您可以使用单个别名来引用每个别名中的不同的 KMS 密钥 AWS 区域。

您还可以根据 KMS 密钥的别名允许和拒绝访问 KMS 密钥,而无需编辑策略或管理授权。此功能是对基于属性的访问控制 (ABAC) 的 AWS KMS 支持的一部分。有关更多信息,请参阅 AWS KMS 中的 ABAC

在中 AWS KMS,别名是独立的资源,而不是 KMS 密钥的属性。因此,您可以添加、更改和删除别名,而不会影响关联的 KMS 密钥。

重要

不要在别名名称中包含机密或敏感信息。别名可能会以纯文本形式出现在 CloudTrail 日志和其他输出中。

了解更多:

自定义密钥存储

自定义密钥存储库是由您拥有和管理的密钥管理器 AWS KMS 之外的 AWS KMS 资源提供支持。在自定义密钥存储中使用 KMS 密钥进行加密操作时,加密操作实际上是在您的密钥管理器中使用加密密钥来执行。

AWS KMS 支持由 AWS CloudHSM 群集支持的 AWS CloudHSM 密钥存储以及由外部密钥管理器支持的外部密钥管理器支持的外部密钥存储库 AWS。

有关更多信息,请参阅 自定义密钥存储

加密操作

在中 AWS KMS,加密操作是使用 KMS 密钥保护数据的 API 操作。由于 KMS 密钥保留在其中 AWS KMS,因此您必须调用 AWS KMS 才能在加密操作中使用 KMS 密钥。

要使用 KMS 密钥执行加密操作,请使用 AWS 软件开发工具包、 AWS Command Line Interface (AWS CLI) 或。 AWS Tools for PowerShell无法在 AWS KMS 控制台中执行加密操作。有关使用多种编程语言调用加密操作的示例,请参阅使用 AWS KMS API 进行编程

下表列出了 AWS KMS 加密操作。它还显示操作中使用的 KMS 密钥的密钥类型和密钥使用要求。

操作 密钥类型 密钥用法
Decrypt 对称或非对称 ENCRYPT_DECRYPT
DeriveSharedSecret 非对称 KEY_AGREEMENT
Encrypt 对称或非对称 ENCRYPT_DECRYPT
GenerateDataKey 对称 ENCRYPT_DECRYPT
GenerateDataKeyPair 对称 [1]

在自定义密钥存储中的 KMS 密钥中不受支持。

ENCRYPT_DECRYPT
GenerateDataKeyPairWithoutPlaintext 对称 [1]

在自定义密钥存储中的 KMS 密钥中不受支持。

ENCRYPT_DECRYPT
GenerateDataKeyWithoutPlaintext 对称 ENCRYPT_DECRYPT
GenerateMac HMAC GENERATE_VERIFY_MAC
GenerateRandom 不适用。此操作不使用 KMS 密钥。 不适用
ReEncrypt 对称或非对称 ENCRYPT_DECRYPT
Sign 非对称 SIGN_VERIFY
验证 非对称 SIGN_VERIFY
VerifyMac HMAC GENERATE_VERIFY_MAC

[1] 生成受对称加密 KMS 密钥保护的非对称数据密钥对。

有关加密操作的权限的信息,请参阅 AWS KMS 权限

为了让所有用户都能 AWS KMS 快速响应且功能强大, AWS KMS 请为每秒调用的加密操作数量设定配额。有关更多信息,请参阅 加密操作的共享配额

密钥标识符 (KeyId)

密钥标识符用作 KMS 密钥的名称。它们可帮助您在控制台中识别 KMS 密钥。您可以使用它们来指示要在 AWS KMS API 操作、密钥策略、IAM policy 和授权中使用的 KMS 密钥。密钥标识符值跟与 KMS 密钥关联的密钥材料完全无关。

AWS KMS 定义了几个密钥标识符。创建 KMS 密钥时, AWS KMS 会生成密钥 ARN 和密钥 ID,它们是 KMS 密钥的属性。创建名时, AWS KMS 会根据您定义的别名生成别名 ARN。您可以在和的 AWS KMS API 中查看密钥 AWS Management Console 和别名标识符。

在 AWS KMS 控制台中,您可以按密钥 ARN、密钥 ID 或别名查看和筛选 KMS 密钥,并按密钥 ID 和别名进行排序。有关在控制台中查找密钥标识符的帮助,请参阅查找密钥 ID 和密钥 ARN

在 AWS KMS API 中,用于标识 KMS 密钥的参数被命名KeyId或变体,例如TargetKeyIdDestinationKeyId。但是,这些参数的值不限于密钥 ID。一些参数可以使用任意有效的密钥标识符。有关每个参数的值的信息,请参阅《 AWS Key Management Service API 参考》中的参数描述。

注意

使用 AWS KMS API 时,请注意您使用的密钥标识符。不同的 API 需要不同的密钥标识符。通常,请在您的任务中使用最完整实用的密钥标识符。

AWS KMS 支持以下密钥标识符。

密钥 ARN

密钥 ARN 是 KMS 密钥的 Amazon Resource Name (ARN)。它是 KMS 密钥唯一的完全限定标识符。密钥 ARN 包括 AWS 账户、区域和密钥 ID。有关查找 KMS 密钥的密钥 ARN 的帮助,请参阅 查找密钥 ID 和密钥 ARN

密钥 ARN 的格式如下:

arn:<partition>:kms:<region>:<account-id>:key/<key-id>

以下是单区域 KMS 密钥的示例密钥 ARN。

arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

多区域密钥的密钥 ARN 的 key-id 元素以 mrk- 前缀开头。以下是多区域密钥的示例密钥 ARN。

arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab
密钥 ID

密钥 ID 唯一地标识账户和区域中的 KMS 密钥。有关查找 KMS 密钥的密钥 ID 的帮助,请参阅 查找密钥 ID 和密钥 ARN

以下是单区域 KMS 密钥的示例密钥 ID。

1234abcd-12ab-34cd-56ef-1234567890ab

多区域密钥的密钥 ID 以 mrk- 前缀开头。以下是多区域密钥的示例密钥 ID。

mrk-1234abcd12ab34cd56ef1234567890ab
别名 ARN

别名 ARN 是别名的亚马逊资源名称 (ARN)。 AWS KMS 它是别名及所表示 KMS 密钥的唯一的完全限定标识符。别名 ARN 包括 AWS 账户、地区和别名。

在任何给定时间,一个别名 ARN 标识一个特定的 KMS 密钥。但是,由于您可以更改与别名关联的 KMS 密钥,别名 ARN 在不同时间可以标识不同的 KMS 密钥。有关查找 KMS 密钥的别名 ARN 的帮助,请参阅 查找别名和别名 ARN

别名 ARN 的格式如下:

arn:<partition>:kms:<region>:<account-id>:alias/<alias-name>

以下是虚构的 ExampleAlias 的别名 ARN。

arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias
别名

别名是最多 256 个字符的字符串。它唯一地标识某个账户和区域内关联的一个 KMS 密钥。在 AWS KMS API 中,别名始终以开头alias/。有关查找 KMS 密钥的别名的帮助,请参阅 查找别名和别名 ARN

别名的格式如下:

alias/<alias-name>

例如:

alias/ExampleAlias

别名的 aws/ 前缀保留用于 AWS 托管式密钥。您无法使用此前缀创建别名。例如,亚马逊简单存储服务 (Amazon S3) Simple Service 的别名如下所示。 AWS 托管式密钥

alias/aws/s3

密钥材料

密钥材料是加密算法中使用的位串。秘密密钥材料必须保密,以保护使用它的加密操作。公有密钥材料旨在用于共享。

每个 KMS 密钥的元数据中都包含对其密钥材料的引用。对称加密 KMS 密钥的密钥材料源可能会有所不同。您可以使用生 AWS KMS 成的密钥材料、在自定义密钥库 AWS CloudHSM 集群中生成的密钥材料,也可以导入自己的密钥材料。如果您使用 AWS KMS 对称加密 KMS 密钥的密钥材料,则可以启用密钥材料的自动轮换

默认情况下,每个 KMS 密钥都具有唯一的密钥材料。但是,您可以使用相同的密钥材料创建一组多区域密钥

密钥材料源

密钥材料源是标识 KMS 密钥中密钥材料的来源的 KMS 密钥属性。您在创建 KMS 密钥时选择密钥材料源,并且无法更改。密钥材料的来源会影响 KMS 密钥的安全性、耐久性、可用性、延迟和吞吐量特性。

要查找 KMS 密钥的密钥材料来源,请使用DescribeKey操作,或者在 AWS KMS 控制台中查看 KMS 密钥详情页面的 “加密配置” 选项卡上的 O rigin 值。有关帮助信息,请参阅查看密钥

KMS 密钥可以具有以下密钥材料源值之一。

AWS_KMS

AWS KMS 在 KMS 自己的密钥存储库中创建并管理 KMS 密钥的密钥材料。这是大多数 KMS 密钥的默认值和推荐值。

有关使用中的密钥材料创建密钥的帮助 AWS KMS,请参阅创建密钥

EXTERNAL (Import key material)

KMS 密钥具有已导入的密钥材料。当您使用 External 密钥材料源创建 KMS 密钥时,KMS 密钥没有密钥材料。稍后,您可以将密钥材料导入 KMS 密钥。使用导入的密钥材料时,您需要保护和管理外部的密钥材料 AWS KMS,包括在密钥材料过期时更换密钥材料。有关更多信息,请参阅 关于导入的密钥材料

有关为导入的密钥材料创建 KMS 密钥的帮助,请参阅 步骤 1:创建不带密钥材料的 KMS 密钥

AWS_CLOUDHSM

AWS KMS 在 AWS CloudHSM 集群中为您的密钥存储创建AWS CloudHSM 密钥材料。

有关在密钥库中创建 KMS AWS CloudHSM 密钥的帮助,请参阅在 AWS CloudHSM 密钥存储中创建 KMS 密钥

EXTERNAL_KEY_STORE

密钥材料是外部密钥管理器中的加密密钥。 AWS仅针对外部密钥存储中的 KMS 密钥支持此来源。

有关在外部密钥存储中创建 KMS 密钥的帮助,请参阅 在外部密钥存储中创建 KMS 密钥

密钥规范

密钥规范 是一种属性,用于表示密钥的加密配置。密钥规范的含义因密钥类型而异。

  • AWS KMS 密钥-密钥规范确定 KMS 密钥是对称的还是非对称的。它还可确定其密钥材料类型,及其支持的算法。密钥规范在创建 KMS 密钥时选择,并且无法更改。默认密钥规范 SYMMETRIC_DEFAULT 表示一组 256 位的对称加密密钥。

    注意

    KMS 密钥的 KeySpec 被称为 CustomerMasterKeySpec。该CreateKey操作的CustomerMasterKeySpec参数已被弃用。请改用 KeySpec 参数,它的工作方式相同。为了防止重大更改,CreateKeyDescribeKey操作的响应现在包括两个KeySpec和具有相同值CustomerMasterKeySpec的成员。

    有关密钥规范的列表以及选择密钥规范的帮助信息,请参阅选择密钥规范。要查找 KMS 密钥的密钥规范,请使用DescribeKey操作,或者在 AWS KMS 控制台中查看 KMS 密钥详情页面上的加密配置选项卡。有关帮助信息,请参阅查看密钥

    要限制委托人在创建 KMS 密钥时可以使用的密钥规范,请使用 k ms: KeySpec 条件密钥。您还可以使用kms:KeySpec条件密钥来允许委托人仅对具有特定密钥规范的 KMS 密钥调用 AWS KMS 操作。例如,您可以拒绝删除具有 RSA_4096 密钥规范的 KMS 密钥的计划权限。

  • 数据密钥 (GenerateDataKey)-密钥规范确定 AES 数据密钥的长度。

  • 数据密钥对 (GenerateDataKeyPair)-密钥对规范确定数据密钥对中密钥材料的类型。

密钥用法

密钥用法属性决定密钥支持的加密操作。KMS 密钥的密钥用法可以为ENCRYPT_DECRYPTSIGN_VERIFYGENERATE_VERIFY_MAC、或KEY_AGREEMENT。每个 KMS 密钥都只能有一个密钥用法。将 KMS 密钥用于多种操作类型,会使两种操作的产物更容易受到攻击。

有关选择 KMS 密钥的密钥用法的帮助,请参阅 选择密钥用法。要查找 KMS 密钥的密钥使用情况,请使用DescribeKey操作,或者在 AWS KMS 控制台中选择 KMS 密钥详情页面上的加密配置选项卡。有关帮助信息,请参阅查看密钥

信封加密

在您加密数据后,数据将受到保护,但您必须保护加密密钥。一种策略是对其进行加密。信封加密 是一种加密方法,它使用数据密钥对明文数据进行加密,然后使用其他密钥对数据密钥进行加密。

您甚至可以使用其他加密密钥对数据加密密钥进行加密,并且在另一个加密密钥下加密该加密密钥。但是,最后,一个密钥必须以明文形式保留,以便您可以解密密钥和数据。此顶级明文密钥加密密钥称为根密钥

信封加密

AWS KMS 通过安全地存储和管理加密密钥来帮助您保护密钥。存储在(称为 AWS KMS keys)中的 AWS KMS根密钥永远不要对 AWS KMS FIPS 验证的硬件安全模块保持未加密状态。要使用 KMS 密钥,必须致电 AWS KMS。

使用多个密钥加密密钥的信封加密

信封加密可提供以下多种优势:

  • 保护数据密钥

    加密数据密钥时,您无需担心存储加密数据密钥,因为数据密钥本身就受到加密的保护。您可以安全地将加密数据与加密数据密钥一起存储。

  • 使用多个密钥加密相同的数据

    加密操作可能非常耗时,特别是要加密的数据是大型对象时。您可以只重新加密保护原始数据的数据密钥,而无需使用不同的密钥多次重新加密原始数据。

  • 结合多种算法的优势

    通常,与公有密钥算法相比,对称密钥算法速度更快,生成的密文更小。但公有密钥算法可提供固有的角色分离和更轻松的密钥管理。信封加密让您可以每种策略的优势结合起来。

加密上下文

所有使用对称加密 KMS 密钥的 AWS KMS 加密操作都接受加密上下文,这是一组可选的非秘密密钥-值对,可以包含有关数据的其他上下文信息。 AWS KMS 使用加密上下文作为额外的身份验证数据 (AAD) 来支持经过身份验证的加密

在加密请求中包含加密上下文时,它以加密方式绑定到密文,这样就需要相同的加密上下文来解密(或解密并重新加密)数据。如果解密请求中提供的加密上下文不是区分大小写的完全匹配,解密请求将失败。只有加密上下文中键/值对的顺序可以改变。

注意

您不能在使用非对称 KMS 密钥HMAC KMS 密钥的加密操作中指定加密上下文。非对称算法和 MAC 算法不支持加密上下文。

加密上下文不是密钥,且没有加密。它以明文显示在 AWS CloudTrail 日志中,以便您可以使用它来标识和分类加密操作。您的加密上下文不应包含敏感信息。我们建议您的加密上下文描述正在加密或解密的数据。例如,在加密文件时,您可以将文件路径的一部分用作加密上下文。

"encryptionContext": { "department": "10103.0" }

例如,在加密使用亚马逊弹性块存储 (Amazon EBS) CreateSnapshot操作创建的卷和快照时,Amazon EBS 使用卷 ID 作为加密上下文值。

"encryptionContext": { "aws:ebs:id": "vol-abcde12345abc1234" }

您还可以使用加密上下文来优化或限制对您账户 AWS KMS keys 的访问权限。您可以使用加密上下文作为授权中的约束,以及作为策略语句中的条件

要了解如何使用加密上下文来保护加密数据的完整性,请参阅 AWS 安全博客 EncryptionContext上的 “如何通过使用 AWS Key Management Service 来保护加密数据的完整性” 一文。

有关加密上下文的更多信息。

AWS KMS 对加密上下文密钥和值强制执行以下规则。

  • 加密上下文对中的键和值必须是简单的文本字符串。如果您使用其他类型,例如整数或浮点数,则将其 AWS KMS 解释为字符串。

  • 加密上下文中的密钥和值可以包括 Unicode 字符。如果加密上下文包含密钥策略或 IAM policy 中不允许的字符,则您将无法在策略条件密钥中指定加密上下文,例如 kms:EncryptionContext:context-keykms:EncryptionContextKeys。有关密钥策略文档规则的详细信息,请参阅 密钥策略格式。有关 IAM policy 档规则的详细信息,请参阅《IAM 用户指南》中的 IAM 名称要求

加密上下文主要用于验证完整性和真实性。但是,您也可以使用加密上下文来控制对密钥策略和 IAM policy 中对称加密 AWS KMS keys 的访问。

仅当请求包含特定的加密上下文密或密钥值对时,k ms:: 和 kms: EncryptionContextKeys 条件密钥才允许(或拒绝)权限。EncryptionContext

例如,以下密钥策略语句允许 RoleForExampleApp 角色在 Decrypt 操作中使用 KMS 密钥。它使用 kms:EncryptionContext:context-key 条件键以仅在请求中的加密上下文包含 AppName:ExampleApp 加密上下文对时允许此权限。

{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:AppName": "ExampleApp" } } }

有关这些加密上下文条件键的更多信息,请参阅 的条件密钥 AWS KMS

创建授权时,可以包括为授予权限设定条件的授予约束。 AWS KMS 支持两个授予限制EncryptionContextSubsetEncryptionContextEquals和,这两个限制都涉及加密操作请求中的加密上下文。在使用这些授权约束时,授权中的权限仅在加密操作请求中的加密上下文满足授权约束的要求时有效。

例如,您可以向EncryptionContextEquals授权添加允许该GenerateDataKey操作的授予约束。使用此约束时,授权仅在请求中的加密上下文与授权约束中的加密上下文大小写完全匹配时,允许操作。

$ aws kms create-grant \ --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --grantee-principal arn:aws:iam::111122223333:user/exampleUser \ --retiring-principal arn:aws:iam::111122223333:role/adminRole \ --operations GenerateDataKey \ --constraints EncryptionContextEquals={Purpose=Test}

来自被授予者委托人的以下请求将满足 EncryptionContextEquals 约束。

$ aws kms generate-data-key \ --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --key-spec AES_256 \ --encryption-context Purpose=Test

有关授权约束的详细信息,请参阅 使用授权约束。有关授权的详细信息,请参阅 补助金 AWS KMS

AWS KMS 用于 AWS CloudTrail 记录加密上下文,以便您可以确定已访问了哪些 KMS 密钥和数据。日志条目会准确显示哪些 KMS 密钥被用来加密或解密了由日志条目中的加密上下文引用的特定数据。

重要

由于加密上下文会被记录,它不得包含敏感信息。

为了简化在调用 DecryptReEncrypt 操作时任何加密上下文的使用,可以将加密上下文与加密数据存储在一起。我们建议您仅存储足够的加密上下文,以帮助您在需要用于加密或解密时创建完整的加密上下文。

例如,如果加密上下文是文件的完全限定路径,仅将该路径部分与加密文件内容存储在一起。然后,当您需要完整的加密上下文时,可以从存储的片段重建它。如果有人擅自改动文件,例如重命名或将其移动到其他位置,加密上下文值更改,解密请求将失败。

密钥策略

在创建 KMS 密钥时,您可以确定可以使用和管理该 KMS 密钥的人员。这些权限包含在名为密钥策略的文档中。您可以使用密钥策略随时为客户托管密钥添加、删除或更改权限。但是您无法编辑的密钥策略 AWS 托管式密钥。有关更多信息,请参阅 中的关键政策 AWS KMS

授权

补助金是一种允许 AWS 委托人用于加密操作 AWS KMS keys 的政策工具。它还可以让他们查看 KMS 密钥 (DescribeKey) 以及创建和管理授权。在授权访问 KMS 密钥时,将考虑授权与密钥策略IAM policy。授权通常用于临时权限,因为您可以在不更改密钥策略或 IAM policy 的情况下创建授权、使用其权限并将其删除。由于授权可能非常具体,并且易于创建和撤销,因此它们通常用于提供临时权限或更精细的权限。

有关授权(包括授权术语)的详细信息,请参阅 补助金 AWS KMS

审核 KMS 密钥用法

您可以使用 AWS CloudTrail 来审核密钥使用情况。 CloudTrail 创建包含您账户的 AWS API 调用和相关事件历史记录的日志文件。这些日志文件包括使用 AWS 管理控制台、 AWS 软件开发工具包和命令行工具发出的所有 AWS KMS API 请求。日志文件还包括代表您向 AWS KMS AWS 服务机构发出的请求。您可以使用这些日志文件来查找重要信息,包括使用 KMS 密钥的时间、所请求的操作、请求者的身份以及源 IP 地址。有关更多信息,请参阅 使用登录 AWS CloudTrailAWS CloudTrail 用户指南

密钥管理基础设施

加密术的常见做法是使用公开可用且经过同行评审的算法进行加密和解密,例如使用 AES (高级加密标准) 和私有密钥。加密术的主要问题之一是很难保持密钥的私密性。这通常是密钥管理基础架构 (KMI) 的工作。 AWS KMS 为您运营关键基础架构。 AWS KMS 创建并安全存储您的根密钥,名为AWS KMS keys。有关 AWS KMS 运作方式的更多信息,请参阅AWS Key Management Service 加密详细信息