创建 KMS 密钥 - AWS Key Management Service

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

创建 KMS 密钥

您可以在 AWS Management Console 中创建 AWS KMS keys,也可以使用 CreateKey 操作或 AWS::KMS::Key AWS CloudFormation 资源进行创建。在此过程中,您要设置 KMS 密钥的密钥政策,但您可以随时更改该政策。您还可以选择以下值来定义您创建的 KMS 密钥的类型。创建 KMS 密钥后,这些属性无法更改。

KMS 密钥类型

密钥类型是一个决定创建的加密密钥的类型的属性。AWS KMS 提供了三种保护数据的密钥类型:

  • 高级加密标准(AES)对称密钥

    在 AES 的伽罗瓦计数器模式(GCM)模式下使用的 256 位密钥,用于对大小小于 4KB 的数据进行经过身份验证的加密/解密。这是最常见的密钥类型,用于保护应用程序和代表您加密数据的 AWS 服务 中使用的其他数据加密密钥。

  • RSA、椭圆曲线或 SM2(仅限中国区域)非对称密钥

    这些密钥提供各种大小,并支持多种算法。根据算法选择,其可能用于加密和解密、签名和验证或派生共享密钥操作。

  • 用于执行 HMAC 散列消息认证码操作的对称密钥

    这些密钥是用于签名和验证操作的 256 位密钥。

    无法以明文形式从服务中导出 KMS 密钥。它们由服务使用的硬件安全模块(HSM)生成,并且只能在其中使用。这是 AWS KMS 的基本安全属性,用于确保密钥不被泄露。

密钥用法

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

密钥规范

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

对于 KMS 密钥,密钥规范将确定 KMS 密钥是对称密钥还是非对称密钥。它还可确定其密钥材料类型,及其支持的算法。

默认密钥规范 SYMMETRIC_DEFAULT 表示一组 256 位的对称加密密钥。有关所有支持的密钥规范的详细说明,请参阅 密钥规范引用

密钥材料源

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

每个 KMS 密钥的元数据中都包含对其密钥材料的引用。对称加密 KMS 密钥的密钥材料源可能会有所不同。您可以使用 AWS KMS 生成的密钥材料、在自定义密钥存储中生成的密钥材料,或者导入自己的密钥材料

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

KMS 密钥可以具有以下密钥材料源值之一:AWS_KMSEXTERNAL导入的密钥材料)、AWS_CLOUDHSMAWS CloudHSM 密钥存储中的 KMS 密钥)或 EXTERNAL_KEY_STORE外部密钥存储中的 KMS 密钥)。

创建 KMS 密钥的权限

要在控制台中或使用 API 创建 KMS 密钥,您必须在 IAM policy 中具有以下权限。在可能的情况下,使用条件键来限制权限。例如,您可以使用 IAM policy 中的 kms:KeySpec 条件键,允许主体仅创建对称加密密钥。

有关创建密钥的委托人的 IAM policy 的示例,请参阅 允许用户创建 KMS 密钥

注意

请谨慎授予委托人管理标签和别名的权限。更改标签或别名可以允许或拒绝对客户托管密钥的权限。有关详细信息,请参阅AWS KMS 中的 ABAC

创建 KMS 密钥不需要 kms:PutKeyPolicy 权限。kms:CreateKey 权限包括设置初始密钥策略的权限。但是,您必须在创建 KMS 密钥时将此权限添加到密钥策略中,以确保您可以控制对 KMS 密钥的访问。另一种方法是使用 BypassLockoutSafetyCheck 参数,我们不推荐这种方法。

KMS 密钥属于创建它们的 AWS 账户。创建 KMS 密钥的 IAM 用户不会被视为密钥的拥有者,且他们不会自动获得使用或管理自己所创建 KMS 密钥的权限。与任何其他主体一样,密钥创建者需要通过密钥策略、IAM policy 或授权获得权限。但是,拥有 kms:CreateKey 权限的主体可以设置初始密钥策略,并授予自己使用或管理密钥的权限。

选择要创建的 KMS 密钥的类型

创建的 KMS 密钥类型在很大程度上取决于计划使用 KMS 密钥的方式,以及安全要求和授权要求。KMS 密钥的密钥类型和密钥用法决定了该密钥可以执行的加密操作。每个 KMS 密钥只有一个密钥用法。将 KMS 密钥用于多种操作类型,会使所有操作的产物更容易受到攻击。

要允许主体仅为特定密钥用法创建 KMS 密钥,请使用 kms:KeyUsage 条件键。还可以使用 kms:KeyUsage 条件键,允许委托人根据 KMS 密钥的密钥用法对其调用 API 操作。例如,可以允许仅当 KMS 密钥的密钥用法为 SIGN_VERIFY 时禁用 KMS 密钥的权限。

请根据使用案例,遵照以下指南确定所需的 KMS 密钥类型。

加密和解密数据

对于需要加密和解密数据的大多数使用案例,使用对称 KMS 密钥。AWS KMS 使用的对称加密算法快速、高效,并可确保数据的机密性和真实性。它支持具有附加身份验证数据 (AAD) 的身份验证加密,这些数据定义为加密上下文。此 KMS 密钥类型要求加密数据的发送人和接收人都具备有效的 AWS 凭证才能调用 AWS KMS。

如果使用案例需要无法调用 AWS KMS 的用户在 AWS 外部进行加密,那么非对称 KMS 密钥是个不错的选择。您可以分发非对称 KMS 密钥的公有密钥,以允许这些用户对数据进行加密。需要解密该数据的应用程序,可以在 AWS KMS 内部使用非对称 KMS 密钥的私有密钥。

签署消息并验证签名

要签署消息并验证签名,必须使用非对称 KMS 密钥。您可以将 KMS 密钥与表示 RSA 密钥对、椭圆曲线(ECC)密钥对或 SM2 密钥对的密钥规范一起使用(仅限中国区域)。选择哪种密钥规范由想要使用的签名算法决定。推荐使用 ECC 密钥对支持的 ECDSA 签名算法,而不是 RSA 签名算法。不过,您可能需要使用特定的密钥规范和签名算法来支持在 AWS 之外验证签名的用户。

使用非对称密钥对加密

要使用非对称密钥对加密,必须将非对称 KMS 密钥RSA 密钥规范 SM2 密钥规范(仅限中国区域)一起使用。要使用 KMS 密钥对的公有密钥为 AWS KMS 中的数据进行加密,请使用 Encrypt 操作。还可以下载公有密钥,并与需要在 AWS KMS 外部加密数据的各方共享。

下载非对称 KMS 密钥的公有密钥后,可以在 AWS KMS 外部使用该密钥。但它不再受 AWS KMS 中保护 KMS 密钥的安全控制的约束。例如,不能使用 AWS KMS 密钥策略或授权来控制公有密钥的使用。也不能使用 AWS KMS 支持的加密算法来控制密钥是否仅用于加密和解密。有关更多详细信息,请参阅下载公有密钥的特殊注意事项

要对在 AWS KMS 外部采用公有密钥加密的数据进行解密,请调用 Decrypt 操作。如果使用 SIGN_VERIFY 的密钥用法通过 KMS 密钥中的公有密钥对数据进行加密,则 Decrypt 操作会失败。如果数据采用 AWS KMS 不支持用于选定密钥规范对密钥的算法进行加密,则此操作也将失败。有关密钥规范和支持算法的更多信息,请参阅 密钥规范引用

为避免上述错误,在 AWS KMS 外部使用公有密钥的任何人都必须存储密钥配置。AWS KMS 控制台和 GetPublicKey 响应提供了在共享公有密钥时必须包含的信息。

派生共享密钥

要派生共享密钥,请使用具有 NIST 推荐的椭圆曲线SM2(仅限中国区域)密钥材料的 KMS 密钥。AWS KMS 使用椭圆曲线加密辅助因子 Diffie-Hellman Priman Primitive(ECDH)通过从两个对等方的椭圆曲线公有-私有密钥对中派生共享密钥来建立密钥协议。您可以使用 DeriveSharedSecret 操作返回的原始共享密钥来派生对称密钥,该密钥可以加密和解密在双方之间发送的数据,或者生成和验证 HMAC。AWS KMS 建议您在使用原始共享密钥派生对称密钥时遵循 NIST 关于密钥派生的建议

生成并验证 HMAC 代码

要生成和验证散列消息认证码,请使用 HMAC 密钥。当您在 AWS KMS 中创建 HMAC 密钥时、AWS KMS 创建和保护您的密钥材料,并确保您对密钥使用正确的 MAC 算法。HMAC 代码也可以用作伪随机数,在某些情况下用于对称签名和令牌化。

HMAC KMS 密钥是对称密钥。在 AWS KMS 控制台中创建 HMAC KMS 密钥时,选择 Symmetric 密钥类型。

与 AWS 服务结合使用

要创建一个 KMS 密钥,以便用于集成到 AWS KMS 的 AWS 服务,请参阅该服务的文档。加密数据的 AWS 服务需要对称加密 KMS 密钥

除上述注意事项外,KMS 密钥加密操作的密钥规范不同,其价格和请求限额也不同。有关 AWS KMS 定价的信息,请参阅 AWS Key Management Service 定价。有关请求配额的信息,请参阅 请求配额