主机保护者服务疑难解答
本文介绍在受保护的结构中部署或操作主机保护者服务 (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) 上,或使用自定义的第三方密钥存储提供程序存储。
授予对软件保护的私钥的访问权限
如果使用自签名证书或证书颁发机构颁发的证书,但该证书未存储在硬件安全模块或自定义密钥存储提供程序中,可以通过执行以下步骤来更改私钥权限:
- 打开本地证书管理器(certlm.msc)。
- 展开“个人>证书”,找到要更新的签名或加密证书。
- 右键单击证书,然后选择“所有任务>管理私钥”。
- 选择“添加”以授予新用户对证书私钥的访问权限。
- 在对象选取器中,输入前面找到的 HGS 的 gMSA 帐户名称,然后选择“确定”。
- 确保 gMSA 对该证书拥有“读取”访问权限。
- 选择“确定”关闭权限窗口。
如果在服务器核心上运行 HGS 或远程管理服务器,则无法使用本地证书管理器管理私钥。 相反,需要下载 Guarded Fabric Tools PowerShell 模块,这样就可以在 PowerShell 中管理权限。
- 在 Server Core 计算机上打开权限提升的 PowerShell 控制台,或通过对 HGS 拥有本地管理员权限的帐户使用 PowerShell 远程处理。
- 运行以下命令,以安装受保护的结构工具 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 之外,请确保同时包含此特权的默认持有者(网络服务和本地服务)。