Verwendung von App-Kontrolle zur Absicherung von PowerShell

In diesem Artikel wird beschrieben, wie Sie eine App Control for Business-Richtlinie einrichten. Sie können die Richtlinie so konfigurieren, dass die Richtlinienregel erzwungen oder überwacht wird. Im Überwachungsmodus ändert sich das PowerShell-Verhalten nicht, die Meldungen mit der Ereignis-ID 16387 werden aber im PowerShellCore/Analytic-Ereignisprotokoll protokolliert. Im Erzwingungsmodus wendet PowerShell die Einschränkungen der Richtlinie an.

In diesem Artikel wird davon ausgegangen, dass Sie einen Testcomputer verwenden, damit Sie das PowerShell-Verhalten unter einer computerweiten App-Steuerungsrichtlinie testen können, bevor Sie die Richtlinie in Ihrer Umgebung bereitstellen.

App-Steuerungsrichtlinien

Eine App-Control-Richtlinie wird in einer XML-Datei beschrieben, die Informationen zu Richtlinienoptionen, zulässigen Dateien und von der Richtlinie erkannten Signaturzertifikaten enthält. Wenn die Richtlinie angewendet wird, dürfen nur genehmigte Dateien geladen und ausgeführt werden. PowerShell blockiert entweder die Ausführung nicht genehmigter Skriptdateien oder führt sie je nach Richtlinienoptionen im ConstrainedLanguage-Modus aus.

Sie erstellen und bearbeiten die App-Steuerelementrichtlinie mithilfe des ConfigCI-Moduls , das in allen unterstützten Windows-Versionen verfügbar ist. Sie können dieses Windows PowerShell-Modul in Windows PowerShell 5.1 oder in PowerShell 7 über die Windows Kompatibilitätsebene verwenden. Es ist einfacher, dieses Modul in Windows PowerShell zu verwenden. Die von Ihnen erstellte Richtlinie kann auf eine beliebige Version von PowerShell angewendet werden.

Schritte zum Erstellen einer App-Kontrollrichtlinie

Zum Testen müssen Sie lediglich eine Standardrichtlinie und ein selbstsigniertes Codesignaturzertifikat erstellen.

  1. Erstellen einer Standardrichtlinie

    New-CIPolicy -Level PcaCertificate -FilePath .\SystemCIPolicy.xml -UserPEs
    

    Mit diesem Befehl wird eine Standardrichtliniendatei mit dem Namen SystemCIPolicy.xml erstellt, die die Ausführung aller von Microsoft-Dateien mit Codesignatur ermöglicht.

    Hinweis

    Das Ausführen dieses Befehls kann bis zu zwei Stunden dauern, da der gesamte Testcomputer gescannt werden muss.

  2. Überwachungsmodus in der Standardrichtlinie deaktivieren

    Eine neue Richtlinie wird immer im Audit-Modus erstellt. Zum Testen der Richtlinienerzwingung müssen Sie den Überwachungsmodus deaktivieren, wenn Sie die Richtlinie anwenden. Bearbeiten Sie die Datei SystemCIPolicy.xml mit einem Text-Editor wie notepad.exe oder Visual Studio Code (VS Code). Kommentieren Sie die Audit mode-Option aus.

    <!--
    <Rule>
      <Option>Enabled:Audit Mode</Option>
    </Rule>
    -->
    
  3. Erstellen eines selbstsignierten Codesignaturzertifikats

    Sie benötigen ein Codesignaturzertifikat, um alle Testbinärdateien oder Skriptdateien zu signieren, die Sie auf Ihrem Testcomputer ausführen möchten. Das New-SelfSignedCertificate wird vom PKI-Modul bereitgestellt. Um optimale Ergebnisse zu erzielen, sollten Sie diesen Befehl in Windows PowerShell 5.1 ausführen.

    $newSelfSignedCertificateSplat = @{
        DnsName = $Env:COMPUTERNAME
        CertStoreLocation = "Cert:\CurrentUser\My\"
        Type = 'CodeSigningCert'
    }
    $cert = New-SelfSignedCertificate @newSelfSignedCertificateSplat
    Export-Certificate -Cert $cert -FilePath C:\certs\signing.cer
    Import-Certificate -FilePath C:\certs\signing.cer -CertStoreLocation "Cert:\CurrentUser\Root\"
    $cert = Get-ChildItem Cert:\CurrentUser\My\ -CodeSigningCert
    
    dir C:\bin\PowerShell\pwsh.exe | Set-AuthenticodeSignature -Certificate $cert
    
  4. Hinzufügen des Codesignaturzertifikats zur Richtlinie

    Verwenden Sie den folgenden Befehl, um der Richtlinie das neue Codesignaturzertifikat hinzuzufügen.

    Add-SignerRule -FilePath .\SystemCIPolicy.xml -CertificatePath C:\certs\signing.cer -User
    
  5. Konvertieren der XML-Richtliniendatei in eine Binärdatei für die Richtlinienerzwingung

    Schließlich müssen Sie die XML-Datei in eine binärdatei konvertieren, die von App Control verwendet wird, um eine Richtlinie anzuwenden.

    ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
    
  6. Anwenden der Richtlinie für die App-Steuerung

    Um die Richtlinie auf Ihren Testcomputer anzuwenden, kopieren Sie die Datei SIPolicy.p7b an den erforderlichen Systemspeicherort, C:\Windows\System32\CodeIntegrity.

    Hinweis

    Sie müssen einige Richtliniendefinitionen in einen Unterordner wie z. B. C:\Windows\System32\CodeIntegrity\CiPolicies kopieren. Weitere Informationen finden Sie unter [Tipps für App-Steuerungsadministratoren und bekannte Probleme][01].

  7. Deaktivieren Sie die App-Kontrollrichtlinie

    Um die Richtlinie zu deaktivieren, benennen Sie die Datei SIPolicy.p7b um. Wenn Sie weitere Tests durchführen müssen, können Sie den Namen wieder ändern, um die Richtlinie erneut zu aktivieren.

    Rename-Item -Path .\SIPolicy.p7b -NewName .\SIPolicy.p7b.off
    

Testen mithilfe der Überwachung der Richtlinie für die App-Steuerung

PowerShell 7.4 hat ein neues Feature zur Unterstützung von App-Steuerelementrichtlinien im Überwachungsmodus hinzugefügt. Im Überwachungsmodus führt PowerShell die nicht vertrauenswürdigen Skripts im ConstrainedLanguage-Modus ohne Fehler aus, protokolliert jedoch Meldungen im Ereignisprotokoll. In den Protokollmeldungen wird beschrieben, welche Einschränkungen gelten, wenn sich die Richtlinie im Erzwingungsmodus befindet.

Anzeigen von Überwachungsereignissen

PowerShell protokolliert Überwachungsereignisse im PowerShellCore/Analytic-Ereignisprotokoll. Das Protokoll ist standardmäßig nicht aktiviert. Um das Protokoll zu aktivieren, öffnen Sie die Windows-Ereignisanzeige, klicken Sie mit der rechten Maustaste auf das PowerShellCore/Analytic-Protokoll, und wählen Sie Protokoll aktivieren aus.

Sie können alternativ auch den folgenden Befehl in einer PowerShell-Sitzung mit erhöhten Rechten ausführen.

wevtutil.exe sl PowerShellCore/Analytic /enabled:true /quiet

Sie können die Ereignisse in der Windows-Ereignisanzeige anzeigen oder das Get-WinEvent-Cmdlet verwenden, um die Ereignisse abzurufen.

Get-WinEvent -LogName PowerShellCore/Analytic -Oldest |
    Where-Object Id -EQ 16387 | Format-List
TimeCreated  : 4/19/2023 10:11:07 AM
ProviderName : PowerShellCore
Id           : 16387
Message      : App Control Audit.

    Title: Method or Property Invocation
    Message: Method or Property 'WriteLine' on type 'System.Console' invocation will not
        be allowed in ConstrainedLanguage mode.
        At C:\scripts\Test1.ps1:3 char:1
        + [System.Console]::WriteLine("pwnd!")
        + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    FullyQualifiedId: MethodOrPropertyInvocationNotAllowed

Die Ereignismeldung enthält die Skriptposition, an der die Einschränkung angewendet wird. Diese Informationen helfen Ihnen zu verstehen, wo Sie Ihr Skript ändern müssen, damit es unter der App-Steuerelementrichtlinie ausgeführt wird.

Wichtig

Nachdem Sie die Überwachungsereignisse überprüft haben, sollten Sie das Analyseprotokoll deaktivieren. Analyseprotokolle wachsen schnell und erfordern große Mengen an Speicherplatz.

Anzeigen von Überwachungsereignissen im PowerShell-Debugger

Wenn Sie die $DebugPreference-Variable für eine interaktive PowerShell-Sitzung auf Break festlegen, unterbricht PowerShell den Befehlszeilenskript-Debugger an der Stelle im Skript, an der das Überwachungsereignis aufgetreten ist. Mit diesem Breakpoint können Sie Ihren Code debuggen und den aktuellen Status des Skripts in Echtzeit überprüfen.

Zusätzliche Konfigurationseinstellungen für PowerShell

Die App-Steuerung unterstützt zusätzliche Konfigurationseinstellungen für PowerShell.

  • BlockScriptOnPolicyFailure: Diese Einstellung blockiert die Ausführung von Skripts, die die Richtlinienanforderungen der App-Steuerung nicht erfüllen. Wenn diese Option aktiviert ist, blockiert die App-Steuerung alle Skripte, die nicht explizit durch die Richtlinie zugelassen sind, anstatt sie im Modus ConstrainedLanguage auszuführen.

    Hinweis

    Diese Einstellung wird von Der App-Steuerung erzwungen und gilt für alle Versionen von PowerShell (powershell.exe und pwsh.exe).

  • FileOnlyEntry: Diese Einstellung verhindert, dass PowerShell mit Argumenten ausgeführt wird, die nicht zur Ausführung einer angegebenen Datei führen. Wenn diese Option aktiviert ist, blockiert App Control die Ausführung von PowerShell-Befehlen, die über die Pipeline, über die Parameter -Command oder -EncodedCommand oder über interaktive Sitzungen übergeben werden, die die direkte Ausführung von Befehlen ermöglichen. Wenn diese Option aktiviert ist, führt PowerShell nur Skripts aus, die mit dem -File Parameter angegeben sind.

    Beispiele für blockierte Ausführungen:

    pwsh
    pwsh -NoExit -File ./file.ps1
    pwsh -Command Get-ChildItem
    "Get-ChildItem" | pwsh -File -
    pwsh -EncodedCommand <base64-string>
    

    Beispiele für zulässige Ausführungsbeispiele:

    pwsh -File ./file.ps1
    pwsh -NoProfile -NonInteractive -File ./file.ps1 arg1 arg2
    

    Hinweis

    Diese Einstellung gilt nur für PowerShell 7.6.6 und neuere Versionen. Wenn Sie diese Einstellung für frühere Versionen konfigurieren, wird appSetting im Hintergrund ignoriert.

Um diese Einstellungen zu verwenden, müssen Sie sie der XML-Datei der App-Steuerelementrichtlinie hinzufügen (SystemCIPolicy.xml). Öffnen Sie die XML-Datei in einem Text-Editor, und fügen Sie den <AppSettings> Abschnitt der Richtlinie hinzu. Das folgende Beispiel zeigt das <AppSettings>-XML, wenn beide Einstellungen aktiviert sind.

<?xml version="1.0" encoding="utf-8"?>
<SiPolicy xmlns="urn:schemas-microsoft-com:sipolicy">

    <!-- Existing policy content -->

    <AppSettings>
        <AppSetting
            AppManifest="Powershell"
            Name="BlockScriptOnPolicyFailure"
            Value="true" />

        <AppSetting
            AppManifest="Powershell"
            Name="FileOnlyEntry"
            Value="true" />
    </AppSettings>

</SiPolicy>

Weiterführende Lektüre