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 als Plattformbezeichner oder Endorsement Key EKpub bezeichnet), um zu bestimmen, ob ein bestimmter Host [ ] als "geschützt" autorisiert ist. Dieser Nachweismodus verwendet Messungen des sicheren Startvorgangs und der Codeintegrität, um sicherzustellen, dass sich ein angegebener Hyper-V-Host in einem fehlerfreien Zustand befindet und nur vertrauenswürdigen Code ausgeführt wird. Damit der Nachweis verstehen kann, was ist und nicht fehlerfrei ist, müssen Sie die folgenden Artefakte erfassen:

  1. TPM-Bezeichner (EKpub)

    • Diese Informationen sind für jeden Hyper-V-Host eindeutig.
  2. TPM-Baseline (Startmessungen)

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

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

Es wird empfohlen, die Baseline- und CI-Richtlinie von einem "Referenzhost" zu erfassen, der für jede eindeutige Klasse der Hyper-V-Hardwarekonfiguration in Ihrem Rechenzentrum repräsentativ ist. Ab version 1709 von Windows Server sind ci-Beispielrichtlinien unter C:\Windows\schemas\CodeIntegrity\ExamplePolicies enthalten.

Richtlinien für den Nachweis mit Versionsversion

Windows Server 2019 führt eine neue Nachweismethode namens v2-Nachweis ein, bei der ein TPM-Zertifikat vorhanden sein muss, um den EKPub dem HGS hinzuzufügen. Mit der in Windows Server 2016 verwendeten v1-Nachweismethode konnten Sie diese Sicherheitsüberprüfung überschreiben, indem Sie das Flag -Force angeben, wenn Sie Add-HgsAttestationTpmHost oder andere TPM-Nachweis-Cmdlets ausführen, um die Artefakte zu erfassen. Ab Windows Server 2019 wird standardmäßig der v2-Nachweis verwendet, und Sie müssen das Flag -PolicyVersion v1 angeben, wenn Sie Add-HgsAttestationTpmHost ausführen, wenn Sie ein TPM ohne Zertifikat registrieren müssen. Das Flag -Force funktioniert nicht mit v2-Nachweis.

Ein Host kann nur bestätigen, wenn alle Artefakte (EKPub + TPM-Baseline + CI-Richtlinie) dieselbe Version des Nachweises verwenden. Der V2-Nachweis wird zuerst versucht. Wenn dies fehlschlägt, wird der v1-Nachweis verwendet. Wenn Sie also einen TPM-Bezeichner mit v1-Nachweis registrieren müssen, müssen Sie auch das Flag -PolicyVersion v1 angeben, um den v1-Nachweis zu verwenden, wenn Sie die TPM-Baseline erfassen und die CI-Richtlinie erstellen. Wenn die TPM-Baseline und die CI-Richtlinie mit dem v2-Nachweis erstellt wurden und Sie später einen geschützten Host ohne TPM-Zertifikat hinzufügen müssen, müssen Sie jedes Artefakt mit dem Flag -PolicyVersion v1 neu erstellen.

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

  1. Stellen Sie in der Fabricdomäne sicher, dass das TPM auf jedem Host einsatzbereit ist. Das heißt, das TPM wird initialisiert und der Besitz erworben. Sie können den Status des TPM überprüfen, indem Sie die TPM-Verwaltungskonsole (tpm.msc) öffnen oder Get-Tpm in einem Fenster mit erhöhten Windows PowerShell ausführen. Wenn Sich Ihr TPM nicht im Status Bereit befindet, müssen Sie es initialisieren und den Besitz festlegen. Dies kann in der TPM-Verwaltungskonsole oder durch Ausführen von Initialize-Tpm erfolgen.

  2. Führen Sie auf jedem geschützten Host den folgenden Befehl in einer Konsole mit Windows PowerShell, um den EKpub zu erhalten. Ersetzen Sie für den eindeutigen Hostnamen durch etwas, das zur Identifizierung dieses Hosts geeignet ist. Dies kann sein Hostname oder der Name sein, der von einem Fabric-Inventurdienst verwendet wird <HostName> (falls verfügbar). 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 vorherigen Schritte für jeden Host, der zu einem sicheren Host wird, und geben Sie jeder XML-Datei einen eindeutigen Namen.

  4. Stellen Sie die resultierenden XML-Dateien für den HGS-Administrator zur Verfügung.

  5. Öffnen Sie in der Domäne HGS eine Konsole mit Windows PowerShell auf einem HGS-Server, 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 zu einem nicht vertrauenswürdigen Endorsement Key Certificate (EKCert) ein Fehler auftritt, stellen Sie sicher, dass die vertrauenswürdigen TPM-Stammzertifikate dem HGS-Knoten hinzugefügt wurden. Darüber hinaus verwenden einige TPM-Anbieter keine EKCerts. Sie können überprüfen, ob ein EKCert fehlt, indem Sie die XML-Datei in einem Editor wie Editor öffnen und nach einer Fehlermeldung überprüfen, die angibt, dass kein EKCert gefunden wurde. Wenn dies der Fall ist und Sie davon vertrauen, dass das TPM auf Ihrem Computer authentifiziert ist, können Sie den -Parameter verwenden, um den Hostbezeichner dem -Force HGS hinzuzufügen. In Windows Server 2019 müssen Sie auch den -PolicyVersion v1 -Parameter verwenden, wenn Sie -Force verwenden. Dadurch wird eine Richtlinie erstellt, die mit dem verhaltenden Windows Server 2016 konsistent ist, und sie muss auch beim Registrieren der CI-Richtlinie und der -PolicyVersion v1 TPM-Baseline verwendet werden.

Erstellen und Anwenden einer Codeintegritätsrichtlinie

Eine Codeintegritätsrichtlinie hilft sicherzustellen, dass nur die ausführbaren Dateien, denen Sie vertrauen, 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, um abgeschirmte VMs im TPM-Modus ausführen zu können. Sie geben die genauen Codeintegritätsrichtlinien an, die Sie vertrauen, indem Sie sie dem HGS hinzufügen. Codeintegritätsrichtlinien können so konfiguriert werden, dass sie die Richtlinie erzwingen, Software blockieren, die nicht der Richtlinie entsprechen, oder einfach überwachen (ein Ereignis protokollieren, wenn software nicht in der Richtlinie definiert wird ausgeführt wird).

Ab Windows Server Version 1709 sind Beispielcodeintegritätsrichtlinien in Windows unter C:\Windows\schemas\CodeIntegrity\ExamplePolicies enthalten. Es werden zwei Richtlinien für Windows Server empfohlen:

  • AllowMicrosoft: Lässt alle von Microsoft signierten Dateien zu. Diese Richtlinie wird für Serveranwendungen wie SQL oder Exchange oder , wenn der Server von von Microsoft veröffentlichten Agents überwacht wird.
  • DefaultWindows_Enforced: Lässt nur Dateien zu, die in Windows enthalten sind, und lässt keine anderen von Microsoft veröffentlichten Anwendungen zu, z. B. Office. Diese Richtlinie wird für Server empfohlen, auf denen nur integrierte Serverrollen und -features wie Hyper-V ausgeführt werden.

Es wird empfohlen, zuerst die CI-Richtlinie im Überwachungsmodus (Protokollierung) zu erstellen, um zu prüfen, ob etwas fehlt, und dann die Richtlinie für Hostproduktionsworkloads zu erzwingen.

Wenn Sie das Cmdlet New-CIPolicy verwenden, um Ihre eigene Codeintegritätsrichtlinie zu generieren, müssen Sie die zu verwendenden Regelebenen festlegen. Es wird empfohlen, eine primäre Ebene Publisher Fallback auf Hash zu verwenden, wodurch die meisten digital signierten Software aktualisiert werden können, ohne die CI-Richtlinie zu ändern. Neue Software, die vom gleichen Herausgeber geschrieben wurde, kann auch auf dem Server installiert werden, ohne die CI-Richtlinie zu ändern. Ausführbare Dateien, die nicht digital signiert sind, werden gehasht. Für Updates dieser Dateien müssen Sie eine neue CI-Richtlinie erstellen. Weitere Informationen zu den verfügbaren CI-Richtlinienregelebenen finden Sie unter Bereitstellen von Codeintegritätsrichtlinien: Richtlinienregeln und Dateiregeln und Cmdlet-Hilfe.

  1. Generieren Sie auf dem Referenzhost eine neue Codeintegritätsrichtlinie. Mit den folgenden Befehlen wird eine Richtlinie auf Publisher-Ebene mit Fallback auf Hash erstellt. Anschließend wird die XML-Datei in das Binärdateiformat konvertiert, Windows und HGS die CI-Richtlinie anwenden und messen müssen.

    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 obige Befehl erstellt eine CI-Richtlinie nur im Überwachungsmodus. Die Ausführung nicht autorisierter Binärdateien auf dem Host wird nicht blockiert. Sie sollten erzwungene Richtlinien nur in der Produktion verwenden.

  2. Behalten Sie die Richtliniendatei für die Codeintegrität (XML-Datei) bei, in der Sie sie leicht finden können. Sie müssen diese Datei später bearbeiten, um die CI-Richtlinie zu erzwingen oder Änderungen aus zukünftigen Systemupdates zusammenführungsen.

  3. Wenden Sie die CI-Richtlinie auf Ihren Referenzhost an:

    1. Führen Sie den folgenden Befehl aus, um den Computer für die Verwendung Ihrer CI-Richtlinie zu konfigurieren. Sie können die CI-Richtlinie auch mit Gruppenrichtlinie oder System Center Virtual Machine Manager.

      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. Testen Sie die Codeintegritätsrichtlinie, indem Sie eine typische Workload ausführen. Dies kann die Ausführung von VMs, Fabric-Verwaltungs-Agents, Sicherungs-Agents oder Problembehandlungstools auf dem Computer umfassen. Überprüfen Sie, ob Verstöße gegen die Codeintegrität bestehen, und aktualisieren Sie bei Bedarf Ihre CI-Richtlinie.

  5. Ändern Sie Ihre CI-Richtlinie in den erzwungenen Modus, indem Sie die folgenden Befehle für Ihre aktualisierte CI-Richtlinien-XML-Datei ausführen.

    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 die CI-Richtlinie mit den folgenden Befehlen auf alle Hosts (mit identischer Hardware- und Softwarekonfiguration) an:

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

    Hinweis

    Seien Sie vorsichtig, wenn Sie CI-Richtlinien auf Hosts anwenden und Software auf diesen Computern aktualisieren. Alle Kernelmodustreiber, die nicht mit der CI-Richtlinie kompatibel sind, können das Starten des Computers verhindern.

  7. Stellen Sie die Binärdatei (in diesem Beispiel HW1CodeIntegrity _ enforced.p7b) für den HGS-Administrator zur Verfügung.

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

    Geben <PolicyName> Sie für einen Namen für die CI-Richtlinie an, der den Typ des Hosts beschreibt, für den er gilt. Eine bewährte Methode besteht im Benennen nach dem Make/Model Ihres Computers und nach jeder speziellen Softwarekonfiguration, die darauf ausgeführt wird.
    Geben <Path> Sie für den Pfad und den Dateinamen der Codeintegritätsrichtlinie an.

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

    Hinweis

    Wenn Sie eine Richtlinie für die Integrität signierten Codes verwenden, registrieren Sie eine nicht signierte Kopie derselben Richtlinie beim HGS. Die Signatur für Codeintegritätsrichtlinien wird verwendet, um Aktualisierungen der Richtlinie zu steuern, wird jedoch nicht im Host-TPM gemessen und kann daher nicht vom HGS bestätigt werden.

    Hinweis

    Wenn Sie eine Richtlinie für die Integrität signierten Codes verwenden, registrieren Sie eine nicht signierte Kopie derselben Richtlinie beim HGS. Die Signatur für Codeintegritätsrichtlinien wird verwendet, um Aktualisierungen der Richtlinie zu steuern, wird jedoch nicht im Host-TPM gemessen und kann daher nicht vom HGS bestätigt werden.

Erfassen der TPM-Baseline für jede eindeutige Hardwareklasse

Für jede eindeutige Hardwareklasse in Ihrem Rechenzentrumsf fabric ist eine TPM-Baseline erforderlich. Verwenden Sie erneut einen "Verweishost".

  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 Hyper-V-Supportfeature des Host-Wächters ermöglicht den virtualisierungsbasierten Schutz der Codeintegrität, die mit einigen Geräten möglicherweise nicht kompatibel ist. Es wird dringend empfohlen, diese Konfiguration in Ihrem Lab zu testen, bevor Sie dieses 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 Baselinerichtlinie zu erfassen, führen Sie den folgenden Befehl in einer Konsole mit Windows PowerShell aus.

    Get-HgsAttestationBaselinePolicy -Path 'HWConfig1.tcglog'
    

    Hinweis

    Sie müssen das Flag -SkipValidation verwenden, wenn für den Referenzhost kein sicherer Start aktiviert ist, keine IOMMU vorhanden ist, virtualisierungsbasierte Sicherheit aktiviert und ausgeführt wird oder eine Codeintegritätsrichtlinie angewendet wurde. Diese Überprüfungen sollen Sie über die Mindestanforderungen für die Ausführung eines abgeschirmten virtuellen Computers auf dem Host auf dem Host auf dem Laufenden halten. Die Verwendung des Flags -SkipValidation ändert nicht die Ausgabe des Cmdlets. Die Fehler werden lediglich stillschweigend angezeigt.

  3. Geben Sie die TPM-Baseline (TCGlog-Datei) für den HGS-Administrator an.

  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 benennen Sie die Richtlinie nach der Hardwareklasse, die sie darstellt (z. B. "Manufacturer Model Revision").

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

Nächster Schritt