本文為您介紹如何對密鑰管理服務(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刪除,或者過期后被重新分別導入),導致無法同步主密鑰和被保護數據的可用性,很難保證系統設計的完整性。
說明 對于上述不支持基于版本進行密鑰輪轉的場景,替代方案請參見人工輪轉主密鑰