Udostępnij za pośrednictwem


Jak zabezpieczyć program PowerShell przy użyciu kontrolki aplikacji

W tym artykule opisano sposób konfigurowania zasad kontroli aplikacji dla firm . Zasady można skonfigurować tak, aby wymuszały lub przeprowadzały inspekcję reguły zasad. W trybie inspekcji zachowanie programu PowerShell nie zmienia się, ale rejestruje komunikaty o identyfikatorze zdarzenia 16387 w dzienniku zdarzeń PowerShellCore/Analytic . W trybie wymuszania program PowerShell stosuje ograniczenia zasad.

W tym artykule założono, że używasz maszyny testowej, aby można było przetestować zachowanie programu PowerShell w ramach zasad kontroli aplikacji dla całej maszyny przed wdrożeniem zasad w środowisku.

Tworzenie zasad kontroli aplikacji

Zasady kontroli aplikacji są opisane w pliku XML, który zawiera informacje o opcjach zasad, plikach dozwolonych i certyfikatach podpisywania rozpoznawanych przez zasady. Po zastosowaniu zasad tylko zatwierdzone pliki mogą ładować i uruchamiać. Program PowerShell blokuje uruchamianie niezatwierdzonych plików skryptów lub uruchamianie ich w ConstrainedLanguage trybie w zależności od opcji zasad.

Zasady kontroli aplikacji można tworzyć i manipulować nimi przy użyciu modułu ConfigCI , który jest dostępny we wszystkich obsługiwanych wersjach systemu Windows. Ten moduł programu Windows PowerShell może być używany w programie Windows PowerShell 5.1 lub w programie PowerShell 7 za pośrednictwem warstwy zgodności systemu Windows. Łatwiej jest używać tego modułu w programie Windows PowerShell. Utworzone zasady można zastosować do dowolnej wersji programu PowerShell.

Kroki tworzenia zasad kontroli aplikacji

Do testowania wystarczy utworzyć domyślne zasady i certyfikat podpisywania kodu z podpisem własnym.

  1. Tworzenie zasad domyślnych

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

    To polecenie tworzy domyślny plik zasad o nazwie SystemCIPolicy.xml , który umożliwia uruchamianie wszystkich plików podpisanych kodem firmy Microsoft.

    Uwaga

    Uruchomienie tego polecenia może potrwać do dwóch godzin, ponieważ musi skanować całą maszynę testowa.

  2. Wyłącz tryb inspekcji w zasadach domyślnych

    Nowe zasady są zawsze tworzone w Audit trybie. Aby przetestować wymuszanie zasad, należy wyłączyć tryb inspekcji podczas stosowania zasad. SystemCIPolicy.xml Edytuj plik przy użyciu edytora tekstów, takiego jak notepad.exe lub Visual Studio Code (VS Code). Oznacz jako Audit mode komentarz opcję.

    <!--
    <Rule>
      <Option>Enabled:Audit Mode</Option>
    </Rule>
    -->
    
  3. Tworzenie certyfikatu podpisywania kodu z podpisem własnym

    Potrzebujesz certyfikatu podpisywania kodu, aby podpisać wszystkie testowe pliki binarne lub pliki skryptów, które chcesz uruchomić na maszynie testowej. Element New-SelfSignedCertificate jest dostarczany przez moduł PKI . Aby uzyskać najlepsze wyniki, należy uruchomić to polecenie w programie 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. Dodawanie certyfikatu podpisywania kodu do zasad

    Użyj następującego polecenia, aby dodać nowy certyfikat podpisywania kodu do zasad.

    Add-SignerRule -FilePath .\SystemCIPolicy.xml -CertificatePath c:\certs\signing.cer -User
    
  5. Konwertowanie pliku zasad XML na plik binarny wymuszania zasad

    Na koniec należy przekonwertować plik XML na plik binarny używany przez kontrolkę aplikacji, aby zastosować zasady.

    ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
    
  6. Stosowanie zasad kontroli aplikacji

    Aby zastosować zasady do maszyny testowej, skopiuj SIPolicy.p7b plik do wymaganej lokalizacji systemowej, C:\Windows\System32\CodeIntegrity.

    Uwaga

    Niektóre definicje zasad należy skopiować do podfolderu, takiego jak C:\Windows\System32\CodeIntegrity\CiPolicies. Aby uzyskać więcej informacji, zobacz Porady administratora kontroli aplikacji i znane problemy.

  7. Wyłączanie zasad kontroli aplikacji

    Aby wyłączyć zasady, zmień nazwę SIPolicy.p7b pliku. Jeśli musisz wykonać więcej testów, możesz zmienić nazwę z powrotem, aby ponownie włączyć zasady.

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

Testowanie przy użyciu inspekcji zasad kontroli aplikacji

Program PowerShell 7.4 dodał nową funkcję do obsługi zasad kontroli aplikacji w trybie inspekcji . W trybie inspekcji program PowerShell uruchamia niezaufane skrypty w ConstrainedLanguage trybie bez błędów, ale zamiast tego rejestruje komunikaty w dzienniku zdarzeń. Komunikaty dziennika opisują, jakie ograniczenia mają być stosowane, jeśli zasady były w trybie wymuszania .

Wyświetlanie zdarzeń inspekcji

Program PowerShell rejestruje zdarzenia inspekcji w dzienniku zdarzeń powerShellCore/analitycznym . Dziennik nie jest domyślnie włączony. Aby włączyć dziennik, otwórz Podgląd zdarzeń systemu Windows, kliknij prawym przyciskiem myszy dziennik PowerShellCore/Analityczne i wybierz pozycję Włącz dziennik.

Alternatywnie możesz uruchomić następujące polecenie z sesji programu PowerShell z podwyższonym poziomem uprawnień.

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

Zdarzenia można wyświetlić w Podgląd zdarzeń systemu Windows lub użyć Get-WinEvent polecenia cmdlet , aby pobrać zdarzenia.

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

Komunikat zdarzenia zawiera pozycję skryptu, w której zostanie zastosowane ograniczenie. Te informacje ułatwiają zrozumienie, gdzie należy zmienić skrypt, tak aby był uruchamiany w ramach zasad kontroli aplikacji.

Ważne

Po przejrzeniu zdarzeń inspekcji należy wyłączyć dziennik analityczny. Dzienniki analityczne szybko rosną i zużywają duże ilości miejsca na dysku.

Wyświetlanie zdarzeń inspekcji w debugerze programu PowerShell

Jeśli ustawisz zmienną $DebugPreference na Break dla interakcyjnej sesji programu PowerShell, program PowerShell podzieli debuger skryptu wiersza polecenia w bieżącej lokalizacji w skrycie, w którym wystąpiło zdarzenie inspekcji. Punkt przerwania umożliwia debugowanie kodu i sprawdzanie bieżącego stanu skryptu w czasie rzeczywistym.