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

AWS Key Management Service 概念

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

客户主密钥 (CMK)

AWS KMS 中的主要资源是客户主密钥 (CMK)。您可以使用 CMK 加密和解密最多 4 KB(4096 字节)的数据。通常情况下,您可以使用 CMK 生成、加密和解密数据密钥,您在 AWS KMS 之外使用这些密钥来加密您的数据。此策略称为信封加密

CMK 在 AWS KMS 中创建并且从不将 AWS KMS 保持未加密状态。 要使用或管理您的 CMK,可以通过 AWS KMS 访问它们。此策略与数据密钥不同。AWS KMS 不会存储、管理或跟踪您的数据密钥。您必须在 AWS KMS 的外部使用它们。

AWS 账户中有三种类型的 CMK:客户托管 CMK、AWS 托管 CMK 和 AWS 拥有的 CMK。

CMK 的类型 可查看 可管理 仅适用于我的 AWS 账户
客户托管 CMK
AWS 托管 CMK
AWS 拥有的 CMK

与 AWS KMS 集成的 AWS 服务在其对 CMK 的支持方面有所不同。默认情况下,一些服务使用 AWS 拥有的 CMK 来加密您的数据。一些服务在其在您的账户下创建的 AWS 托管 CMK 下进行加密。另外一些服务允许您指定已创建的客户托管 CMK。还有一些服务支持所有类型的 CMK,从而使您能够轻松使用 AWS 拥有的 CMK、实现 AWS 托管 CMK 的可见性或控制客户托管 CMK。

客户托管 CMK

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

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

客户托管 CMK 会产生月费以及超过免费套餐使用量的费用。这些费用将计入您的账户的 AWS KMS 限制。有关详细信息,请参阅 AWS Key Management Service 定价限制

AWS 托管 CMK

AWS 托管 CMK 是由与 AWS KMS 集成的 AWS 服务代表您在您的账户中创建、管理和使用的 CMK。您可以按别名标识 AWS 托管 CMK,别名格式为 aws/service-name,如 aws/redshift

您可以查看账户中的 AWS 托管 CMK、查看其密钥策略以及在 AWS CloudTrail 日志中审核其使用情况。但是,您无法管理这些 CMK 或更改其权限。此外,您无法在加密操作中直接使用 AWS 托管 CMK;创建它们的服务将代表您使用它们。要查看 AWS 托管 CMK 的密钥策略,请使用 GetKeyPolicy 操作。您无法在 AWS 管理控制台中查看密钥策略,也无法通过任何方式更改它。

您无需支付 AWS 托管 CMK 的月费。您需为超出免费套餐的使用量付费,但某些 AWS 服务涵盖了这些费用。有关详细信息,请参阅服务文档的加密部分。AWS 托管 CMK 不计入有关您账户的每个区域中 CMK 数的限制,但当代表您账户中的委托人使用它们时,它们将计入请求速率限制。有关详细信息,请参阅 AWS Key Management Service 定价限制

AWS 拥有的 CMK

AWS 拥有的 CMK 不在您的 AWS 账户中。它们是 AWS 拥有和管理以在多个 AWS 账户中使用的 CMK 集合的一部分。AWS 服务可以使用 AWS 拥有的 CMK 来保护您的数据。

您无法查看、管理或使用 AWS 拥有的 CMK,或者审核其使用情况。但是,您无需执行任何工作或更改任何计划即可保护用于加密您的数据的密钥。

您无需支付月费或对 AWS 拥有的 CMK 的使用费用,并且它们不会计入您账户的 AWS KMS 限制。

数据密钥

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

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

创建数据密钥

要创建数据密钥,请调用 GenerateDataKey 操作。AWS KMS 使用您指定的 CMK 来生成数据密钥。此操作会返回数据密钥的明文副本和借助 CMK 加密的数据密钥的副本,如下图所示。


        生成数据密钥

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

使用数据密钥加密数据

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

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


        在 AWS KMS 之外加密用户数据

使用数据密钥解密数据

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

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


        解密数据密钥

信封加密

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

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


        信封加密

AWS KMS 可通过安全地存储和管理主密钥来帮助您保护它们。存储在 AWS KMS 中的主密钥(称为客户主密钥 (CMK))绝不会让 AWS KMS 经 FIPS 验证的硬件安全模块处于不加密状态。要使用 AWS KMS CMK,您必须调用 AWS KMS。


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

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

  • 保护数据密钥

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

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

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

  • 结合多种算法的优势

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

加密上下文

所有 AWS KMS 加密操作(EncryptDecryptReEncryptGenerateDataKeyGenerateDataKeyWithoutPlaintext)都接受加密上下文,它是一组包含有关数据的额外上下文信息的可选键–值对。AWS KMS 将加密上下文用作额外经身份验证的数据 (AAD) 以支持经身份验证的加密

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

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

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

例如,Amazon Simple Storage Service (Amazon S3) 使用加密上下文,其中,密钥为 aws:s3:arn,值为要加密的文件的 S3 存储桶路径。

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

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

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

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

授予和密钥策略中的加密上下文

除了主要用于验证完整性和真实性之外,您还可以使用加密上下文作为在 IAM 和密钥策略以及授权中使用客户主密钥 (CMK) 的条件。此元素可以将权限限制为非常具体的数据类型或者来自有限源集的数据。

  • 在密钥策略和控制对 AWS KMS CMK 访问的 IAM 策略中,您可以包括条件密钥,用于限制包含特定加密上下文键键值对的请求的权限。

  • 当您创建授权时,可以包括授权约束,仅在请求包含特定加密上下文或加密条件密钥时允许访问。

例如,将 Amazon EBS 卷附加到 Amazon EC2 实例时,会创建一个仅允许该实例仅解密该卷的授权。这是通过以下方法实现的:在加密上下文中包含卷 ID,然后添加需要该卷 ID 的加密上下文的授权约束。如果授权不包含加密上下文约束,Amazon EC2 实例可以解密在客户主密钥 (CMK) 下加密的任意卷,而不是特定卷。

记录加密上下文

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

重要

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

存储加密上下文

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

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

关键策略

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

授权

授权是提供权限的另一种机制,是密钥策略的替代形式。您可以使用授权提供长期访问权限,这将允许 AWS 委托人使用客户托管 CMK。有关更多信息,请参阅使用授权

授权令牌

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

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

审核 CMK 使用情况

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

密钥管理基础设施

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