有效的密鑰管理對於優化 Azure 雲端 HSM 的效能、安全性和效率至關重要。 本文提供處理金鑰記憶體限制、金鑰包裝安全性、金鑰屬性和快取策略的最佳做法和建議。
管理金鑰記憶體限制
硬體安全性模組 (HSM) 限制可一次儲存的令牌和會話密鑰數目上限。 如需這些限制的詳細資訊,請參閱 Azure 雲端 HSM 服務限制。
若要避免超過 Azure 雲端 HSM 服務限制,請考慮使用下列一或多個策略進行有效率的密鑰管理:
- 密鑰輪替:經常輪替密鑰,以確保已取代較舊的密鑰,並釋放新密鑰的空間。 頻繁輪替有助於將 HSM 保留在記憶體限制內,同時維持安全性。
- 金鑰階層:使用金鑰階層,在其中使用主鍵來加密其他密鑰。 此階層可減少需要直接儲存在 HSM 中的金鑰數目。
- 密鑰共用和重複使用:對於具有多個會話或令牌的應用程式,請考慮共用密鑰或重複使用金鑰,以減少儲存的總數。
- 密鑰刪除:當您不再需要密鑰之後(例如工作階段結束之後),請確定它已安全地刪除,以釋放新密鑰的空間。
備註
在您建立密鑰之後等候 24 小時,以確保 Azure Cloud HSM 部署內的同步處理和備份已完成。
管理金鑰包裝
您可以使用 EXTRACTABLE Azure Cloud HSM 中的 屬性,將索引鍵標示為可擷取或不可匯出。 根據預設,HSM 金鑰會設定為可擷取。 您可以透過金鑰包裝,從 HSM 匯出可擷取的金鑰,以加密密鑰。 然後,金鑰需要透過相同的包裝密鑰解除包裝,才能使用。
相反地,在任何情況下,都無法從 Azure Cloud HSM 匯出非可追蹤的密鑰。 將索引鍵設定為不可匯出之後,便無法將其變更為可擷取。 請務必仔細考慮您是否需要可擷取密鑰,並據以設定密鑰屬性。
如果您的應用程式需要金鑰包裝,建議您使用 受信任的金鑰包裝。 此方法會限制 HSM 使用者只包裝和解除包裝系統管理員明確指定為受信任密鑰:
EXTRACTABLE=0:無法匯出具有EXTRACTABLE屬性設定為0的索引鍵,除非是作為遮罩物件。 它們非常適合您不想離開 HSM 的金鑰。WRAP_WITH_TRUSTED=1:根據預設,透過 Azure Cloud HSM SDK 建立的可擷取密鑰會使用信任的金鑰包裝。 不過,PKCS#11 的規格預設會設定WRAP_WITH_TRUSTED為CK_FALSE (0)。 若未包裝受信任的密鑰,密碼編譯使用者可以匯出密鑰的私人數據,而不需要任何授權。 任何有權存取用戶端應用程式並使用這些密鑰的人都可以以純文字匯出它們。
Azure 雲端 HSM 提供者支援的主要屬性
| Azure Cloud HSM 提供者 | 私人和對稱密鑰的預設屬性 | 支援 EXTRACTABLE=0 | 支援在提供者內設定WRAP_WITH_TRUSTED | 預設 WRAP_WITH_TRUSTED 值 |
|---|---|---|---|---|
azcloudhsm_util |
EXTRACTABLE、!WRAP_WITH_TRUSTED |
是的 | 是的 |
1 (0 可以透過參數設定) |
| PKCS#11 |
EXTRACTABLE、!WRAP_WITH_TRUSTED |
是的 | 是的 |
0 (在 PKCS#11 規格中指定,但在 API 中可以設定為 1 ) |
| CNG/KSP |
EXTRACTABLE、!WRAP_WITH_TRUSTED |
否 | 否 | 1 |
| OpenSSL 引擎 |
EXTRACTABLE、!WRAP_WITH_TRUSTED |
否 | 否 | 1 |
| JCE |
!EXTRACTABLE、!PERSISTANT、!WRAP_WITH_TRUSTED |
是的 | 否 | 1 |
您使用密碼編譯 API: 新世代 (CNG) 提供者建立的金鑰一律設定為 EXTRACTABLE。 您可以使用此工具 CavImportKey.exe ,透過密鑰句柄,將來自其他 Azure Cloud HSM 工具的金鑰匯入 CNG 提供者。 此匯入會從現有的金鑰句柄,在金鑰儲存提供者 (KSP) 中建立金鑰。
對於 使用 CNG 或 KSP 作為提供者的證書頒發機構單位,CNG 提供者內產生的所有密鑰仍會標示為可擷取。 如果密鑰在 HSM 上被標示為 TRUSTED(例如使用者生成的密鑰加密金鑰),它可能會被用來擷取這些密鑰的私鑰純文字,即使在 WRAP_WITH_TRUSTED 變更之後也是如此。
在這種情況下,如果您不想將密鑰標示為 EXTRACTABLE,建議您使用 azcloudhsm_util 來產生索引鍵。 我們建議您使用 getAttribute 來確認產生的金鑰具有所需的屬性。
採用金鑰屬性來管理金鑰許可權
使用金鑰屬性來管理重要功能,例如許可權。 當您產生金鑰時,請使用金鑰屬性來指定允許或限制該金鑰特定作業的許可權。 建議您只針對其預定目的產生具有必要屬性的金鑰。
例如, 用於加密的進階加密標準 (AES) 金鑰不應該能夠將密鑰包裝在 HSM 之外。 如需 Azure Cloud HSM SDK 屬性的詳細資訊,請參閱 整合指南。
透過快取關鍵對象來優化延遲
若要降低延遲,請考慮儘可能快取關鍵物件。 在搜尋金鑰時,會查詢 Azure 雲端 HSM 叢集中的每個 HSM。 此作業成本高昂,且無法有效率地擴展。 金鑰搜尋的方法取決於提供者:
- 針對 PKCS#11,金鑰搜尋會使用
C_FindObjectsAPI。 - 針對 Java 密碼編譯延伸模組 (JCE),金鑰搜尋會使用
KeyStore值。
為了獲得最佳效能,建議您只在應用程式啟動期間使用索引鍵尋找命令 (例如 findKey 和 key list) 一次。 將傳回的金鑰物件儲存在應用程式記憶體中。 當您稍後需要這個關鍵物件時,請從快取擷取它,而不是在每次操作中重新查詢它。 查詢它會產生明顯的效能負擔。