Autorisieren von überwachten Hosts mithilfe eines TPM-basierten Nachweises

Gilt für: Windows Server 2022, Windows Server 2019, Windows Server 2016

Der TPM-Modus verwendet einen TPM-Bezeichner (auch Plattformbezeichner oder Endorsement Key [EKpub] genannt), um zu ermitteln, ob ein bestimmter Host als „geschützt“ autorisiert wird. Dieser Nachweismodus stellt mit dem „Sicheren Start“ und Codeintegritätsmessungen sicher, dass ein Hyper-V-Host einen fehlerfreien Status aufweist und nur vertrauenswürdigen Code ausführt. Damit der Nachweis weiß, was fehlerfrei ist und was nicht, müssen Sie die folgenden Artefakte erfassen:

  1. TPM-Bezeichner (EKpub)

    • Er ist für jeden Hyper-V-Host eindeutig.
  2. TPM-Baseline (Startmessungen)

    • Dies gilt für alle Hyper-V-Hosts, die auf der selben Hardwareklasse ausgeführt werden.
  3. Codeintegritätsrichtlinie (eine Positivliste der zulässigen Binärdateien)

    • Dies gilt für alle Hyper-V-Hosts, die dieselbe Hardware und Software verwenden.

Wir empfehlen, die Baseline und Codeintegritätsrichtlinie eines „Referenzhosts“ zu erfassen, der repräsentativ für jede Klasse der Hyper-V-Konfiguration in Ihrem Rechenzentrum ist. Ab Windows Server Version 1709 sind Beispiele für Codeintegritätsrichtlinien im Verzeichnis C:\\Windows\schemas\CodeIntegrity\ExamplePolicies enthalten.

Richtlinien für Nachweise mit Versionsangaben

Mit Windows Server 2019 wurde eine neue Nachweismethode namens v2-Nachweis eingeführt. Hier muss ein TPM-Zertifikat vorliegen, damit der EKpub zum HGS hinzugefügt werden kann. Bei der in Windows Server 2016 genutzten v1-Nachweismethode war es möglich, durch Angabe des Parameters -Force beim Ausführen von Add-HgsAttestationTpmHost oder anderen TPM-Cmdlets zum Erfassen der Artefakte diese Sicherheitsüberprüfung zu überschreiben. Ab Windows Server 2019 wird standardmäßig der v2-Nachweis verwendet und Sie müssen beim Ausführen von Add-HgsAttestationTpmHost den Parameter -PolicyVersion v1 angeben, wenn Sie ein TPM ohne Zertifikat registrieren müssen. Der Parameter -Force funktioniert beim v2-Nachweis nicht.

Ein Nachweis durch den Host ist nur möglich, wenn alle Artefakte (EKpub und TPM-Baseline und Codeintegritätsrichtlinie) dieselbe Nachweisversion verwenden. Es wird zuerst versucht, den v2-Nachweis durchzuführen. Wenn dies fehlschlägt, wird der v1-Nachweis verwendet. Wenn Sie also einen TPM-Bezeichner mit dem v1-Nachweis registrieren, müssen Sie auch den Parameter -PolicyVersion v1 angeben, um beim Erfassen der TPM-Baseline und beim Erstellen der Codeintegritätsrichtlinie den v1-Nachweis zu verwenden. Wenn die TPM-Baseline und die Codeintegritätsrichtlinie mit dem v2-Nachweis erstellt wurden und Sie zu einem späteren Zeitpunkt einen geschützten Host ohne TPM-Zertifikat hinzufügen, müssen Sie jedes Artefakt mit dem Parameter -PolicyVersion v1 erneut erstellen.

Erfassen des TPM-Bezeichners (Plattformbezeichner oder EKpub) für jeden Host

  1. Überprüfen Sie in der Fabric-Domäne, ob das TPM auf jedem Host einsatzbereit ist – also ob das TPM initialisiert und der Besitzer festgelegt wurde. Um den Status des TPM zu überprüfen, öffnen Sie die TPM-Verwaltungskonsole (tpm.msc) oder führen Sie in einem Windows PowerShell-Fenster mit erhöhten Rechten Get-Tpm aus. Wenn Ihr TPM nicht den Status Ready aufweist, müssen Sie es initialisieren und seinen Besitzer festlegen. Das können Sie entweder in der TPM-Verwaltungskonsole oder mit dem Befehl Initialize-Tpm tun.

  2. Führen Sie auf jedem geschützten Host den folgenden Befehl in einem Windows PowerShell-Fenster mit erhöhten Rechten aus, um seinen EKpub abzurufen. Ersetzen Sie für <HostName> den eindeutigen Hostnamen durch einen geeigneten Namen, mit dem sich dieser Host leicht identifizieren lässt. Das kann sein Hostname oder der Name sein, der von einem Fabric-Bestandsdienst verwendet wird (falls vorhanden). Geben Sie der Einfachheit halber der Ausgabedatei den Namen des Hosts.

    (Get-PlatformIdentifier -Name '<HostName>').InnerXml | Out-file <Path><HostName>.xml -Encoding UTF8
    
  3. Wiederholen Sie die genannten Schritte für jeden Host, der ein geschützter Host werden soll. Achten Sie darauf, dass jede XML-Datei einen eindeutigen Namen erhält.

  4. Stellen Sie die ausgegebenen XML-Dateien dem HGS-Administrator bereit.

  5. Öffnen Sie in der HGS-Domäne auf einem HGS-Server eine Windows PowerShell-Konsole mit erhöhten Rechten, und führen Sie den folgenden Befehl aus. Wiederholen Sie den Befehl für jede der XML-Dateien.

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

    Hinweis

    Wenn beim Hinzufügen eines TPM-Bezeichners ein Fehler bezüglich eines nicht vertrauenswürdigen Endorsement Key-Zertifikats (EKCert) auftritt, vergewissern Sie sich, dass die vertrauenswürdigen TPM-Stammzertifikate zum HGS-Knoten hinzugefügt wurden. Darüber hinaus verwenden einige TPM-Anbieter EKCerts nicht. Sie können überprüfen, ob ein EKCert fehlt, indem Sie die XML-Datei in einem Editor wie Notepad öffnen und nach einer Fehlermeldung suchen, die besagt, dass kein EKCert gefunden wurde. Wenn dies der Fall ist und Sie der Authentizität des TPMs auf Ihrem Rechner vertrauen, können Sie mit dem Parameter -Force den Hostbezeichner zum HGS hinzufügen. In Windows Server 2019 müssen Sie auch den Parameter -PolicyVersion v1 angeben, wenn Sie -Force verwenden. Dadurch wird eine Richtlinie erstellt, die mit dem Verhalten von Windows Server 2016 konsistent ist, und erfordert, dass Sie beim Registrieren der Codeintegritätsrichtlinie und der TPM-Baseline -PolicyVersion v1 verwenden.

Erstellen und Anwenden einer Codeintegritätsrichtlinie

Mit einer Codeintegritätsrichtlinie können Sie sicherstellen, dass nur vertrauenswürdige ausführbare Dateien auf einem Host ausgeführt werden dürfen. Schadsoftware und andere ausführbare Dateien, die nicht als vertrauenswürdig gelten, können nicht ausgeführt werden.

Auf jeden geschützten Host muss eine Codeintegritätsrichtlinie angewendet werden, damit er abgeschirmte VMs im TPM-Modus ausführen kann. Die vertrauenswürdigen Codeintegritätsrichtlinien geben Sie an, indem Sie sie zum HGS hinzufügen. Sie können Codeintegritätsrichtlinien so konfigurieren, dass sie die Richtlinie erzwingen und jede Software sperren, die nicht der Richtlinie entspricht, oder lediglich eine Überwachung vornehmen (und ein Ereignis protokollieren, wenn Software ausgeführt wird, die nicht in der Richtlinie definiert ist).

Ab Windows Server Version 1709 sind Beispiele für Codeintegritätsrichtlinien im Verzeichnis C:\\Windows\schemas\CodeIntegrity\ExamplePolicies enthalten. Für Windows Server werden zwei Richtlinien empfohlen:

  • AllowMicrosoft: Lässt alle Dateien zu, die von Microsoft signiert wurden. Diese Richtlinie wird für Serveranwendungen wie SQL oder Exchange und Szenarien empfohlen, in denen der Server von Agenten überwacht wird, die von Microsoft veröffentlicht wurden.
  • DefaultWindows_Enforced: Lässt nur Dateien zu, die in Windows ausgeliefert werden, und lässt keine anderen von Microsoft veröffentlichten Anwendungen wie Office zu. Diese Richtlinie wird für Server empfohlen, auf denen nur integrierte Serverrollen und Funktionen wie Hyper-V ausgeführt werden.

Es wird empfohlen, die Codeintegritätsrichtlinie zunächst im Überwachungsmodus (Protokollierungsmodus) zu erstellen, um zu ermitteln, ob etwas fehlt, und anschließend die Richtlinie für Host-Produktionsworkloads zu erzwingen.

Wenn Sie mit dem Cmdlet New-CIPolicy eine eigene Codeintegritätsrichtlinie erstellen, müssen Sie festlegen, welche Regelebenen verwendet werden sollen. Wir empfehlen, als primäre Ebene Publisher und als Fallback Hash zu verwenden. Mit diesen Einstellungen können Sie fast jede digital signierte Software aktualisieren, ohne die Codeintegritätsrichtlinie ändern zu müssen. Neue Software vom selben Herausgeber kann ebenfalls auf dem Server installiert werden, ohne dass die Richtlinie geändert werden muss. Ausführbare Dateien, die nicht digital signiert sind, werden gehasht. Um diese Dateien zu aktualisieren, müssen Sie eine neue Codeintegritätsrichtlinie erstellen. Weitere Informationen zu den verfügbaren Regelebenen für Codeintegritätsrichtlinien finden Sie unter Bereitstellen der Windows Defender-Anwendungssteuerungsrichtlinien und in der Cmdlet-Hilfe.

  1. Erstellen Sie auf dem Referenzhost eine neue Codeintegritätsrichtlinie. Die folgenden Befehle erstellen eine Richtlinie auf der Ebene Publisher mit einem Fallback auf Hash. Anschließend wird die XML-Datei in das Binärdateiformat umgewandelt, das Windows und der HGS zum Anwenden bzw. Messen der Codeintegritätsrichtlinie benötigen.

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

    Hinweis

    Der oben gezeigte Befehl erstellt die Codeintegritätsrichtlinie nur im Überwachungsmodus. Er verhindert nicht, dass nicht autorisierte Binärdateien auf dem Host ausgeführt werden. In der Produktion sollten Sie nur erzwungene Richtlinien einsetzen.

  2. Speichern Sie die Datei der Codeintegritätsrichtlinie (XML-Datei) an einem Ort, wo sie leicht auffindbar ist. Sie müssen die Datei später bearbeiten, wenn Sie die Codeintegritätsrichtlinie erzwingen oder Änderungen bei zukünftigen Systemupdates vornehmen müssen.

  3. Wenden Sie die Codeintegritätsrichtlinie auf den Referenzhost an:

    1. Mit dem folgenden Befehl legen Sie fest, dass der Rechner die Codeintegritätsrichtlinie anwendet. Sie können die Codeintegritätsrichtlinie auch mit einer Gruppenrichtlinie oder dem System Center Virtual Machine Manager bereitstellen.

      Invoke-CimMethod -Namespace root/Microsoft/Windows/CI -ClassName PS_UpdateAndCompareCIPolicy -MethodName Update -Arguments @{ FilePath = "C:\temp\HW1CodeIntegrity.p7b" }
      
    2. Starten Sie den Host neu, um die Richtlinie anzuwenden.

  4. Zum Testen der Codeintegritätsrichtlinie können Sie einen typischen Workload ausführen, also beispielsweise VMs, Fabric-Verwaltungsagenten, Sicherungsagenten oder Tools für die Problembehandlung auf dem Computer ausführen. Überprüfen Sie, ob es Verstöße gegen die Codeintegrität gibt, und aktualisieren Sie bei Bedarf die Codeintegritätsrichtlinie.

  5. Führen Sie die folgenden Befehle für die aktualisierte XML-Datei der Codeintegritätsrichtlinie aus, um den erzwungenen Modus für die Richtlinie zu aktivieren.

    Set-RuleOption -FilePath 'C:\temp\HW1CodeIntegrity.xml' -Option 3 -Delete
    
    ConvertFrom-CIPolicy -XmlFilePath 'C:\temp\HW1CodeIntegrity.xml' -BinaryFilePath 'C:\temp\HW1CodeIntegrity_enforced.p7b'
    
  6. Wenden Sie mit den folgenden Befehlen die Codeintegritätsrichtlinie auf all Ihre Hosts an (mit identischer Hardware- und Softwarekonfiguration):

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

    Hinweis

    Gehen Sie mit Bedacht vor, wenn Sie Codeintegritätsrichtlinien auf Hosts anwenden und Software auf diesen Computern aktualisieren. Kernelmodustreiber, die nicht den Vorgaben der Codeintegritätsrichtlinie entsprechen, können verhindern, dass der Computer gestartet wird.

  7. Stellen Sie dem HGS-Administrator die Binärdatei (in diesem Beispiel: HW1CodeIntegrity_enforced.p7b) bereit.

  8. Kopieren Sie in der HGS-Domäne die Codeintegritätsrichtlinie auf den HGS-Server, und führen Sie den folgenden Befehl aus.

    Geben Sie für <PolicyName> einen Namen für die CI-Richtlinie an, der den Typ des Hosts beschreibt, für den sie gilt. Es empfiehlt sich, die Datei nach der Marke bzw. dem Modell Ihres Computers und jeglicher spezieller Softwarekonfiguration zu benennen, die darauf ausgeführt wird. Geben Sie für <Path> den Pfad und den Dateinamen der Codeintegritätsrichtlinie an.

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

    Hinweis

    Wenn Sie eine signierte Codeintegritätsrichtlinie verwenden, registrieren Sie eine nicht signierte Kopie derselben Richtlinie bei HGS. Die Signatur für Codeintegritätsrichtlinien wird verwendet, um Updates für die Richtlinie zu steuern, wird aber nicht im Host-TPM gemessen und kann daher nicht von HGS nachgewiesen werden.

Erfassen der TPM-Baseline für jede eindeutige Hardwareklasse

Für jede eindeutige Hardwareklasse in Ihrer Rechenzentrums-Fabric ist eine TPM-Baseline erforderlich. Verwenden Sie wieder einen „Referenzhost“.

  1. Überprüfen Sie auf dem Referenzhost, ob die Rolle Hyper-V und das Feature Hyper-V-Unterstützung für die Host-Überwachung installiert sind.

    Warnung

    Das Feature Hyper-V-Unterstützung in der Host-Überwachung ermöglicht einen auf Virtualisierung basierenden Schutz der Code-Integrität, der mit einigen Geräten nicht kompatibel sein kann. Wir empfehlen dringend, diese Konfiguration in Ihrem Lab zu testen, bevor Sie diese Feature aktivieren. Andernfalls kann es zu unerwarteten Fehlern und sogar zu Datenverlusten oder zu einem Bluescreen (STOP-Fehler) kommen.

    Install-WindowsFeature Hyper-V, HostGuardian -IncludeManagementTools -Restart
    
  2. Um die Baseline-Richtlinie zu erfassen, führen Sie in einer Windows PowerShell-Konsole mit erhöhten Rechten den folgenden Befehl aus:

    Get-HgsAttestationBaselinePolicy -Path 'HWConfig1.tcglog'
    

    Hinweis

    Wenn auf dem Referenzhost „Sicherer Start“ nicht aktiviert ist, eine IOMMU vorhanden ist, virtualisierungsbasierte Sicherheit aktiviert ist und ausgeführt wird oder eine Codeintegritätsrichtlinie angewendet wurde, müssen Sie den Parameter -SkipValidation verwenden. Diese Überprüfungen sollen dazu dienen, Sie auf die Mindestanforderungen für das Ausführen einer abgeschirmten VM auf dem Host aufmerksam zu machen. Die Verwendung des Parameters -SkipValidation ändert die Ausgabe des Cmdlets nicht, er unterdrückt nur Fehlermeldungen.

  3. Stellen Sie dem HGS-Administrator die TPM-Baseline (TCGlog-Datei) bereit.

  4. Kopieren Sie in der HGS-Domäne die TCGlog-Datei auf einen HGS-Server, und führen Sie den folgenden Befehl aus. In der Regel wird die Richtlinie nach der Art der Hardware benannt, für die sie steht (z. B. „Manufacturer Model Revision“).

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

Nächster Schritt