使用基于 TPM 的证明授权受保护的主机

适用范围:Windows Server 2022、Windows Server 2019、Windows Server 2016

TPM 模式使用 TPM 标识符(也称为平台标识符或认可密钥 [EKpub])开始确定特定主机是否被授权为“受保护”。此证明模式使用安全启动和代码完整性测量来确保给定的 Hyper-V 主机处于正常状态,且仅运行受信任的代码。 为使证明了解正常与不正常的情况,必须捕获以下项目:

  1. TPM 标识符 (EKpub)

    • 此信息对于每个 Hyper-V 主机都是唯一的
  2. TPM 基线(启动度量)

    • 这适用于在同一类硬件上运行的所有 Hyper-V 主机
  3. 代码完整性策略(可使用的二进制文件的允许列表)

    • 这适用于共享通用硬件和软件的所有 Hyper-V 主机

建议从“参考主机”捕获基线和 CI 策略,该主机代表数据中心内每个唯一的 Hyper-V 硬件配置类别。 从 Windows Server 版本 1709 开始,示例 CI 策略包含在 C:\Windows\schemas\CodeIntegrity\ExamplePolicies 中。

已版本控制的证明策略

Windows Server 2019 引入了一种新的证明方法,称为 v2 证明,其中必须存在 TPM 证书才能将 EKPub 添加到 HGS。 借助 Windows Server 2016 中使用的 v1 证明方法,可在运行 Add-HgsAttestationTpmHost 或其他 TPM 证明 cmdlet 捕获项目时,指定 -Force 标志来替代此安全检查。 从 Windows Server 2019 开始,默认使用 v2 证明,如果需要在没有证书的情况下注册 TPM,则需要在运行 Add-HgsAttestationTpmHost 时指定 -PolicyVersion v1 标志。 -Force 标志不适用于 v2 证明。

主机只能证明所有项目(EKPub + TPM 基线 + CI 策略)是否使用相同版本的证明。 首先尝试 V2 证明,如果失败,则使用 v1 证明。 这意味着,如果需要使用 v1 证明注册 TPM 标识符,则还需要指定 -PolicyVersion v1 标志,在捕获 TPM 基线和创建 CI 策略时使用 v1 证明。 如果 TPM 基线和 CI 策略是使用 v2 证明创建的,之后需要添加没有 TPM 证书的受保护的主机,则需要使用 -PolicyVersion v1 标志重新创建每个项目。

捕获每个主机的 TPM 标识符(平台标识符或 EKpub)

  1. 在结构域中,确保每个主机上的 TPM 已准备就绪,即 TPM 已初始化并获得所有权。 可打开 TPM 管理控制台 (tpm.msc),或者在提升的 Windows PowerShell 窗口中运行 Get-Tpm 来检查 TPM 的状态。 如果 TPM 未处于“就绪”状态,则需要对其进行初始化并设置其所有权。 可在 TPM 管理控制台中,也可通过运行 Initialize-Tpm 来完成此操作。

  2. 在每个受保护的主机上,在提升的 Windows PowerShell 控制台中运行以下命令来获取其 EKpub。 对于 <HostName>,请将唯一主机名替换为适合标识此主机的名称 - 可以是其主机名,也可以是结构清单服务使用的名称(如果可用)。 为方便起见,请使用主机名来命名输出文件。

    (Get-PlatformIdentifier -Name '<HostName>').InnerXml | Out-file <Path><HostName>.xml -Encoding UTF8
    
  3. 对将成为受保护的主机的每个主机重复上述步骤,确保为每个 XML 文件指定一个唯一的名称。

  4. 将生成的 XML 文件提供给 HGS 管理员。

  5. 在 HGS 域中,在 HGS 服务器上打开提升的 Windows PowerShell 控制台,并运行以下命令。 对每个 XML 文件重复该命令。

    Add-HgsAttestationTpmHost -Path <Path><Filename>.xml -Name <HostName>
    

    注意

    如果你在添加有关不受信任的认可密钥证书 (EKCert) 的 TPM 标识符时遇到错误,请确保已将受信任的 TPM 根证书添加到 HGS 节点。 此外,某些 TPM 供应商不使用 EKCert。 要检查 EKCert 是否丢失,可以在编辑器(如记事本)中打开 XML 文件并检查指示未找到 EKCert 的错误消息。 如果是这种情况,并且你相信计算机中的 TPM 是可信的,可以使用 -Force 参数将主机标识符添加到 HGS。 在 Windows Server 2019 中,使用 -Force 时还需要使用 -PolicyVersion v1 参数。 这会创建一个与 Windows Server 2016 行为一致的策略,并要求在注册 CI 策略和 TPM 基线时使用 -PolicyVersion v1

创建并应用代码完整性策略

代码完整性策略有助于确保仅允许在主机上运行你信任的可执行文件。 阻止受信任的可执行文件之外的恶意软件和其他可执行文件运行。

每个受保护的主机都必须应用代码完整性策略,才能在 TPM 模式下运行受防护的 VM。 可以通过将代码完整性策略添加到 HGS 来指定你信任的确切代码完整性策略。 可以将代码完整性策略配置为强制实施策略来阻止任何不符合策略的软件,或者配置为只进行审核(在执行策略中未定义的软件时记录一个事件)。

从 Windows Server 版本 1709 开始,示例代码完整性策略包含在Windows C:\Windows\schemas\CodeIntegrity\ExamplePolicies 中。 建议对 Windows Server 使用两种策略:

  • AllowMicrosoft:允许由 Microsoft 签名的所有文件。 建议将此策略用于 SQL 或 Exchange 等服务器应用程序;如果服务器由 Microsoft 发布的代理监视,也建议使用它。
  • DefaultWindows_Enforced:仅允许在 Windows 中交付的文件,不允许 Microsoft 发布的其他应用程序(例如 Office)。 对于仅运行内置服务器角色和功能(如 Hyper-V)的服务器,建议使用此策略。

建议首先在审核(日志记录)模式下创建 CI 策略以查看它是否遗漏任何内容,然后为主机生产工作负载执行该策略。

如果使用 New-CIPolicy cmdlet 生成自己的代码完整性策略,则需要确定要使用的规则级别。 建议使用“发布者”这一主要级别,并回退到“哈希”,使得可在不更改 CI 策略的情况下更新大多数数字签名的软件。 还可以在服务器上安装由同一发布者编写的新软件,而无需更改 CI 策略。 未进行数字签名的可执行文件将被哈希处理。 更新这些文件将需要创建新的 CI 策略。 有关可用 CI 策略规则级别的详细信息,请参阅部署代码完整性策略:策略规则和文件规则以及 cmdlet 帮助。

  1. 在参考主机上,生成新的代码完整性策略。 以下命令在“发布者”级别创建一个策略并回退到“哈希”。 然后,它将 XML 文件转换为 Windows 和 HGS 应用和测量 CI 策略分别所需的二进制文件格式。

    New-CIPolicy -Level Publisher -Fallback Hash -FilePath 'C:\temp\HW1CodeIntegrity.xml' -UserPEs
    
    ConvertFrom-CIPolicy -XmlFilePath 'C:\temp\HW1CodeIntegrity.xml' -BinaryFilePath 'C:\temp\HW1CodeIntegrity.p7b'
    

    注意

    上述命令仅在审核模式下创建 CI 策略。 它不会阻止未经授权的二进制文件在主机上运行。 只应在生产环境中使用强制策略。

  2. 将代码完整性策略文件(XML 文件)保存在可以轻松找到的位置。 稍后需要编辑此文件,以强制实施 CI 策略或合并对系统的未来更新所做的更改。

  3. 将 CI 策略应用于参考主机:

    1. 运行以下命令,将计算机配置为使用 CI 策略。 还可以使用组策略System Center Virtual Machine Manager 部署 CI 策略。

      Invoke-CimMethod -Namespace root/Microsoft/Windows/CI -ClassName PS_UpdateAndCompareCIPolicy -MethodName Update -Arguments @{ FilePath = "C:\temp\HW1CodeIntegrity.p7b" }
      
    2. 重启主机以应用策略。

  4. 通过运行典型工作负载来测试代码完整性策略。 这可能包括在计算机上运行 VM、任何结构管理代理、备份代理或故障排除工具。 检查是否存在任何代码完整性冲突,并在必要时更新 CI 策略。

  5. 通过对更新后的 CI 策略 XML 文件运行以下命令,将 CI 策略更改为强制模式。

    Set-RuleOption -FilePath 'C:\temp\HW1CodeIntegrity.xml' -Option 3 -Delete
    
    ConvertFrom-CIPolicy -XmlFilePath 'C:\temp\HW1CodeIntegrity.xml' -BinaryFilePath 'C:\temp\HW1CodeIntegrity_enforced.p7b'
    
  6. 使用以下命令将 CI 策略应用到(具有相同硬件和软件配置的)所有主机:

    Invoke-CimMethod -Namespace root/Microsoft/Windows/CI -ClassName PS_UpdateAndCompareCIPolicy -MethodName Update -Arguments @{ FilePath = "C:\temp\HW1CodeIntegrity.p7b" }
    
    Restart-Computer
    

    注意

    将 CI 策略应用于主机以及更新这些计算机上的任何软件时,请谨慎操作。 任何不符合 CI 策略的内核模式驱动程序都可能会阻止计算机启动。

  7. 向 HGS 管理员提供二进制文件(在此示例中,为 HW1CodeIntegrity_enforced.p7b)。

  8. 在 HGS 域中,将代码完整性策略复制到 HGS 服务器并运行以下命令。

    对于 <PolicyName>,请为 CI 策略指定一个名称,该名称用于描述其应用到的主机类型。 最佳做法是根据计算机的品牌/型号以及在其上运行的任何特殊软件配置进行命名。 对于 <Path>,指定代码完整性策略的路径和文件名。

    Add-HgsAttestationCIPolicy -Path <Path> -Name '<PolicyName>'
    

    注意

    如果你正在使用签名的代码完整性策略,请向 HGS 注册相同策略的未签名副本。 代码完整性策略上的签名用于控制对策略的更新,但不会在主机 TPM 中测量,因此无法由 HGS 证明。

捕获每个唯一硬件类的 TPM 基线

数据中心结构中的每个唯一硬件类都需要 TPM 基线。 再次使用“参考主机”。

  1. 在引用主机上,确保已安装 Hyper-V 角色和 Host Guardian Hyper-V Support 功能。

    警告

    “主机监护 Hyper-V 支持”功能支持基于虚拟化的代码完整性保护,这可能与某些设备不兼容。 强烈建议先在你的实验室中测试此配置,然后再启用此功能。 不这样做可能会导致出现意外故障,包括数据丢失或蓝屏错误(也称为停止错误)。

    Install-WindowsFeature Hyper-V, HostGuardian -IncludeManagementTools -Restart
    
  2. 若要捕获基线策略,请在提升的 Windows PowerShell 控制台中运行以下命令。

    Get-HgsAttestationBaselinePolicy -Path 'HWConfig1.tcglog'
    

    注意

    如果参考主机未启用安全启动、存在 IOMMU、已启用且正在运行基于虚拟化的安全性,或者应用了代码完整性策略,则需要使用 -SkipValidation 标志。 这些验证旨在使你了解在主机上运行受防护的 VM 的最低要求。 使用 -SkipValidation 标志不会更改 cmdlet 的输出;它只会消除错误。

  3. 向 HGS 管理员提供 TPM 基线(TCGlog 文件)。

  4. 在 HGS 域中,将 TCGlog 文件复制到 HGS 服务器并运行以下命令。 通常,你将根据策略所代表的硬件类别来命名策略(例如,“制造商型号修订版”)。

    Add-HgsAttestationTpmPolicy -Path <Filename>.tcglog -Name '<PolicyName>'
    

后续步骤