使用 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 主機

建議您從代表資料中心內每個唯一 Hyper-V 硬體組態類別的「參考主機」,擷取基準和 CI 原則。 從 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 證明。 如果使用 v2 證明建立 TPM 基準和 CI 原則,然後稍後您需要新增沒有 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 廠商不會使用 EKCerts。 您可以在記事本等編輯器中開啟 XML 檔案,並檢查是否有指出找不到 EKCert 的錯誤訊息,以檢查 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 來產生您自己的程式碼完整性原則,則必須決定要使用的規則層級。 建議使用後援至 Hash 的主要 [發行者] 層級,以允許更新大部分數位簽署的軟體,而不需要變更 CI 原則。 您也可以將相同發行者撰寫的新軟體安裝在伺服器上,而不需要變更 CI 原則。 未數位簽署的可執行檔將會進行雜湊處理。 這些檔案的更新會要求您建立新的 CI 原則。 如需了解關於可用 CI 原則規則層級的詳細資訊,請參閱部署程式碼完整性原則:原則規則和檔案規則以及 Cmdlet 說明。

  1. 在參考主機上,產生新的程式碼完整性原則。 下列命令會在發行者層級建立原則,且後援為 Hash。 然後,其會將 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. 提供二進位檔案 (在此範例中為 HW1CodeIntegrity_enforced.p7b) 給 HGS 系統管理員。

  8. 在 HGS 網域中,將程式碼完整性原則複製到 HGS 伺服器,然後執行下列命令。

    針對 <PolicyName>,針對描述其所套用主機類型的 CI 原則指定名稱。 最佳做法是以電腦的品牌/型號,以及電腦上執行的任何特殊軟體組態來命名。 針對 <Path>,指定程式碼完整性原則的路徑和檔案名稱。

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

    注意

    如果您使用已簽署的程式碼完整性原則,請使用 HGS 註冊相同原則的未簽署複本。 程式碼完整性原則上的簽章可用來控制原則的更新,但不會測量到主機 TPM,因此無法由 HGS 證明。

擷取每個唯一硬體類別的 TPM 基準

資料中心網狀架構中每個唯一的硬體類別都需要 TPM 基準。 再次使用「參考主機」。

  1. 在參考主機上,確認已安裝 Hyper-V 角色和主機守護者 Hyper-V 支援功能。

    警告

    主機守護者 Hyper-V 支援功能可實現虛擬化型的程式碼完整性保護,但可能與某些裝置不相容。 我們強烈建議在實驗室中測試此設定,再啟用這項功能。 若無法這麼做,可能會導致非預期的失敗,包括資料遺失或藍色螢幕錯誤 (也稱為停止錯誤)。

    Install-WindowsFeature Hyper-V, HostGuardian -IncludeManagementTools -Restart
    
  2. 若要擷取基準原則,在提升權限的 Windows PowerShell 主控台中執行下列命令。

    Get-HgsAttestationBaselinePolicy -Path 'HWConfig1.tcglog'
    

    注意

    如果參考主機未啟用安全開機、IOMMU 存在、虛擬化型安全性已啟用且執行中,或套用程式碼完整性原則,則必須使用 -SkipValidation 旗標。 這些驗證旨在讓您知道在主機上執行受防護 VM 的最低需求。 使用 -SkipValidation 旗標並不會變更 Cmdlet 的輸出;其只是壓制錯誤。

  3. 將 TPM 基準 (TCGlog 檔案) 提供給 HGS 系統管理員。

  4. 在 HGS 網域中,將 TCGlog 檔案複製到 HGS 伺服器,然後執行下列命令。 一般而言,您會以原則所代表的硬體類別來命名原則 (例如,「製造商型號修訂」)。

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

後續步驟