旋转 AWS KMS keys - AWS Key Management Service

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

旋转 AWS KMS keys

要为客户托管的密钥创建新的加密材料,您可以创建新的 KMS 密钥,然后更改您的应用程序或别名来使用新的 KMS 密钥。或者,您可以通过启用自动密钥轮换或按需轮换来轮换与现有 KMS 密钥关联的密钥材料。

默认情况下,当您为 KMS 密钥启用自动密钥轮换时,每年会为 KMS 密钥 AWS KMS 生成新的加密材料。您还可以指定自定义,rotation-period以定义启用自动密钥轮换以轮换密钥材料后的天数,以及此后每次自动轮换之间的天数。 AWS KMS 如果您需要立即启动密钥材料轮换,则无论是否启用了自动密钥轮换,都可以按需轮换。按需轮换不会更改现有的自动轮换计划。

AWS KMS 永久保存所有先前版本的加密材料,因此您可以解密使用该 KMS 密钥加密的任何数据。 AWS KMS 在您删除 KMS 密钥之前,不会删除任何轮换的密钥材料。您可以在 Amazon CloudWatch 和 AWS Key Management Service 控制台中跟踪 KMS 密钥的密钥材料的轮换情况。 AWS CloudTrail您还可以使用GetKeyRotationStatus操作来验证 KMS 密钥是否启用了自动轮换,并识别任何正在进行的按需轮换。您可以使用ListKeyRotations操作来查看已完成旋转的详细信息。

当您使用轮换的 KMS 密钥加密数据时, AWS KMS 使用当前的密钥材料。当您使用轮换的 KMS 密钥解密密文时,将 AWS KMS 使用用于加密密文的密钥材料的版本。您无法为解密操作选择特定版本的密钥材料,而是 AWS KMS 会自动选择正确的版本。由于使用适当的密钥材料进行 AWS KMS 透明解密,因此您可以安全地在应用程序中使用轮换的 KMS 密钥,而 AWS 服务 无需更改代码。

然而,自动密钥轮换对 KMS 密钥所保护的数据无效。它不会轮换 KMS 密钥生成的数据密钥,也不会对任何受 KMS 密钥保护的数据重新加密,并且它无法减轻数据密钥泄露的影响。

AWS KMS 仅支持对称加密 KMS 密钥使用 AWS KMS 创建的密钥材料进行自动和按需密钥轮换。对于客户托管式 KMS 密钥,自动轮换是可选项。 AWS KMS 始终坚持每年轮换一次 AWS 托管式 KMS 密钥的密钥材料。所AWS 拥有的 KMS 密钥的轮换由拥有该密钥的 AWS 服务管理。

注意

的轮换期限在2022年5月 AWS 托管式密钥 发生了变化。有关更多信息,请参阅 AWS 托管式密钥

密钥轮换只会更改密钥材料,即加密操作中所使用的加密密钥。不管密钥材料有没有变更或变更了多少次,该 KMS 密钥仍是相同的逻辑资源。KMS 密钥的属性不会发生变化,如下图所示。

您可能决定创建新的 KMS 密钥来替代原有的 KMS 密钥。这跟轮换现有 KMS 密钥的密钥材料具有相同效果,因此这通常被视为手动轮换密钥。如果您想要轮换不符合自动密钥轮换条件的 KMS 密钥,包括非对称 KMS 密钥、HMAC KMS 密钥、自定义密钥存储中的 KMS 密钥以及带有导入密钥材料的 KMS 密钥,则手动轮换是一个不错的选择。

密钥轮换和定价

AWS KMS 对为您的 KMS 密钥维护的密钥材料的第一次和第二次轮换收取月费。此次涨价以第二次轮换为上限,后续的任何轮换均不计费。有关详细信息,请参阅 AWS Key Management Service 定价

注意

您可以使用《AWS Cost Explorer Service》https://docs.aws.amazon.com/cost-management/latest/userguide/ce-what-is.html来查看您的密钥存储费用明细。例如,您可以通过将使用类型指定为 $REGION-KMS-Keys 并按 API 操作对数据进行分组来筛选视图,以查看按当前和轮换 KMS 密钥计费的密钥的总费用。

您可能仍会看到历史日期的旧 Unknown API 操作的实例。

密钥轮换和配额

在计算密钥资源配额时,无论轮换密钥材料版本的数量如何,每个 KMS 密钥均算作一个密钥。

有关密钥材料和轮换的详细信息,请参阅《AWS Key Management Service 加密详细信息》。

为什么要轮换 KMS 密钥?

加密最佳实践不鼓励大量重复使用直接加密数据的密钥,例如生成的数据密钥。 AWS KMS 当 256 位数据密钥加密数百万条消息时,它们可能会耗尽并开始生成带有细微模式的加密文字,聪明的操作者可以利用这些密文来发现密钥中的位。为避免密钥耗尽,数据密钥最好仅使用一次或几次,这样可以有效地轮换密钥材料。

但是,KMS 密钥最常用作“包装密钥”,也称为“密钥加密密钥”。包装密钥不是加密数据,而是对加密数据的数据密钥进行加密。因此,其使用频率远低于数据密钥,并且几乎从未被重复使用到足以出现密钥耗尽的风险。

尽管耗尽风险非常低,但由于业务或合同规则或政府法规,您可能需要轮换 KMS 密钥。当您被迫轮换 KMS 密钥时,我们建议您在支持自动密钥轮换的情况下使用自动密钥轮换,在不支持自动密钥轮换时使用手动密钥轮换。

您可以考虑按需轮换,以演示关键材料轮换功能或验证自动化脚本。我们建议对计划外轮换使用按需轮换,并尽可能使用带有自定义轮换周期的自动密钥轮换

密钥轮换的工作原理

密钥轮换设计 AWS KMS 为透明且易于使用。 AWS KMS 仅支持客户托管密钥的可选自动和按需密钥轮换。

自动轮换密钥

AWS KMS 在轮换周期定义的下一个轮换日期自动轮换 KMS 密钥。您无需记住或计划更新。

按需轮换

无论是否启用了自动密钥轮换,都要立即开始轮换与 KMS 密钥关联的密钥材料。

管理密钥材料

AWS KMS 即使禁用了密钥轮换,也会保留 KMS 密钥的所有密钥材料。 AWS KMS 只有在删除 KMS 密钥时才会删除密钥材料。

使用密钥材料

当您使用轮换的 KMS 密钥加密数据时, AWS KMS 使用当前的密钥材料。当您使用轮换 KMS 密钥解密密文时, AWS KMS 会使用与加密时所用密钥材料相同的版本。您无法为解密操作选择特定版本的密钥材料,而是 AWS KMS 会自动选择正确的版本。

轮换周期

轮换期限定义了在您启用自动密钥轮换后, AWS KMS 将轮换密钥材料的天数,以及此后每次自动密钥轮换之间的天数。如果您没有为启用自动密钥轮换RotationPeriodInDays时指定值,则默认值为 365 天。

您可以使用 k ms: RotationPeriodInDays 条件键进一步限制委托人可以在参数中RotationPeriodInDays指定的值。

轮换日期

AWS KMS 在轮换周期定义的轮换日期自动轮换 KMS 密钥。默认轮换周期为 365 天。

客户管理密钥

由于客户托管密钥的自动密钥轮换是可选的,并且可以随时启用和禁用,因此轮换日期取决于最近启用轮换的日期。如果您修改先前启用了自动密钥轮换功能的密钥的轮换周期,则日期可能会更改。在密钥的使用寿命内,轮换日期可能会发生多次变化。

例如,如果您在 2022 年 1 月 1 日创建客户托管密钥,并在 2022 年 3 月 15 日启用自动密钥轮换,默认轮换周期为 365 天,则会在 2023 年 3 月 15 日、2024 年 3 月 15 日以及之后每 365 天轮换密钥材料。 AWS KMS

以下示例假设启用了自动密钥轮换,默认轮换周期为 365 天。这些示例演示了可能影响密钥轮换周期的特殊情况。

  • 禁用密钥轮换 - 如果您在任何时候禁用自动密钥轮换,KMS 密钥将继续使用禁用轮换时使用的密钥材料版本。如果您再次启用自动密钥轮换,则 AWS KMS 会根据新的启用轮换的日期轮换密钥材料。

  • 已禁用 KMS 密钥-当 KMS 密钥处于禁用状态时, AWS KMS 不会对其进行轮换。但是,密钥轮换状态不会发生改变,并且在 KMS 密钥处于禁用状态时不能对其进行更改。重新启用 KMS 密钥后,如果密钥材料已超过其上次计划轮换日期,则 AWS KMS 会立即轮换。如果密钥材料没有错过上次预定的轮换日期,则 AWS KMS 恢复原来的密钥轮换计划。

  • 待删除的 KMS 密钥-当 KMS 密钥处于待删除状态时, AWS KMS 不会对其进行轮换。密钥轮换状态设为 false,处于待删除状态时不能更改。如果删除被取消,将恢复之前的密钥轮换状态。如果密钥材料已超过其上次预定的轮换日期,则立即将其 AWS KMS 轮换。如果密钥材料没有错过上次预定的轮换日期,则 AWS KMS 恢复原来的密钥轮换计划。

AWS 托管式密钥

AWS KMS AWS 托管式密钥 每年自动轮换(大约 365 天)。您无法启用或禁用 AWS 托管式密钥 的密钥轮换。

的密钥材料在创建日期一年后首次轮换,此后每年(自上次轮换后大约 365 天)进行轮换。 AWS 托管式密钥

注意

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

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

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

AWS 拥有的密钥

您无法启用或禁用 AWS 拥有的密钥的密钥轮换。的密钥轮换策略 AWS 拥有的密钥 由创建和管理密钥的 AWS 服务决定。有关详细信息,请参阅服务的用户指南或开发人员指南中的静态加密主题。

支持的 KMS 密钥类型

只有具有由 AWS KMS 生成(Origin = AWS_KMS)的密钥材料的对称加密 KMS 密钥支持自动密钥轮换。

以下类型的 KMS 密钥支持自动密钥轮换,但您可以手动轮换这些 KMS 密钥

多区域密钥

您可以启用和禁用多区域密钥的自动密钥轮换。您只能对主密钥设置属性。 AWS KMS 同步密钥时,它会将属性设置从主键复制到其副本密钥。轮换主键的密钥材料时, AWS KMS 会自动将该密钥材料复制到其所有副本密钥中。有关更多信息,请参阅 轮换多区域密钥

AWS 服务

您可以在用于 AWS 服务中的服务器端加密的客户托管密钥上启用自动密钥轮换。年度轮换是透明的,并与 AWS 服务兼容。

监控密钥轮换

AWS KMS 轮换AWS 托管式密钥客户托管密钥的密钥材料时,它会向 Amazon EventBridge 写一个KMS CMK Rotation事件,将一个RotateKey 事件写入您的 AWS CloudTrail 日志。您可以使用这些记录验证 KMS 密钥是否已轮换。

您可以使用 AWS Key Management Service 控制台查看 KMS 密钥的剩余按需轮换次数以及 KMS 密钥所有已完成的密钥材料轮换的列表。

您可以使用ListKeyRotations操作来查看已完成旋转的详细信息。

最终一致性

密钥轮换受到与其他 AWS KMS 管理操作相同的最终一致性影响。新的密钥材料在整个 AWS KMS中可用之前可能会有一些延迟。但是,轮换密钥材料不会导致加密操作中断或延迟。当前的密钥材料用于加密操作,直到新的密钥材料在整个 AWS KMS中可用为止。当自动轮换多区域密钥的密钥材料时,将 AWS KMS 使用当前密钥材料,直到新的密钥材料在所有带有相关多区域密钥的区域中都可用。

如何启用和禁用自动密钥轮换

默认情况下,当您为 KMS 密钥启用自动密钥轮换时,每年会为 KMS 密钥 AWS KMS 生成新的加密材料。您还可以指定自定义,rotation-period以定义启用自动密钥轮换以轮换密钥材料后的天数,以及此后每次自动轮换之间的天数。 AWS KMS

自动密钥轮换具有以下优点:

  • KMS 密钥的属性,包括其密钥 ID密钥 ARN、区域、策略和权限,在密钥轮换时不会发生改变。

  • 您无需更改引用该 KMS 密钥的密钥 ID 或密钥 ARN 的应用程序或别名。

  • 轮换密钥材料不会影响 AWS 服务中任何 KMS 密钥的使用。

  • 启用密钥轮换后,将在 AWS KMS 轮换周期定义的下一个轮换日期自动轮换 KMS 密钥。您无需记住或计划更新。

授权用户可以使用 AWS KMS 控制台和 AWS KMS API 来启用和禁用自动密钥轮换,并查看密钥轮换状态。

启用和禁用自动密钥轮换(控制台)

  1. 登录 AWS Management Console 并打开 AWS Key Management Service (AWS KMS) 控制台,网址为 https://console.aws.amazon.com/kms

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 在导航窗格中,选择客户托管密钥。(您无法启用或禁用 AWS 托管式密钥的轮换。它们每年自动轮换一次。)

  4. 选择 KMS 密钥的别名和密钥 ID。

  5. 选择 Key rotation (密钥轮换) 选项卡。

    密钥轮换选项卡仅出现在对称加密 KMS 密钥的详细信息页面上,其中包含 AWS KMS 生成的密钥材料(来源AWS_KMS),包括多区域对称加密 KMS 密钥。

    您不能自动轮换非对称 KMS 密钥、HMAC KMS 密钥、具有导入的密钥材料的 KMS 密钥或自定义密钥存储中的 KMS 密钥。但是,您可以手动轮换它们

  6. 在 “自动密钥轮换” 部分,选择 “编辑”

  7. 对于 “密钥轮换”,选择 “启用”。

    注意

    如果 KMS 密钥已禁用或待删除,则 AWS KMS 不会轮换密钥材料,也无法更新自动密钥轮换状态或轮换周期。启用 KMS 密钥或取消删除以更新自动密钥轮换配置。有关详细信息,请参阅 密钥轮换的工作原理密 AWS KMS 钥的关键状态

  8. (可选)键入介于 90 到 2560 天之间的轮换周期。默认值为 365 天。如果您未指定自定义轮换周期,则 AWS KMS 将每年轮换密钥材料。

    您可以使用 k ms: RotationPeriodInDays 条件键来限制委托人可以为轮换周期指定的值。

  9. 选择保存

启用和禁用自动密钥轮换 (AWS KMS API)

您可以使用 AWS Key Management Service (AWS KMS) API 启用和禁用自动密钥轮换,并查看任何客户托管密钥的当前轮换状态。这些示例使用 AWS Command Line Interface (AWS CLI),但您可以使用任何受支持的编程语言。

EnableKeyRotation操作可为指定的 KMS 密钥启用自动密钥轮换。该DisableKeyRotation操作将其禁用。要在这些操作中标识 KMS 密钥,请使用其密钥 ID密钥 ARN。在默认情况下,客户托管密钥的密钥轮换处于禁用状态。

您可以使用 k ms: RotationPeriodInDays 条件键来限制委托人可以为EnableKeyRotation请求的RotationPeriodInDays参数指定的值。

以下示例在指定的对称加密 KMS 密钥上启用密钥轮换,轮换周期为 180 天,并使用该GetKeyRotationStatus操作来查看结果。然后,它禁用了密钥轮换,并使用 GetKeyRotationStatus 查看更改。

$ aws kms enable-key-rotation \ --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --rotation-period-in-days 180 $ aws kms get-key-rotation-status --key-id 1234abcd-12ab-34cd-56ef-1234567890ab { "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "KeyRotationEnabled": true, "RotationPeriodInDays": 180, "NextRotationDate": "2024-02-14T18:14:33.587000+00:00" } $ aws kms disable-key-rotation --key-id 1234abcd-12ab-34cd-56ef-1234567890ab $ aws kms get-key-rotation-status --key-id 1234abcd-12ab-34cd-56ef-1234567890ab { "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "KeyRotationEnabled": false }

如何执行按需密钥轮换

无论是否启用了自动密钥轮换,您都可以按需轮换客户托管的 KMS 密钥中的密钥材料。禁用自动轮换 (DisableKeyRotation) 不会影响您执行按需轮换的能力,也不会取消任何正在进行的按需轮换。按需轮换不会更改现有的自动轮换计划。例如,假设一个启用了自动密钥轮换、轮换周期为 730 天的 KMS 密钥。如果密钥计划在 2024 年 4 月 14 日自动轮换,而您在 2024 年 4 月 10 日按需轮换,则密钥将按计划在 2024 年 4 月 14 日自动轮换,此后每 730 天自动轮换一次。

每个 KMS 密钥最多可以按需轮换 10 次。您可以使用 AWS KMS 控制台查看 KMS 密钥的剩余按需轮换次数。

对称加密 KMS 密钥支持按需密钥轮换。您无法按需轮换非对称 KMS 密钥HMAC KMS 密钥、带有导入密钥材料的 KMS 密钥自定义密钥存储中的 KMS 密钥。要按需轮换一组相关的多区域密钥,请调用主密钥的按需轮换。

授权用户可以使用 AWS KMS 控制台和 AWS KMS API 启动按需密钥轮换并查看密钥轮换状态。

启动按需密钥轮换(控制台)

  1. 登录 AWS Management Console 并打开 AWS Key Management Service (AWS KMS) 控制台,网址为 https://console.aws.amazon.com/kms

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 在导航窗格中,选择客户托管密钥。(您不能按需轮换 AWS 托管式密钥。 它们每年自动轮换。)

  4. 选择 KMS 密钥的别名和密钥 ID。

  5. 选择 Key rotation (密钥轮换) 选项卡。

    密钥轮换选项卡仅出现在对称加密 KMS 密钥的详细信息页面上,其中包含 AWS KMS 生成的密钥材料(来源AWS_KMS),包括多区域对称加密 KMS 密钥。

    您无法按需轮换非对称 KMS 密钥、HMAC KMS 密钥、带有导入密钥材料的 KMS 密钥自定义密钥存储库中的 KMS 密钥。但是,您可以手动轮换它们

  6. 按需密钥轮换部分中,选择轮换密钥

  7. 阅读并考虑警告以及有关密钥剩余按需轮换次数的信息。如果您决定不想继续按需轮换,请选择 “取消”。

  8. 选择旋转密钥以确认按需轮换。

    注意

    按需轮换会受到与其他 AWS KMS 管理操作相同的最终一致性影响。新的密钥材料在整个 AWS KMS中可用之前可能会有一些延迟。当按需轮换完成时,控制台顶部的横幅会通知您。

启动按需密钥轮换 (AWS KMS API)

您可以使用 AWS Key Management Service (AWS KMS) API 启动按需密钥轮换,并查看任何客户托管密钥的当前轮换状态。这些示例使用 AWS Command Line Interface (AWS CLI),但您可以使用任何受支持的编程语言。

RotateKeyOnDemand操作会立即启动指定的 KMS 密钥的按需密钥轮换。要在这些操作中标识 KMS 密钥,请使用其密钥 ID密钥 ARN

以下示例在指定的对称加密 KMS 密钥上启动按需密钥轮换,并使用该GetKeyRotationStatus操作验证按需轮换是否正在进行中。kms:GetKeyRotationStatus响应OnDemandRotationStartDate中的标识了启动正在进行的按需轮换的日期和时间。

$ aws kms rotate-key-on-demand --key-id 1234abcd-12ab-34cd-56ef-1234567890ab { "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" } $ aws kms get-key-rotation-status --key-id 1234abcd-12ab-34cd-56ef-1234567890ab { "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "KeyRotationEnabled": true, "NextRotationDate": "2024-03-14T18:14:33.587000+00:00", "OnDemandRotationStartDate": "2024-02-24T18:44:48.587000+00:00" "RotationPeriodInDays": 365 }

手动轮换密钥

您可能希望创建一个新的 KMS 密钥,并使用它替代当前的 KMS 密钥,而不启用自动密钥轮换。当新的 KMS 密钥使用的加密材料与当前 KMS 密钥使用的加密材料不相同时,使用新的 KMS 密钥与更改现有 KMS 密钥的密钥材料具有相同的效果。使用一个 KMS 密钥替换另一个 KMS 密钥的过程被称为手动密钥轮换

如果您想要轮换不符合自动密钥轮换条件的 KMS 密钥,例如非对称 KMS 密钥、HMAC KMS 密钥、自定义密钥存储中的 KMS 密钥以及带有导入密钥材料的 KMS 密钥,则手动轮换是一个不错的选择。

注意

开始使用新的 KMS 密钥时,请务必启用原始 KMS 密钥,以便 AWS KMS 可以解密原始 KMS 密钥加密的数据。

当您手动轮换 KMS 密钥时,您还需要更新应用程序中对 KMS 密钥 ID 或密钥 ARN 的引用。将友好名称与 KMS 密钥关联的别名,可以使得这个过程变得更容易。使用别名来引用应用程序中的 KMS 密钥。之后,当您想更改应用程序所使用的 KMS 密钥(而不是编辑应用程序代码)时,更改别名的目标 KMS 密钥即可。有关更多信息,请参阅 在应用程序中使用别名

注意

指向手动轮换 KMS 密钥的最新版本的别名是、E ncrypt DescribeKey、、GenerateDataKeyGenerateDataKeyPairGenerateMac、和 S ign 操作的好解决方案。管理 KMS 密钥的操作中不允许使用别名,例如DisableKeyScheduleKeyDeletion

对手动轮换的对称加密 KMS 密钥调用 Decrypt 操作时,请省略命令中的KeyId参数。 AWS KMS 自动使用加密密文的 KMS 密钥。

使用非对称 KMS 密钥调用Decrypt验证,或使用 HMAC KMS 密钥VerifyMac进行调用时,必须使用该KeyId参数。当 KeyId 参数的值是不再指向执行加密操作的 KMS 密钥的别名时,例如当手动轮换密钥时,这些请求将失败。为避免此错误,必须跟踪并为每个操作指定正确的 KMS 密钥。

要更改别名的目标 KMS 密钥,请使用 AWS KMS API 中的UpdateAlias操作。例如,此命令会更新 alias/TestKey 别名以指向新 KMS 密钥。由于该操作不返回任何输出,因此该示例使用该ListAliases操作来显示别名现在已与其他 KMS 密钥相关联,并且该LastUpdatedDate字段已更新。这些 ListAliases 命令使用中的query参数仅 AWS CLI 获取alias/TestKey别名。

$ aws kms list-aliases --query 'Aliases[?AliasName==`alias/TestKey`]' { "Aliases": [ { "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/TestKey", "AliasName": "alias/TestKey", "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "CreationDate": 1521097200.123, "LastUpdatedDate": 1521097200.123 }, ] } $ aws kms update-alias --alias-name alias/TestKey --target-key-id 0987dcba-09fe-87dc-65ba-ab0987654321 $ aws kms list-aliases --query 'Aliases[?AliasName==`alias/TestKey`]' { "Aliases": [ { "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/TestKey", "AliasName": "alias/TestKey", "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321", "CreationDate": 1521097200.123, "LastUpdatedDate": 1604958290.722 }, ] }