分享方式:


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

本文說明如何解決在受防護網狀架構中部署或操作主機守護者服務 (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) 上,或使用自訂第三方金鑰儲存提供者。

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

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

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

如果您在 Server Core 上執行 HGS 或遠端管理伺服器,您將無法使用本機憑證管理員來管理私鑰。 相反地,您必須下載 受防護網狀架構工具 PowerShell 模組,這可讓您在 PowerShell 中管理許可權。

  1. 在 Server Core 機器上開啟提升權限的 PowerShell 主控台,或透過具有 HGS 本機系統管理員權限的帳戶使用 PowerShell 遠端處理。
  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 及其合作夥伴的經驗,將 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 之外,請務必同時包含此許可權的預設持有者(網路服務和本地服務)。