本文为您介绍如何对密钥管理服务(KMS)中的用户主密钥(CMK)进行自动轮转。

密钥版本

KMS中的CMK支持多个密钥版本。每一个密钥版本是一个独立生成的密钥,同一个CMK下的多个密钥版本在密码学上互不相关。KMS通过生成一个新的密钥版本来实现密钥的自动轮转。

密钥版本的类别

CMK的密钥版本分为以下2种:
  • 主版本(Primary Key Version)
    • 主版本是CMK的活跃加密密钥(Active Encryption Key)。每个CMK在任何时间点上有且仅有一个主版本。
    • 调用GenerateDataKeyEncrypt等加密API时,KMS使用指定CMK的主版本对明文进行加密。
    • 您可以通过DescribeKey返回的响应查看PrimaryKeyVersion属性。
  • 非主版本(Non-primary Key Version)
    • 非主版本是CMK的非活跃加密密钥(Inactive Encryption Key)。每个CMK可以有零到多个非主版本。
    • 非主版本历史上曾经是主版本,在当时被用作活跃加密密钥。
    • 密钥轮转产生新的主版本后,KMS不会删除或禁用非主版本,它们需要被用作解密数据。
说明 加密API使用指定CMK的主版本,解密API使用传入密文对应的加密密钥版本。

密钥版本的生成

您可以通过以下两种方式生成密钥版本:
  • 创建CMK

    通过调用CreateKey创建CMK。如果指定参数OriginAliyun_KMS,则KMS会生成初始密钥版本,并且将其设置为主版本。

  • KMS执行自动轮转策略

    CMK配置自动轮转策略,配置的策略由KMS定期执行,周期性产生新的密钥版本。

自动轮转

配置和查询轮转策略

当您调用CreateKey创建CMK时,可以指定CMK的自动轮转策略,也可以调用UpdateRotationPolicy变更当前的自动轮转策略。调用时,需配置以下参数:
  • EnableAutomaticRotation:是否开启自动轮转。
  • RotationInterval:自动轮转的周期。
您可以通过调用DescribeKey查询所配置的轮转策略,返回的相关参数为:
  • AutomaticRotation:自动轮转的开启状态。详情请参见主密钥状态对轮转的影响
    • Disabled:用户未开启自动轮转。
    • Enabled:用户已开启自动轮转。
    • Suspended:用户开启了自动轮转,但是KMS暂停执行。
  • RotationInterval:自动轮转的周期。

KMS执行策略

如果您指定开启自动轮转,则KMS会按照以下方式计算下次轮转的时间。
<NextRotationTime> = <LastRotationTime> + <RotationInterval>
参数含义如下:
  • LastRotationTime:生成上一个密钥版本的时间。您可以通过DescribeKey返回的LastRotationDate字段查询此参数值。
  • NextRotationTime:KMS会在计算出来的下一次轮转时间到来之后,执行轮转任务,创建新的密钥版本。您可以通过DescribeKey返回的NextRotationDate字段查询此参数值。
重要 更新轮转策略所指定的轮转周期,可能会导致KMS计算出来的下次轮转时间成为过去的某个时间点。这并不影响KMS执行轮转策略的规则,即在下一次轮转时间到来之后生成新的密钥版本。如果更新后的策略指向的下一次轮转时间已经在当前时间之前,则立即满足了KMS触发密钥轮转的标准。

轮转对加密解密的影响

对于密钥轮转后的加密请求,KMS会使用当前版本的密钥进行加密。对于历史版本密钥加密后密文的解密请求,您可以使用历史版本密钥进行解密。轮转1
对于历史版本密钥加密后密文,您可以通过ReEncrypt将数据转换为当前版本密钥进行加密。轮转2

主密钥状态对轮转的影响

只有在启用状态的主密钥(KeyStateEnabled)才能产生新的密钥版本。您需要注意以下情形:
  • 如果一个主密钥处于Disabled或者PendingDeletion状态,请勿调用UpdateRotationPolicy变更主密钥的轮转策略。
  • 如果一个主密钥在用户开启自动轮转后,进入到Disabled或者PendingDeletion状态,则KMS暂停执行自动轮转。此时通过DescribeKey查看到的轮转状态(AutomaticRotation属性)为Suspended。当主密钥重新回到启用状态时,之前配置的轮转策略会重新生效。

不适用范围

KMS管理的以下类型的密钥不支持多个版本:
  • 云产品托管密钥(Service Managed Key):特定云产品托管在KMS上的、用于加密保护您的数据的默认密钥。这类密钥由特定云产品为用户代为管理,为您的数据提供最基本的加密保护。
  • 用户自带密钥(Customer Supplied Key):您导入到KMS中的密钥。这类CMK的Origin属性为External,KMS不负责为用户生成密钥材料,无法自动发起轮转行为。更多信息,请参见导入密钥材料
因此,以上两种类型的密钥不支持以自动或人工的方式进行基于版本的密钥轮转。此外,KMS也不支持自带密钥的多版本功能,原因如下:
  • 自带密钥的持久性和生命周期由用户强管控,本身就具有较高的管理难度和易错风险(例如:您需要有云下的密钥管理设施,云上云下信息需要同步,云上删除密钥材料没有任何缓冲期),而多版本带来的复杂度升级会超线性地升高易错性,从而带来数据风险。
  • 每个密钥版本,包括用于加密和解密的主版本以及仅用于解密的非主版本,都可能在不同的时间点上不可用(例如:在不同时间点上过期而被KMS删除,或者过期后被重新分别导入),导致无法同步主密钥和被保护数据的可用性,很难保证系统设计的完整性。
说明 对于上述不支持基于版本进行密钥轮转的场景,替代方案请参见人工轮转主密钥