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

本文說明在受防護網狀架構中部署或操作主機守護者服務 (HGS) 伺服器時所遇到常見問題的解決方法。

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

如果您不確定問題的本質,請先嘗試在 HGS 伺服器和 Hyper-V 主機上執行 受防護網狀架構診斷 ,以縮小可能的原因。

憑證

HGS 需要數個憑證才能運作,包括系統管理員設定的加密和簽署憑證,以及 HGS 本身所管理的證明憑證。 如果這些憑證設定不正確,HGS 就無法處理來自 Hyper-V 主機的要求,而這些主機想要證明或解除鎖定受防護 VM 的密鑰保護裝置。 下列各節涵蓋與 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,或是從遠端管理伺服器,您將無法使用本機憑證管理員來管理私鑰。 相反地,您需要下載 受防護網狀架構工具 PowerShell 模組,這可讓您管理 PowerShell 中的許可權。

  1. 在 Server Core 計算機上開啟提升許可權的 PowerShell 控制台,或使用 PowerShell 遠端處理搭配具有 HGS 本機系統管理員許可權的帳戶。
  2. 執行下列命令來安裝 Guarded Fabric Tools 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 伺服器都強制執行正確的證明模式, Set-HgsServer -TrustActiveDirectory 請在 HGS 叢集的每個節點上執行 。

如果您要從 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 中包含 EKcerts。

如果您懷疑 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)

此外,您可能會注意到沒有任何 Key Protection Service Cmdlet (例如 Get-HgsKeyProtectionCertificate) 運作,而是傳回錯誤。

若要解決此問題,您必須授與 gMSA「產生安全性稽核」 (SeAuditPrivilege) 。 若要這樣做,您可以在 HGS 叢集的每個節點上使用本機安全策略 SecPol.msc,或 群組原則。 或者,您可以使用 SecEdit.exe 工具導出目前的安全策略、在組態檔中進行必要的編輯 (這是純文本) ,然後將它匯回。

注意事項

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