設定攜帶您自己的金鑰 (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 程序期間獨佔使用。
- 它必須位於要匯入的 [目標金鑰] 的相同保存庫中。
使用者步驟
若要執行金鑰傳輸:
- 產生 KEK。
- 擷取 KEK 的公開金鑰。
- 使用提供 BYOK 工具的 HSM 廠商 - 將 KEK 匯入目標 HSM,並匯出受 KEK 保護的目標金鑰。
- 將受保護的目標金鑰匯入 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) 作為將正確解密的必要中繼資料傳遞給服務的載具。