Så här använder du App Control för att skydda PowerShell

I den här artikeln beskrivs hur du konfigurerar en App Control for Business-policy. Du kan konfigurera principen så att den tillämpar eller granskar efterlevnaden av dess regel. I granskningsläge ändras inte PowerShell-beteendet, men händelse-ID 16387-meddelanden loggas i händelseloggen PowerShellCore/Analytic . I tvingande läge tillämpar PowerShell principens begränsningar.

Den här artikeln förutsätter att du använder en testdator så att du kan testa PowerShell-beteendet under en appkontrollprincip för hela datorn innan du distribuerar principen i din miljö.

Appkontrollprinciper

En appkontrollprincip beskrivs i en XML-fil som innehåller information om principalternativ, tillåtna filer och signeringscertifikat som identifieras av principen. När principen tillämpas kan endast godkända filer läsas in och köras. PowerShell blockerar antingen icke godkända skriptfiler från att köra eller kör dem i ConstrainedLanguage läge, beroende på principalternativ.

Du skapar och ändrar appkontrollprincipen med hjälp av ConfigCI-modulen , som är tillgänglig i alla Windows-versioner som stöds. Du kan använda den här Windows PowerShell-modulen i Windows PowerShell 5.1 eller i PowerShell 7 via kompatibilitetslagret Windows. Det är enklare att använda den här modulen i Windows PowerShell. Principen du skapar kan tillämpas på valfri version av PowerShell.

Steg för att skapa en appkontrollprincip

För testning behöver du bara skapa en standardprincip och ett självsignerat kodsigneringscertifikat.

  1. Skapa en standardpolicy

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

    Det här kommandot skapar en standardprincipfil med namnet SystemCIPolicy.xml som gör att alla Kodsignerade Filer från Microsoft kan köras.

    Kommentar

    Det kan ta upp till två timmar att köra det här kommandot eftersom det måste genomsöka hela testdatorn.

  2. Inaktivera granskningsläge i standardprincip

    En ny policy skapas alltid i läget Audit. Om du vill testa principtillämpningen måste du inaktivera granskningsläget när du tillämpar principen. SystemCIPolicy.xml Redigera filen med hjälp av en textredigerare som notepad.exe eller Visual Studio Code (VS Code). Kommentera ut alternativet Audit mode .

    <!--
    <Rule>
      <Option>Enabled:Audit Mode</Option>
    </Rule>
    -->
    
  3. Skapa ett självsignerat kodsigneringscertifikat

    Du behöver ett kodsigneringscertifikat för att signera eventuella test binärfiler eller skriptfiler som du vill köra på testdatorn. New-SelfSignedCertificate tillhandahålls av PKI-modulen. För bästa resultat bör du köra det här kommandot i Windows PowerShell 5.1.

    $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. Lägg till kodsigneringscertifikatet i principen

    Använd följande kommando för att lägga till det nya kodsigneringscertifikatet i policyn.

    Add-SignerRule -FilePath .\SystemCIPolicy.xml -CertificatePath C:\certs\signing.cer -User
    
  5. Konvertera XML-principfilen till en binär fil för principframtvingande

    Slutligen måste du konvertera XML-filen till en binär fil som används av App Control för att tillämpa en princip.

    ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
    
  6. Tillämpa App Control-principen

    Om du vill tillämpa principen på testdatorn kopierar du SIPolicy.p7b filen till den systemplats som krävs, C:\Windows\System32\CodeIntegrity.

    Kommentar

    Du måste kopiera vissa principdefinitioner till en undermapp, till exempel C:\Windows\System32\CodeIntegrity\CiPolicies. Mer information finns i [Tips för appkontrolladministratör och kända problem][01].

  7. Inaktivera principen för App Control

    Om du vill inaktivera principen byter du namn på SIPolicy.p7b filen. Om du behöver göra fler tester kan du ändra namnet tillbaka för att återaktivera policyn.

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

Testa med appkontrollprincipgranskning

PowerShell 7.4 har lagt till en ny funktion som stöder App Control-principer i granskningsläge . I granskningsläge kör PowerShell de icke betrodda skripten i ConstrainedLanguage-läge utan fel, men loggar i stället meddelanden i händelseloggen. Loggmeddelandena beskriver vilka begränsningar som skulle gälla om principen var i framtvinga läge.

Visa granskningshändelser

PowerShell loggar granskningshändelser till händelseloggen PowerShellCore/Analys . Loggen är inte aktiverad som standard. Om du vill aktivera loggen öppnar du Windows-Loggboken, högerklickar på PowerShellCore/Analysloggen och väljer Aktivera logg.

Du kan också köra följande kommando från en upphöjd PowerShell-session.

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

Du kan visa händelserna i Windows Loggboken eller använda cmdleten Get-WinEvent för att hämta händelserna.

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

Händelsemeddelandet innehåller skriptpositionen där begränsningen skulle tillämpas. Den här informationen hjälper dig att förstå var du behöver ändra skriptet så att det körs under appkontrollprincipen.

Viktigt!

När du har granskat granskningshändelserna bör du inaktivera analysloggen. Analysloggar växer snabbt och förbrukar stora mängder diskutrymme.

Visa granskningshändelser i PowerShell-felsökningsprogrammet

Om du anger variabeln $DebugPreference till Break för en interaktiv PowerShell-session bryter PowerShell in i felsökningsprogrammet för kommandoradsskriptet på den aktuella platsen i skriptet där granskningshändelsen inträffade. Med brytpunkten kan du felsöka koden och kontrollera skriptets aktuella tillstånd i realtid.

Ytterligare konfigurationsinställningar för PowerShell

App Control stöder ytterligare konfigurationsinställningar för PowerShell.

  • BlockScriptOnPolicyFailure: Den här inställningen blockerar körningen av skript som inte uppfyller appkontrollprincipkraven. När den är aktiverad blockerar App Control alla skript som inte uttryckligen tillåts av principen i stället för att köra det i begränsatLanguage-läge .

    Kommentar

    Den här inställningen tillämpas av App Control och gäller för alla versioner av PowerShell (powershell.exe och pwsh.exe).

  • FileOnlyEntry: Den här inställningen förhindrar att PowerShell körs med argument som inte resulterar i körning av en angiven fil. När det är aktiverat blockerar App Control körningen av PowerShell-kommandon som skickas via pipelinen, till parametrarna -Command eller -EncodedCommand eller de interaktiva sessioner som tillåter direkt kommandokörning. När det är aktiverat kör PowerShell endast skript som anges med parametern -File .

    Exempel på blockerade körningar:

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

    Exempel på tillåtna körningar:

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

    Kommentar

    Den här inställningen gäller endast för PowerShell 7.6.6 och senare versioner. Om du konfigurerar den här inställningen för tidigare versioner ignoreras AppSetting tyst.

Om du vill använda de här inställningarna måste du lägga till dem i XML-filen för appkontrollprincip (SystemCIPolicy.xml). Öppna XML-filen i en textredigerare och lägg till <AppSettings>-avsnittet i principyn. I följande exempel visas <AppSettings> XML med båda inställningarna aktiverade.

<?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>

Ytterligare läsning