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.
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.
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 jaknotepad.exe
lub Visual Studio Code (VS Code). Oznacz jakoAudit mode
komentarz opcję.<!-- <Rule> <Option>Enabled:Audit Mode</Option> </Rule> -->
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
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
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
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.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.