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

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

AWS Key Management Service 概念

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

客户主密钥 (CMKs)

客户主密钥 是 AWS KMS.

A 客户主密钥 (CMK)是 主密钥. 的 CMK 包括元数据,例如密钥ID、创建日期、描述和密钥状态。的 CMK 还包含用于加密和对数据进行加密的关键材料。

AWS KMS 支持对称和不对称 CMKs. A 对称 CMK 表示用于加密和加密的256位密钥。安 非对称 CMK 表示用于加密和加密或签名和验证(但不是两者兼有)的RSA密钥对,或用于签名和验证的椭圆形曲线(ECC)密钥对。有关对称和不对称的详细信息 CMKs,见 使用对称密钥和非对称密钥.

CMKs 创建于 AWS KMS. 对称性 CMKs 和不对称 CMKs 绝不会离开 AWS KMS 未加密。 管理您的 CMK,您可以使用 AWS 管理控制台 或 AWS KMS API. 若要使用 CMK 在 密码操作,您必须使用 AWS KMS API。此策略与数据密钥不同。AWS KMS 不会存储、管理或跟踪您的数据密钥。您必须在 AWS KMS 的外部使用它们。

默认情况下, AWS KMS 为 CMK. 您无法提取、导出、查看或管理此密钥材料。此外,您不能删除该关键材料;您必须 删除 CMK. 但是,您可以 导入您自己的关键材料 变为 CMK 或为 CMK 在 AWS CloudHSM 与 AWS KMS 自定义密钥存储.

有关创建和管理 CMKs,见 入门. 有关使用 CMKs 的信息,请参阅《AWS Key Management Service API Reference》。

AWS KMS 支持三种类型的 CMKs:客户管理 CMKs, AWS 管理 CMKs、和 AWS 自有 CMKs.

类型 CMK 能够查看 CMK 元数据 能够管理 CMK 仅适用于我的 AWS 账户 自动轮换
客户管理 CMK :可选。每 365 天(1 年)。
AWS 管理 CMK 必填 每 1095 天(3 年)。
自有的ASM CMK 变化

区分客户管理 CMKs 起始 AWS 管理 CMKs,使用 KeyManager 字段 描述关键 操作响应。适用于客户管理 CMKs, KeyManager 价值是 Customer。对于 AWS 管理 CMKs, KeyManager 价值是 AWS.

AWS 与 AWS KMS 他们在支持 CMKs. 有些 AWS 服务默认使用 AWS 自有 CMK 或 AWS 管理 CMK. 其他 AWS 在客户管理下加密数据的服务 CMK 选择。以及其他 AWS 服务支持所有类型的 CMKs 让您轻松 AWS 自有 CMK, AWS 管理 CMK,或控制管理的客户 CMK. 有关 AWS 服务提供的加密选项的详细信息,请参阅服务的用户指南或开发人员指南中的静态加密 主题。

客户管理 CMKs

客户管理 CMKs 是 CMKs 在您的 AWS 创建、拥有和管理的客户。您完全掌控这些 CMKs,包括建立和维护 关键政策, IAM 政策和资助金, 启用和禁用 他们, 轮换他们的密码材料, 添加标记, 创建别名 指的是 CMK、和 安排 CMKs 删除.

客户管理 CMKs 出现在 客户管理密钥 第页,共页 AWS 管理控制台 对于 AWS KMS. 明确识别管理的客户 CMK,使用 描述关键 操作。适用于客户管理 CMKs, KeyManager 区域 DescribeKey 反应是 CUSTOMER.

您可以使用客户管理 CMKs 在加密操作中的应用,并审计其在 AWS CloudTrail 日志。此外,许多 AWS 与 AWS KMS 让您指定一个客户管理 CMK 以保护他们为您存储和管理的数据。

客户管理 CMKs 产生每月费用和超过免费层级的使用费。这些费用将计入您的账户的 AWS KMS 配额。有关详细信息,请参阅 AWS Key Management Service 定价配额

AWS 管理 CMKs

AWS 管理 CMKs 是 CMKs 账户中,由第三方代表您创建、管理和使用 AWS 与 AWS KMS. 有些 AWS 服务支持 AWS 管理 CMK. 其他人使用 AWS 拥有CMK或为您提供 CMKs.

您可以 查看 AWS 管理 CMKs 在您的帐户中, 查看他们的关键政策、和 审计他们的使用 在 AWS CloudTrail 日志。但是,您无法管理这些 CMKs、轮换他们,或更改他们的主要政策。而且,您不能使用 AWS 管理 CMKs 直接用于加密操作;创建它们的服务代表您使用这些服务。

AWS 管理 CMKs 出现在 AWS 管理键 第页,共页 AWS 管理控制台 对于 AWS KMS. 您还可以确定 AWS 管理 CMKs 其别名,其格式为 aws/service-name,例如 aws/redshift。明确识别 AWS 管理 CMK,使用 描述关键 操作。对于 AWS 管理 CMKs, KeyManager 区域 DescribeKey 反应是 AWS.

您不支付月费 AWS 管理 CMKs. 您需为超出免费套餐的使用量付费,但某些 AWS 服务涵盖了这些费用。有关详情,请参阅 静态加密 用户指南或服务开发者指南中的主题。 AWS 管理 CMKs 不计入资源配额 CMKs 位于您帐户的每个区域。但是,当它们代表您客户的委托人使用时, CMKs 根据请求配额计数。有关详细信息,请参阅 AWS Key Management Service 定价配额

AWS 自有 CMKs

AWS 自有 CMKs 是 CMKs 一个 AWS 服务拥有并管理多个 AWS 账户。尽管 AWS 自有 CMKs 不在您的 AWS 客户, AWS 服务可以使用其 AWS 自有 CMKs 以保护您帐户中的资源。

您无需创建或管理所有AW(AW) CMKs. 但是,您无法查看、使用、跟踪或审核它们。您不需要为以下项目支付每月费用或使用费 AWS 自有 CMKs 并且他们不反对 AWS KMS 配额 您的帐户。

AWS 拥有的 CMK 的密钥轮换策略由创建和管理 CMK 的 AWS 服务确定。 有关 CMKs 一个 AWS 服务支持,包括 AWS 自有 CMKs,请参阅 静态加密 用户指南或服务开发者指南中的主题。

数据密钥

数据密钥 是可用于加密数据的加密密钥,包括大量数据和其他数据加密密钥。

您可以使用 AWS KMS 客户主密钥 (CMKs)生成、加密和对数据密钥进行加密。但是,AWS KMS 不会存储、管理或跟踪您的数据密钥,也不会使用数据密钥执行加密操作。您必须在 AWS KMS 之外使用和管理数据密钥。

创建数据密钥

要创建数据密钥,请致电 生成数据密钥 操作。 AWS KMS 使用 CMK 生成数据密钥。操作返回数据密钥的明文副本和在 CMK. 下图展示了此操作。


          生成数据密钥

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

使用数据密钥加密数据

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

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


          将用户数据加密于 AWS KMS

使用数据密钥解密数据

要对数据进行加密,请将加密数据密钥传送至 去加密 操作。 AWS KMS 使用您的 CMK 以对数据密钥进行解译,然后返回明文数据密钥。使用明文数据密钥解密数据,并尽快从内存中删除该明文数据密钥。

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


          解密数据密钥

数据密钥对

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

与诸如OpenCodel等工具生成的数据密钥对不同, AWS KMS 以对称方式保护每个数据密钥对中的私有密钥 CMK 在 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

选择何种数据密钥对通常取决于使用案例或法规要求。大多数证书需要 RSA 密钥。椭圆曲线密钥通常用于数字签名。ECC_SECG_P256K1 密钥通常用于加密货币。

创建数据密钥对

要创建数据密钥对,请调用 GenerateDataKeyPairGenerateDataKeyPairWithoutPlaintext 操作。指定对称 CMK 您想使用加密私有密钥。

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

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

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


          生成数据密钥对

使用数据密钥对加密数据

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

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


          使用数据密钥对的公共密钥加密用户数据, AWS KMS

使用数据密钥对解密数据

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

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

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


          使用数据密钥对中的私用密钥对(不包括 AWS KMS.

使用数据密钥对签署消息

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

如果您的私人密钥已加密,请将加密后的私人密钥传送至 去加密 操作。 AWS KMS 使用您的 CMK 以对数据密钥进行解译,然后返回明文密钥。使用明文私有密钥生成签名。然后尽快从内存中删除明文私有密钥。

要签署消息,请使用加密哈希函数(如 OpenSSL 中的 dgst 命令)创建消息摘要。然后,将明文私有密钥传递给签名算法。结果是一个表示消息内容的签名。

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


          使用数据密钥对中的私用密钥在 AWS KMS.

使用数据密钥对验证签名

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

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

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


          使用数据密钥对中的公共密钥验证密码签名, AWS KMS.

Aliases

别名 是CMK的常用名。例如,您可以将CMK称为 测试键 而不是 1234abcd-12ab-34cd-56ef-1234567890ab.

别名使在 AWS 管理控制台. 您也可以使用别名在一些 AWS KMS 运营,包括 密码操作. 在应用程序中,您可以使用单个别名引用每个中的不同CMK AWS 区域。

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

了解更多信息。

加密操作

在 AWS KMS, 密码操作 是使用 CMKs 以保护数据。因为 CMKs 保持在 AWS KMS,您必须致电 AWS KMS 使用 CMK 密码操作中。

执行加密操作 CMKs,使用 AWS 和SDK AWS Command Line Interface (AWS CLI),或 适用于 PowerShell 的 AWS 工具. 无法在 AWS KMS 控制台中执行加密操作。有关使用多种编程语言调用加密操作的示例,请参阅使用 AWS KMS API 进行编程

下表列出了 AWS KMS 加密操作。它还显示了关键类型和 关键用途 要求 CMKs 用于操作。

运算 CMK 关键类型 CMK 关键用途
Decrypt 任何* ENCRYPT_DECRYPT
加密 任何* ENCRYPT_DECRYPT
GenerateDataKey 对称 * ENCRYPT_DECRYPT
GenerateDataKeyPair 对称 [1] ENCRYPT_DECRYPT
GenerateDataKeyPairWithoutPlaintext 对称 [1] ENCRYPT_DECRYPT
GenerateDataKeyWithoutPlaintext 对称 * ENCRYPT_DECRYPT
GenerateRandom 不适用。此操作不使用 CMK. 不适用*
ReEncrypt 任何* ENCRYPT_DECRYPT
Sign 非对称 SIGN_VERIFY
验证 非对称 SIGN_VERIFY

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

有关加密操作的权限的信息,请参阅 AWS KMS API权限: 操作和资源参考

为了使 AWS KMS 对所有用户具有响应性和高性能,AWS KMS 为每秒可以调用的加密操作数设置了配额。有关详细信息,请参阅 加密操作的共享配额

密钥标识符 (KeyId)

关键标识符作为您的 AWS KMS 客户主密钥 (CMKs)。它们有助于您识别 CMKs 在控制台中。您用它们来说明 CMKs 您想用于 AWS KMS API操作, IAM 政策,并授予。

AWS KMS 定义了多个密钥标识符。当您创建一个 CMK, AWS KMS 生成关键ARN和关键ID,它们是 CMK. 创建别名时,AWS KMS 会根据您定义的别名生成别名 ARN。您可以在 AWS 管理控制台 和 AWS KMS API 中查看密钥及别名标识符。

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

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

注意

使用 AWS KMS API 时,请谨慎使用密钥标识符。不同的 API 需要不同的密钥标识符。通常,请在您的任务中使用尽可能完整的密钥标识符。

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

密钥 ARN。

关键的ARN是 CMK. 它是 CMK. 密钥 ARN 包括 AWS 账户、区域和密钥 ID。为帮助找到 CMK,见 查找密钥 ID 和 ARN.

密钥 ARN 的格式如下:

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

以下是示例密钥 ARN。

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

关键ID唯一标识 CMK 和区域。如需帮助, CMK,见 查找密钥 ID 和 ARN.

以下是示例密钥 ID。

1234abcd-12ab-34cd-56ef-1234567890ab
别名 ARN。

别名 ARN 是 AWS KMS 别名的 Amazon 资源名称 (ARN)。它是别名和 CMK 它代表。别名 ARN 包括 AWS 账户、区域和别名。

在任何给定时间,别名ARN识别一个特定 CMK. 但是,由于您可以更改 CMK 别名,别名ARN可识别 CMKs 不同时间。帮助查找别名ARN CMK,见 .

别名 ARN 的格式如下:

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

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

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

别名可唯一标识关联的 CMK 和区域。在 AWS KMS API,别名始终以 alias。如需帮助,请查找 CMK,见 .

别名的格式如下:

alias/<alias-name>

例如:。

alias/ExampleAlias

aws/ 别名的前缀已保留 AWS 管理 CMKs. 您无法使用此前缀创建别名。例如, AWS 管理 CMK 对于 Amazon Simple Storage Service (Amazon S3)如下。

alias/aws/s3

密钥材料源

关键物料来源 是 CMK 特性,用于识别 CMK. 创建 CMK,您不能更改。要查找 CMK,使用 描述关键 或查看 来源 价值 密码配置 详情页面的 CMK 在 AWS KMS 话务台。有关帮助信息,请参阅查看密钥

CMKs 具有以下关键物料来源值之一。

KMS(默认值)

API 值:AWS_KMS

AWS KMS 为 CMK 自己的主要商店。这是默认值,也是大多数 CMKs.

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

外部

API 值:EXTERNAL

的 CMK 有 导入的关键材料. 当您创建一个 CMK 含有 External 关键物料来源, CMK 没有关键材料。稍后,您可以将关键材料导入 CMK. 使用导入的密钥材料时,您需要保护和管理 AWS KMS 外部的密钥材料,包括在密钥材料过期时进行替换。有关详细信息,请参阅 关于导入的密钥材料

帮助创建 CMK 对于进口的关键材料,请参阅 步骤 1. 创建 CMK 没有关键材料.

自定义密钥存储 (CloudHSM)

API 值:AWS_CLOUDHSM

AWS KMS 为 CMK 在您的 自定义密钥存储.

帮助创建 CMK 在自定义密钥库中,请参阅 创建 CMKs 在自定义钥匙店

密钥规范

关键规格 是 CMK 代表 CMK. 关键规范决定了 CMK 是对称的或不对称的, CMK加密算法或签名算法,您可以使用 CMK.

通常,您为自己的 CMK 以您的使用案例和监管要求为基础。当您选择 创建 CMK,您不能更改。如果你选择了错误的关键规格, 删除 CMK,然后创建新的。

有关密钥规范的列表以及选择密钥规范的帮助信息,请参阅选择密钥规范。要找到 CMK,使用 描述关键 或查看 密码配置 详情页面的 CMK 在 AWS KMS 话务台。有关帮助信息,请参阅查看密钥

注意

在 AWS KMS API 操作中,CMK 的密钥规范称为 CustomerMasterKeySpec。这使其与数据密钥 (KeySpec) 和数据密钥对 (KeyPairSpec) 的密钥规范以及包装要导入的密钥材料的密钥规范 (WrappingKeySpec) 区别开来。每种密钥规范类型都有不同的值。

限制委托人在创建 CMKs,使用 千米:CustomerMasterKeySpec 条件键。您也可以使用 kms:CustomerMasterKeySpec 条件键,以允许委托人致电 AWS KMS 运营部门 CMK 基于其关键规格。例如,您可以拒绝计划删除 CMK 含有 RSA_4096 关键规范。

密钥用法

关键用途 是 CMK 决定 CMK 被用于加密和加密-或签名和验证。不能同时选择二者。使用 CMK 适用于多种类型的操作,使两种操作的产品更容易受到攻击。

对称密钥的使用 CMKs 总是加密和加密。椭圆形曲线(ECC)的关键用途 CMKs 始终在签名和验证。您只需要为RSA选择关键用途 CMKs. 当您使用 创建 CMK,您不能更改。如果你选择了错误的密钥使用, 删除 CMK,然后创建新的。

有关密钥用法的选择,请参阅选择密钥用法。要查找 CMK,使用 描述关键 或查看 密码配置 详情页面的 CMK 在 AWS KMS 话务台。有关帮助信息,请参阅查看密钥

允许委托人创建 CMKs 仅为签名和验证,或仅为加密和加密,使用 千米:CustomerMasterKeyUsage 条件键。您也可以使用 kms:CustomerMasterKeyUsage 条件键,以允许principal调用API操作, CMK 基于其主要用途。例如,您可以允许禁用 CMK 仅当其关键用途为SIGN_VERIFY时。

信封加密

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

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


        信封加密

AWS KMS 有助于保护 主密钥 安全储存和管理。主密钥存储在 AWS KMS,称为 客户主密钥 (CMKs),切勿离开 AWS KMS FIPS经验证的硬件安全模块 未加密。若要使用 AWS KMS CMK,您必须致电 AWS KMS.


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

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

  • 保护数据密钥

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

  • 在多下加密相同的数据 主密钥

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

  • 结合多种算法的优势

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

加密上下文

全部 AWS KMS 密码操作 对称 CMKs 接受 加密环境,一组可选密钥–包含有关数据的额外背景信息的价值对。 AWS KMS 将加密环境用作 其他已验证的数据 (AAD)以支持 身份验证加密.

您不能在使用非对称 CMK 的加密操作中指定加密上下文。AWS KMS 使用的标准非对称加密算法不支持加密上下文。

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

加密上下文是公开的。它以明文显示在 AWS CloudTrail 日志中,以便您可以使用它来标识和分类加密操作。

加密上下文可以包含任何键和值。但是,由于它不是密文且未加密,因此,加密上下文不应包含敏感信息。我们建议您的加密上下文描述正在加密或解密的数据。例如,在加密文件时,您可以将文件路径的一部分用作加密上下文。

加密上下文对中的键和值必须是简单的文本字符串。它们不能是整数或对象,也不能是任何未完全解析的类型。如果您使用其他类型(例如整数或浮点),则 AWS KMS 会将它解释为字符串。

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

加密上下文键和值可以包含特殊字符,如下划线 (_)、短划线 (-)、斜杠(/、\)和冒号 (:)。

例如, Amazon Simple Storage Service (Amazon S3)使用加密环境,在该环境中密钥 aws:s3:arn。值是要加密文件的S3bucket路径。

"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::bucket_name/file_name" }

您还可以使用加密环境来优化或限制对 客户主密钥 (CMKs)。您可以使用加密上下文作为授权中的约束,以及作为策略语句中的条件

要了解如何使用加密上下文保护加密数据的完整性,请参阅 AWS 安全博客上的文章如何使用 AWS Key Management Service 和加密上下文保护加密数据的完整性

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

加密上下文主要用于验证完整性和真实性。但是,您也可以使用加密环境来控制对对称 客户主密钥 (CMKs)和 IAM 政策。

kms:加密环境:kms:加密环境密钥 仅当请求包含特定加密环境密钥或密钥时,条件密钥才允许(或拒绝)许可–价值对。

例如,以下关键政策声明允许 RoleForExampleApp 使用 CMK 在 Decrypt 操作。它使用 kms:EncryptionContext: 条件键以仅在请求中的加密上下文包含 AppName:ExampleApp 加密上下文对时允许此权限。

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

有关这些加密上下文条件键的更多信息,请参阅 针对 AWS KMS 使用策略条件

当您创建授权时,可以包括授权约束,仅在请求包含特定加密上下文或加密条件密钥时允许访问。有关 EncryptionContextEqualsEncryptionContextSubset 授权约束的详细信息,请参阅 授权约束

要在授予中指定对称的加密环境约束 CMK,使用 Constraints 参数 创建资助金 操作。虽然此示例使用的是 AWS Command Line Interface,但您可以使用任何 AWS 软件开发工具包。此命令创建的授权向 exampleUser 授予调用 Decrypt 操作的权限。不过,该权限仅在 Decrypt 请求中的加密上下文包含 "Department": "IT" 加密上下文对时有效。

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

生成的授权与以下项目类似。请注意,向 exampleUser 授予的权限仅在 Decrypt 请求包含授权约束中指定的加密上下文时有效。要在 CMK,使用 列表授予 操作。

$ aws kms list-grants --key-id 1234abcd-12ab-34cd-56ef-1234567890ab { "Grants": [ { "Name": "", "IssuingAccount": "arn:aws:iam::111122223333:root", "GrantId": "8c94d1f12f5e69f440bae30eaec9570bb1fb7358824f9ddfa1aa5a0dab1a59b2", "Operations": [ "Decrypt" ], "GranteePrincipal": "arn:aws:iam::111122223333:user/exampleUser", "Constraints": { "EncryptionContextSubset": { "Department": "IT" } }, "CreationDate": 1568565290.0, "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole" } ] }

AWS 服务通常在授权中使用加密环境限制,从而允许他们使用 CMKs 在您的 AWS 账户。例如, Amazon DynamoDB 使用像以下一样的资助金来获得使用 AWS 管理 CMK 对于 DynamoDB 在您的帐户中。此授权中的 EncryptionContextSubset 授权约束使授权中的权限仅在请求中的加密上下文包含 "subscriberID": "111122223333""tableName": "Services" 对时有效。此资助金限制意味着资助金允许 DynamoDB 使用指定的 CMK 仅适用于您 AWS 账户。

要获得此输出,运行 列表授予 操作 AWS 管理 CMK 对于 DynamoDB 在您的帐户中。

$ aws kms list-grants --key-id 0987dcba-09fe-87dc-65ba-ab0987654321 { "Grants": [ { "Operations": [ "Decrypt", "Encrypt", "GenerateDataKey", "ReEncryptFrom", "ReEncryptTo", "RetireGrant", "DescribeKey" ], "IssuingAccount": "arn:aws:iam::111122223333:root", "Constraints": { "EncryptionContextSubset": { "aws:dynamodb:tableName": "Services", "aws:dynamodb:subscriberId": "111122223333" } }, "CreationDate": 1518567315.0, "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", "GranteePrincipal": "dynamodb.us-west-2.amazonaws.com", "RetiringPrincipal": "dynamodb.us-west-2.amazonaws.com", "Name": "8276b9a6-6cf0-46f1-b2f0-7993a7f8c89a", "GrantId": "1667b97d27cf748cf05b487217dd4179526c949d14fb3903858e25193253fe59" } ] }

AWS KMS 使用 AWS CloudTrail 记录加密环境,以便您可以决定 CMKs 和数据已被访问。日志条目准确显示了 CMK 用于对日志条目中加密上下文引用的特定数据进行加密或加密。

重要

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

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

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

密钥策略

当您创建一个 CMK,您确定谁可以使用和管理 CMK. 这些权限包含在名为密钥策略的文档中。您可以使用关键策略随时添加、移除或更改客户管理的权限 CMK. 但是,您不能编辑 AWS 管理 CMK. 有关更多信息,请参阅 AWS KMS 的身份验证和访问控制。)

Grants

授权 是提供权限的另一种机制。它是密钥策略的替代方案。由于授权可能非常具体,并且易于创建和撤销,因此它们通常用于提供临时权限或更精细的权限。

授权令牌

创建授权时,为了确保最终一致性,授权中指定的权限可能不会立即生效。如果您需要减少潜在的延迟,请使用 授予代币 在回答您的 创建资助金 请求。您可以通过某些 AWS KMS API 请求传递授权令牌,以使授权中的权限立即生效。以下 AWS KMS API 操作可接受授权令牌:

授权令牌是公开的。授权令牌包含有关授权对象,以及谁可以使用该令牌来使授权的权限更快生效的信息。

稽查 CMK 使用

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

密钥管理基础设施

加密术的常见做法是使用公开可用且经过同行评审的算法进行加密和解密,例如使用 AES (高级加密标准) 和私有密钥。加密术的主要问题之一是很难保持密钥的私密性。这通常是关键管理基础设施(KMI)的工作。 AWS KMS 为您操作KMI。 AWS KMS 创建并安全存储您的 主密钥,称为 客户主密钥. 有关如何 AWS KMS 运作,查看 AWS Key Management Service 加密详情白皮书.