設定攜帶您自己的金鑰 (BYOK)

已完成

案例

Key Vault 客戶想要從其 Azure 外部的內部部署硬體安全性模組 (HSM) 安全地將金鑰傳輸至支援 HSM 的 Azure Key Vault 中。 匯入在 Key Vault 外產生之金鑰的程序,稱為「攜帶您自己的金鑰」(BYOK)。

以下是需求:

  • 要傳輸的金鑰從未以純文字的形式存在於 HSM 之外。
  • 在 HSM 外部,要傳輸的金鑰一律會受到 Azure Key Vault HSM 中保存的金鑰保護。

詞彙

金鑰名稱 索引鍵類型 來源 說明
金鑰交換金鑰 (KEK) RSA Azure Key Vault HSM 在 Azure Key Vault 中產生的 HSM 支援 RSA 金鑰組
包裝金鑰 AES 廠商 HSM 由 HSM 於內部部署產生的 [暫時性] AES 金鑰
目標金鑰 RSA、EC、AES (僅限受控 HSM) 廠商 HSM 要傳輸至 Azure Key Vault HSM 的金鑰

金鑰交換金鑰 (KEK):這是在金鑰保存庫中由客戶產生的 HSM 支援的金鑰,用於匯入 BYOK (攜帶您自己的金鑰) 金鑰。 KEK 應具有下列屬性:

  • 它必須是 RSA-HSM 金鑰,大小為 4096 位元、3072 位元或 2048 位元。
  • 其金鑰作業 (key_ops) 僅限於「匯入」,允許其在 BYOK 程序期間獨佔使用。
  • 它必須位於要匯入的 [目標金鑰] 的相同保存庫中。

使用者步驟

若要執行金鑰傳輸:

  1. 產生 KEK。
  2. 擷取 KEK 的公開金鑰。
  3. 使用提供 BYOK 工具的 HSM 廠商 - 將 KEK 匯入目標 HSM,並匯出受 KEK 保護的目標金鑰。
  4. 將受保護的目標金鑰匯入 Azure Key Vault。

客戶可以使用 HSM 廠商所提供的 BYOK 工具和文件來完成步驟 3。 其會產生金鑰傳輸 Blob (".byok" 檔案)。

HSM 條件約束

現有的 HSM 可能會對所管理的金鑰套用限制式,包括:

  • HSM 可能必須加以設定來允許金鑰包裝型匯出
  • 目標金鑰可能需要標示為 Cryptoki 屬性 (CKA)_EXTRACTABLE,以供 HSM 允許受控制的匯出
  • 在某些情況下,KEK 和包裝金鑰可能需要標示為 CKA_TRUSTED,這可讓它用來將金鑰包裝在 HSM 中。

來源 HSM 的設定通常是在此規格的範圍之外。 Microsoft 預期 HSM 廠商會提供 BYOK 工具隨附的文件,以包括任何這類設定步驟。

注意

您可以使用其他介面來執行這些步驟,例如 Azure PowerShell 和 Azure 入口網站。 其也可以使用 Key Vault SDK 中的對等函式來以程式設計方式執行。

產生 KEK

使用 az keyvault key create 命令來建立 KEK 並將金鑰作業設定為匯入。 記下從下列命令傳回的金鑰識別碼 'kid'。

az keyvault key create --kty RSA-HSM --size 4096 --name KEKforBYOK --ops import --vault-name ContosoKeyVaultHSM




服務支援不同的 KEK 長度;例如,Azure SQL 只支援 2048 或 3072 個位元組的金鑰長度。

擷取 KEK 的公開金鑰

下載 KEK 的公開金鑰部分,並將其儲存到 PEM 檔案中。

az keyvault key download --name KEKforBYOK --vault-name ContosoKeyVaultHSM --file KEKforBYOK.publickey.pem




使用 HSM 廠商所提供的 BYOK 工具來產生金鑰傳輸 Blob

使用 HSM 廠商提供的 BYOK 工具來建立金鑰傳輸 Blob (儲存為 “.byok” 檔案)。 作為 .Privacy-Enhanced Mail (.pem 檔案) 的 KEK 公開金鑰將是此工具的其中一個輸入。

金鑰傳輸 Blob

長期來說,Microsoft 建議使用 PKCS#11 CKM_RSA_AES_KEY_WRAP 機制將目標金鑰傳輸到 Azure Key Vault,因為此機制會產生單一 Blob,而且更重要的是,中繼 AES 金鑰是由兩個 HSM 處理,並保證是暫時的。 此機制目前在某些 HSM 中無法使用,但以使用 AES 金鑰的 CKM_AES_KEY_WRAP_PAD 來保護目標金鑰,以及使用 CKM_RSA_PKCS_OAEP 保護 AES 金鑰的組合,會產生對等的 Blob。

目標金鑰純文字取決於金鑰類型:

  • 針對 RSA 金鑰,會是包裝在 PKCS#8 [RFC5208] 中的私密金鑰 ASN.1 DER 編碼 [RFC3447]
  • 針對 EC 金鑰,會是包裝在 PKCS#8 [RFC5208] 中的私密金鑰 ASN.1 DER 編碼 [RFC5915]
  • 針對八位元金鑰,會是金鑰的原始位元組

接著會使用 CKM_RSA_AES_KEY_WRAP 機制來轉換純文字金鑰的位元組:

  • 系統會產生暫時性 AES 金鑰,並使用搭配 SHA1 之 RSA-OAEP 的包裝 RSA 金鑰來加密。
  • 編碼的純文字金鑰是使用 AES 金鑰 (使用 AES 金鑰包裝搭配填補) 來加密的。
  • 系統會串連加密的 AES 金鑰和加密的純文字金鑰以產生最終的加密文字 Blob。

傳輸 Blob 的格式主要會使用 JSON Web Encryption Compact Serialization (RFC7516) 作為將正確解密的必要中繼資料傳遞給服務的載具。