主机保护者服务疑难解答

本文介绍在受保护的构造中部署或操作主机保护者服务 (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 或远程管理服务器,则无法使用本地证书管理器管理私钥。 相反,需要下载 Guarded Fabric Tools PowerShell 模块,该模块允许你在 PowerShell 中管理权限。

  1. 在 Server Core 计算机上打开提升的 PowerShell 控制台,或使用对 HGS 具有本地管理员权限的帐户使用 PowerShell 远程处理。
  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 及其合作伙伴的经验成功将 HSM 支持的密钥与 HGS 配合使用。 提供这些提示是为了方便你,不保证在阅读时是正确的,也不能保证它们得到 HSM 制造商的认可。 如有其他疑问,请联系 HSM 制造商,获取与特定设备相关的准确信息。

HSM 品牌/系列 Suggestion
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

或者,可以手动运行计划任务,方法是打开 任务计划程序 (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) (公钥。 EK 证书标识 TPM 的制造商,确保 TPM 是真实的,并通过正常的供应链制造。 EKpub 唯一标识特定的 TPM,是 HGS 用于授予主机运行受防护 VM 的访问权限的一项措施。

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

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

某些 TPM 制造商在其 TPM 中不包括 EK 证书。

如果怀疑 TPM 存在这种情况,请与 OEM 确认 TPM 不应具有 EK 证书,并使用 标志 -Force 向 HGS 手动注册主机。 如果 TPM 应具有 EK 证书,但在平台标识符文件中找不到 EK 证书,请确保在主机上运行 Get-PlatformIdentifier 时,使用管理员 (提升) PowerShell 控制台。

如果收到 EK 证书不受信任错误,请确保已在每台 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 之外,请确保包括此权限的默认持有者 (网络服务和本地服务) 。