針對主機守護者服務進行疑難解答
本文說明如何解決在受防護網狀架構中部署或操作主機守護者服務 (HGS) 伺服器時遇到的常見問題。
適用於: Windows Server 2022、Windows Server 2019、Windows Server 2016
如果您不確定問題的性質,請先嘗試在 HGS 伺服器和 Hyper-V 主機上執行 受防護網狀架構診斷 ,以縮小潛在原因。
憑證
HGS 需要數個憑證才能運作,包括系統管理員設定的加密和簽署憑證,以及 HGS 本身管理的證明憑證。 如果這些憑證設定不正確,HGS 無法為想要證明或解除鎖定受防護 VM 之密鑰保護裝置的 Hyper-V 主機要求提供服務。 以下幾節將說明與 HGS 上設定的憑證相關的常見問題。
憑證權限
HGS 必須能夠存取由憑證指紋新增至 HGS 的加密和簽署憑證的公開與私密金鑰。 具體而言,受群組管理的服務帳戶 (gMSA) 若執行 HGS 服務,則需要金鑰的存取權。 若要尋找 HGS 所使用的 gMSA,請在 HGS 伺服器上已提升權限的 PowerShell 提示中執行下列命令:
(Get-IISAppPool -Name KeyProtection).ProcessModel.UserName
如何為 gMSA 帳戶授與使用私密金鑰的存取權,取決於金鑰的儲存位置:作為本機憑證檔案儲存在機器上、儲存在硬體安全性模組 (HSM) 上,或使用自訂第三方金鑰儲存提供者。
授權存取軟體支援的私密金鑰
如果您使用自我簽署憑證或證書頒發機構單位所簽發的憑證,但未儲存在硬體安全性模組或自定義密鑰儲存提供者中,您可以執行下列步驟來變更私鑰許可權:
- 開啟本機憑證管理員 (certlm.msc)。
- 展開 [個人>憑證],然後尋找您要更新的簽署或加密憑證。
- 以滑鼠右鍵按兩下憑證,然後選取[所有工作>管理私鑰]。
- 選取 [新增],為新使用者授與憑證私密金鑰的存取權。
- 在物件選擇器中,為先前找到的 HGS 輸入 gMSA 帳戶名稱,然後選取 [確定]。
- 確定 gMSA 具有憑證的讀取存取權。
- 選取 [確定] 以關閉權限視窗。
如果您在 Server Core 上執行 HGS 或遠端管理伺服器,您將無法使用本機憑證管理員來管理私鑰。 相反地,您必須下載 受防護網狀架構工具 PowerShell 模組,這可讓您在 PowerShell 中管理許可權。
- 在 Server Core 機器上開啟提升權限的 PowerShell 主控台,或透過具有 HGS 本機系統管理員權限的帳戶使用 PowerShell 遠端處理。
- 執行下列命令以安裝受防護網狀架構工具 PowerShell 模組,並且為 gMSA 帳戶授與私密金鑰的存取權。
$certificateThumbprint = '<ENTER CERTIFICATE THUMBPRINT HERE>'
# Install the Guarded Fabric Tools module, if necessary
Install-Module -Name GuardedFabricTools -Repository PSGallery
# Import the module into the current session
Import-Module -Name GuardedFabricTools
# Get the certificate object
$cert = Get-Item "Cert:\LocalMachine\My\$certificateThumbprint"
# Get the gMSA account name
$gMSA = (Get-IISAppPool -Name KeyProtection).ProcessModel.UserName
# Grant the gMSA read access to the certificate
$cert.Acl = $cert.Acl | Add-AccessRule $gMSA Read Allow
授權存取 HSM 或自訂提供者支援的私密金鑰
如果您的憑證私鑰是由硬體安全性模組 (HSM) 或自定義金鑰儲存提供者 (KSP) 所支援,則許可權模型取決於您的特定軟體廠商。 為獲得最佳結果,請參閱廠商的文件或支援網站,以取得如何為特定裝置/軟體處理私密金鑰權限的相關資訊。 在任何情況下,HGS 所使用的 gMSA 對於加密、簽署和通訊憑證私密金鑰都需具備讀取權限,才能執行簽署和加密作業。
某些硬體安全性模組不支援授與特定用戶帳戶對私鑰的存取權;相反地,它們允許計算機帳戶存取特定密鑰集中的所有金鑰。 針對這類裝置,通常足以讓計算機存取您的密鑰,而 HGS 能夠利用該連線。
關於 HSM 的提示
以下是建議的設定選項,可協助您根據 Microsoft 及其合作夥伴的經驗,將 HSM 支援的金鑰成功用於 HGS。 這些秘訣是為了方便起見而提供,而且在閱讀時不保證正確,HSM製造商也不會認可這些提示。 如有其他問題,請連絡 HSM 製造商,以取得與特定裝置相關的正確資訊。
HSM 品牌/系列 | 建議 |
---|---|
Gemalto SafeNet | 確定憑證要求檔案中的金鑰使用方法屬性設定為 0xa0,讓憑證可用於簽署和加密。 此外,您必須使用本機憑證管理員工具,為 gMSA 帳戶授與私密金鑰的讀取存取權 (請參閱上述步驟)。 |
nCipher nShield | 確定每個 HGS 節點都有權存取包含簽署和加密金鑰的安全區域。 您可能還須使用本機憑證管理員,為 gMSA 授與私密金鑰的讀取存取權 (請參閱上述步驟)。 |
Utimaco CryptoServers | 確定憑證要求檔案中的金鑰使用方法屬性設定為 0x13,讓憑證可用於加密、解密和簽署。 |
憑證要求
如果您使用證書頒發機構單位在公鑰基礎結構 (PKI) 環境中發行憑證,您必須確定憑證要求包含 HGS 使用這些金鑰的最低需求。
簽署憑證
CSR 屬性 | 必要值 |
---|---|
演算法 | RSA |
Key size | 至少 2048 位元 |
金鑰使用方式 | Signature/Sign/DigitalSignature |
加密憑證
CSR 屬性 | 必要值 |
---|---|
演算法 | RSA |
Key size | 至少 2048 位元 |
金鑰使用方式 | Encryption/Encrypt/DataEncipherment |
Active Directory 憑證服務範本
如果您使用 Active Directory 憑證服務 (ADCS) 證書範本來建立憑證,建議您使用具有下列設定的範本:
ADCS 樣本屬性 | 必要值 |
---|---|
提供者類別 | 金鑰儲存提供者 |
演算法名稱 | RSA |
最小金鑰大小 | 2048 |
目標 | 簽章與加密 |
金鑰使用延伸模組 | 數位簽章、金鑰加密、資料加密 (「允許為使用者資料加密」) |
時間漂移
如果您的伺服器時間明顯偏離了受防護網狀架構中其他 HGS 節點或 Hyper-V 主機的時間,您可能會遇到證明簽署者憑證有效性的問題。 證明簽署者憑證會在 HGS 的幕後建立及更新,並用來簽署由證明服務簽發給受防護主機的健康情況憑證。
若要重新整理證明簽署者憑證,請在提升權限的 PowerShell 提示中執行下列命令。
Start-ScheduledTask -TaskPath \Microsoft\Windows\HGSServer -TaskName
AttestationSignerCertRenewalTask
或者,您可以開啟工作排程器 (taskschd.msc),流覽至 Windows HGSServer Microsoft>>工作排程器連結庫>,然後執行名為 AttestationSignerCertRenewalTask 的工作,以手動執行排程工作。
切換證明模式
如果您使用 Set-HgsServer Cmdlet 將 HGS 從 TPM 模式切換為 Active Directory 模式 (或反向操作),HGS 叢集中的每個節點最多可能需要 10 分鐘才能開始強制執行新的證明模式。
這是正常行為。
建議您在確認所有主機都使用新的證明模式成功證明之前,不要移除任何允許主機從先前證明模式的原則。
從 TPM 切換至 AD 模式時的已知問題
如果您在 TPM 模式中初始化 HGS 叢集,稍後切換至 Active Directory 模式,則已知問題會防止 HGS 叢集中的其他節點切換至新的證明模式。
為了確保所有 HGS 伺服器都強制執行正確的證明模式,請在 HGS 叢集的每個節點上執行 Set-HgsServer -TrustActiveDirectory
。
如果您從 TPM 模式切換至 AD 模式,且叢集原本是在 AD 模式中設定,則不適用此問題。
您可以執行 Get-HgsServer 來驗證 HGS 伺服器的證明模式。
記憶體傾印加密原則
如果您嘗試設定記憶體轉儲加密原則,但未看到預設 HGS 傾印原則(Hgs_NoDumps、Hgs_DumpEncryption和Hgs_DumpEncryptionKey)或傾印原則 Cmdlet (Add-HgsAttestationDumpPolicy
),您可能未安裝最新的累積更新。
若要修正此問題,請將 HGS 伺服器更新為最新的累積 Windows 更新,並啟用新的證明原則。
在啟用新的證明原則之前,請務必將 Hyper-V 主機更新為相同的累積更新,因為未安裝新傾印加密功能的主機在啟用 HGS 原則後可能會失敗證明。
簽署金鑰憑證錯誤訊息
當您使用 Add-HgsAttestationTpmHost Cmdlet 註冊主機時,會從提供的平臺標識符檔案擷取兩個 TPM 識別符:簽署密鑰憑證 (EKcert) 和公開簽署密鑰 (EKpub)。 EKcert 會識別 TPM 的製造商,並保證 TPM 是真實、透過正常供應鏈製造的。 EKpub 可唯一識別該 TPM,是 HGS 用來授權給主機執行受防護 VM 的其中一個量值。
如果兩個條件之一成立,當您註冊 TPM 主機時,就會收到錯誤:
- 平台標識碼檔案不包含簽署金鑰憑證。
- 平台標識碼檔案包含簽署密鑰憑證,但該憑證不在您的系統上受信任。
某些 TPM 製造商在其 TPM 中不包含 EKcert。
如果您的 TPM 可能就是如此,請向 OEM 確認您的 TPM 是否不應有 EKcert,並使用 -Force
旗標手動向 HGS 註冊主機。
如果您的 TPM 應該有 EKcert,但在平臺標識碼檔案中找不到一個憑證,請確定您在主機上執行 Get-PlatformIdentifier 時,使用的是系統管理員(已提升許可權)PowerShell 控制台。
如果您收到 EKcert 不受信任的錯誤,請確定您已 在每個 HGS 伺服器上安裝受信任的 TPM 跟證書套件 ,且 TPM 廠商的跟證書存在於本機計算機的「TrustedTPM_RootCA」存放區中。 任何適用的中繼憑證也必須安裝在本機電腦上的「TrustedTPM_IntermediateCA」存放區中。
安裝根憑證和中繼憑證後,您就應該能夠順利執行 Add-HgsAttestationTpmHost
。
受群組管理的服務帳戶 (gMSA) 權限
HGS 服務帳戶 (IIS 中的金鑰保護服務應用程式集區所使用的 gMSA) 必須獲得產生安全性稽核權限,也稱為 SeAuditPrivilege
。 如果遺失此許可權,初始 HGS 組態會成功且 IIS 會啟動,不過密鑰保護服務無法運作,並傳回 HTTP 錯誤 500(「/KeyProtection 應用程式中的伺服器錯誤」)。 您也可以在應用程式事件記錄檔中觀察下列警告訊息。
System.ComponentModel.Win32Exception (0x80004005): A required privilege is not held by the client
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.NativeUtility.RegisterAuditSource(String pszSourceName, SafeAuditProviderHandle& phAuditProvider)
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)
或
Failed to register the security event source.
at System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app)
at System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers)
at System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context)
at System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context)
at System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)
Failed to register the security event source.
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.ReportAudit(EventLogEntryType eventType, UInt32 eventId, Object[] os)
at Microsoft.Windows.KpsServer.KpsServerHttpApplication.Application_Start()
A required privilege is not held by the client
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.NativeUtility.RegisterAuditSource(String pszSourceName, SafeAuditProviderHandle& phAuditProvider)
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)
此外,您可能會注意到密鑰保護服務 Cmdlet(例如 Get-HgsKeyProtectionCertificate)都無法運作,而是傳回錯誤。
若要解決此問題,您必須授與 gMSA「產生安全性稽核」(SeAuditPrivilege
)。 若要這樣做,您可以在 HGS 叢集的每個節點上使用 Local 安全策略 SecPol.msc ,或組策略。 或者,您可以使用 SecEdit.exe 工具匯出目前的安全性原則、在組態檔 (純文字格式) 中進行必要的編輯,再將其重新匯入。
注意
設定此設定時,針對許可權定義的安全策略清單會完全覆寫預設值(它不會串連)。 因此,定義此原則設定時,除了您要新增的 gMSA 之外,請務必同時包含此許可權的預設持有者(網路服務和本地服務)。