主机保护者服务疑难解答

本文介绍在受保护的结构中部署或操作主机保护者服务 (HGS) 服务器时遇到的常见问题的解决方法。

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

如果不确定问题的性质,请先尝试在 HGS 服务器和 Hyper-V 主机上运行 受保护的构造诊断 ,以缩小潜在原因。

Certificates

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. 选择“确定”关闭权限窗口。

如果在服务器核心上运行 HGS 或远程管理服务器,则无法使用本地证书管理器管理私钥。 相反,需要下载 Guarded Fabric Tools 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),导航到任务计划程序>Microsoft>Windows>HGSServer 并运行名为 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 的一种措施。

如果两个条件之一为 true,则注册 TPM 主机时会收到错误:

  • 平台标识符文件不包含认可密钥证书。
  • 平台标识符文件包含认可密钥证书,但该证书在系统上不受信任。

某些 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) 特权

需要为 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 群集的每个节点上使用本地安全策略 SecPol.msc 或组策略。 或者,可以使用 SecEdit.exe 工具导出当前安全策略,在配置文件(纯文本)中进行必要的编辑,然后将其导入回去。

注意

配置此设置时,为特权定义的安全原则列表将完全替代默认值(它不会连接)。 因此,定义此策略设置时,除了要添加的 gMSA 之外,请确保同时包含此特权的默认持有者(网络服务和本地服务)。