針對主機守護者服務進行疑難排解

適用于:Windows Server 2022、Windows Server 2019、Windows Server 2016

本文說明在受防護網狀架構中部署或操作主機守護者服務 (HGS) 伺服器時所遇到的常見問題解決方式。 如果您不確定問題的本質,請先嘗試在 HGS 伺服器和 Hyper-V 主機上執行 受防護網狀架構診斷 ,以縮小可能的原因。

憑證

HGS 需要數個憑證才能運作,包括系統管理員設定的加密和簽署憑證,以及由 HGS 本身管理的證明憑證。 如果這些憑證設定不正確,HGS 將無法從想要證明或解除鎖定受防護 VM 金鑰保護裝置的 Hyper-V 主機提供要求。 下列各節涵蓋與 HGS 上設定之憑證相關的常見問題。

憑證許可權

HGS 必須能夠透過憑證指紋存取加密和簽署憑證新增至 HGS 的公開和私密金鑰。 具體而言,執行 HGS 服務的群組受控服務帳戶 (gMSA) 需要存取金鑰。 若要尋找 HGS 所使用的 gMSA,請在 HGS 伺服器上的提升許可權 PowerShell 提示字元中執行下列命令:

(Get-IISAppPool -Name KeyProtection).ProcessModel.UserName

如何將 gMSA 帳戶存取權授與使用私密金鑰,取決於金鑰的儲存位置:在電腦上作為本機憑證檔案、硬體安全性模組 (HSM) ,或使用自訂的協力廠商金鑰儲存提供者。

授與軟體支援的私密金鑰存取權

如果您使用自我簽署憑證或憑證授權單位單位所簽發的憑證 ,但未 儲存在硬體安全性模組或自訂金鑰儲存提供者中,您可以執行下列步驟來變更私密金鑰許可權:

  1. 開啟本機憑證管理員 (certlm.msc)
  2. 展開 [個人 > 憑證 ],然後尋找您要更新的簽署或加密憑證。
  3. 以滑鼠右鍵按一下憑證,然後選取 [ 所有工作 > 管理私密金鑰]。
  4. 選取 [新增 ] 以授與憑證私密金鑰的新使用者存取權。
  5. 在物件選擇器中,輸入稍早找到 HGS 的 gMSA 帳戶名稱,然後選取 [ 確定]。
  6. 確定 gMSA 具有憑證的 讀取 許可權。
  7. 選取 [確定 ] 以關閉許可權視窗。

如果您在 Server Core 上執行 HGS 或從遠端管理伺服器,您將無法使用本機憑證管理員來管理私密金鑰。 相反地,您必須下載 Guarded Fabric Tools PowerShell 模組 ,這可讓您管理 PowerShell 中的許可權。

  1. 在 Server Core 電腦上開啟提升許可權的 PowerShell 主控台,或使用 PowerShell 遠端處理搭配具有 HGS 本機系統管理員許可權的帳戶。
  2. 執行下列命令以安裝受防護網狀架構工具 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 及其合作夥伴的體驗,成功搭配 HGS 使用 HSM 支援的金鑰。 這些秘訣是為了方便起見而提供,而且不保證在閱讀時正確,也不會由 HSM 製造商背書。 如果您有進一步的問題,請連絡您的 HSM 製造商,以取得與特定裝置相關的正確資訊。

HSM 品牌/系列 建議
Gemalto SafeNet 請確定憑證要求檔案中的 [金鑰使用方式屬性] 設定為 [0xa0],以允許憑證用於簽署和加密。 此外,您必須使用本機憑證管理員工具將 gMSA 帳戶 讀取 許可權授與私密金鑰, (請參閱上述步驟) 。
nCipher nShield 確定每個 HGS 節點都能存取包含簽署和加密金鑰的安全性世界。 您可能需要使用本機憑證管理員將 gMSA 讀取 許可權授與私密金鑰, (請參閱上述步驟) 。
Utimaco CryptoServers 請確定憑證要求檔案中的金鑰使用方式屬性已設定為 0x13,讓憑證可用於加密、解密和簽署。

憑證要求

如果您使用憑證授權單位單位在公開金鑰基礎結構中發行憑證, (PKI) 環境,您必須確保您的憑證要求包含這些金鑰使用 HGS 的最低需求。

簽署憑證

CSR 屬性 必要值
演算法 RSA
金鑰大小 至少 2048 位
金鑰使用方式 Signature/Sign/DigitalSignature

加密憑證

CSR 屬性 必要值
演算法 RSA
金鑰大小 至少 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

或者,您可以開啟task Scheduler (taskschd.msc) ,流覽至工作排程器程式庫 > Microsoft > Windows > HGSServer並執行名為AttestationSignerCertRenewalTask的工作,以手動執行排程工作。

切換證明模式

如果您將 HGS 從 TPM 模式切換為 Active Directory 模式,反之亦然使用 Set-HgsServer Cmdlet,則 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 主機時,您會收到錯誤:

  1. 平臺識別碼檔案 不包含 簽署金鑰憑證
  2. 平臺識別碼檔案包含簽署金鑰憑證,但系統上 不受信任 該憑證

某些 TPM 製造商在其 TPM 中不包含 EKcert。 如果您懷疑這是 TPM 的情況,請向 OEM 確認您的 TPM 不應該有 EKcert,並使用 -Force 旗標手動向 HGS 註冊主機。 如果您的 TPM 應該有 EKcert,但在平臺識別碼檔案中找不到 EKcert,請確定您在主機上執行 Get-PlatformIdentifier 時,會使用系統管理員 (提升許可權的) PowerShell 主控台。

如果您收到 EKcert 不受信任的錯誤,請確定您已在每個 HGS 伺服器上 安裝受信任的 TPM 根憑證套件 ,且 TPM 廠商的根憑證存在於本機電腦的 TrustedTPM_RootCA 存放區中。 任何適用的中繼憑證也必須安裝在 本機電腦上的TrustedTPM_IntermediateCA 存放區中。 安裝根和中繼憑證之後,您應該能夠順利執行 Add-HgsAttestationTpmHost

群組受控服務帳戶 (gMSA) 許可權

必須授與 IIS) 中用於金鑰保護服務應用程式集區的 HGS 服務帳戶 (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 叢集的每個節點上使用本機安全性原則 SecPol.msc ,或群組原則。 或者,您可以使用 SecEdit.exe 工具來匯出目前的安全性原則,在組態檔中進行必要的編輯, (這是純文字) ,然後將它匯回。

注意

設定此設定時,針對許可權定義的安全性原則清單會完全覆寫預設值, (它不會串連) 。 因此,定義此原則設定時,除了您要新增的 gMSA 之外,請務必同時包含此許可權的預設擁有者 (網路服務和本機服務) 。