Inspekcja i raportowanie w usłudze JEA
Po wdrożeniu narzędzia JEA należy regularnie przeprowadzać inspekcję konfiguracji serwera JEA. Inspekcja pomaga ocenić, czy prawidłowe osoby mają dostęp do punktu końcowego JEA, a ich przypisane role są nadal odpowiednie.
Znajdowanie zarejestrowanych sesji JEA na maszynie
Aby sprawdzić, które sesje JEA są zarejestrowane na maszynie, użyj polecenia cmdlet Get-PSSessionConfiguration .
# Filter for sessions that are configured as 'RestrictedRemoteServer' to
# find JEA-like session configurations
Get-PSSessionConfiguration | Where-Object { $_.SessionType -eq 'RestrictedRemoteServer' }
Name : JEAMaintenance
PSVersion : 5.1
StartupScript :
RunAsUser :
Permission : CONTOSO\JEA_DNS_ADMINS AccessAllowed, CONTOSO\JEA_DNS_OPERATORS AccessAllowed,
CONTOSO\JEA_DNS_AUDITORS AccessAllowed
Obowiązujące prawa dla punktu końcowego są wymienione we właściwości Uprawnienie . Ci użytkownicy mają prawo nawiązać połączenie z punktem końcowym JEA. Jednak role i polecenia, do których mają dostęp, są określane przez właściwość RoleDefinitions w pliku konfiguracji sesji, który został użyty do zarejestrowania punktu końcowego. Rozwiń właściwość RoleDefinitions, aby ocenić mapowania ról w zarejestrowanym punkcie końcowym JEA.
# Get the desired session configuration
$jea = Get-PSSessionConfiguration -Name 'JEAMaintenance'
# Enumerate users/groups and which roles they have access to
$jea.RoleDefinitions.GetEnumerator() | Select-Object Name, @{
Name = 'Role Capabilities'
Expression = { $_.Value.RoleCapabilities }
}
Znajdowanie dostępnych funkcji roli na maszynie
JeA pobiera funkcje roli z .psrc
plików przechowywanych w folderze RoleCapabilities wewnątrz modułu programu PowerShell. Poniższa funkcja znajduje wszystkie funkcje roli dostępne na komputerze.
function Find-LocalRoleCapability {
$results = @()
# Find modules with a "RoleCapabilities" subfolder and add any PSRC files to the result set
Get-Module -ListAvailable | ForEach-Object {
$psrcpath = Join-Path -Path $_.ModuleBase -ChildPath 'RoleCapabilities'
if (Test-Path $psrcpath) {
$results += Get-ChildItem -Path $psrcpath -Filter *.psrc
}
}
# Format the results nicely to make it easier to read
$results | Select-Object @{ Name = 'Name'; Expression = { $_.Name.TrimEnd('.psrc') }}, @{
Name = 'Path'; Expression = { $_.FullName }
} | Sort-Object Name
}
Uwaga
Kolejność wyników z tej funkcji nie musi być kolejnością, w jakiej zostaną wybrane funkcje roli, jeśli wiele funkcji roli ma taką samą nazwę.
Sprawdzanie obowiązujących praw dla określonego użytkownika
Polecenie cmdlet Get-PSSessionCapability wylicza wszystkie polecenia dostępne w punkcie końcowym JEA na podstawie członkostwa w grupach użytkownika. Dane wyjściowe polecenia Get-PSSessionCapability
są identyczne z danymi określonego użytkownika uruchomionego Get-Command -CommandType All
w sesji JEA.
Get-PSSessionCapability -ConfigurationName 'JEAMaintenance' -Username 'CONTOSO\Alice'
Jeśli użytkownicy nie są stałymi członkami grup, które przyznałyby im dodatkowe prawa JEA, to polecenie cmdlet może nie odzwierciedlać tych dodatkowych uprawnień. Dzieje się tak w przypadku korzystania z uprzywilejowanych systemów zarządzania dostępem just in time, aby umożliwić użytkownikom tymczasowe należenie do grupy zabezpieczeń. Dokładnie oceń mapowanie użytkowników na role i możliwości, aby upewnić się, że użytkownicy uzyskują tylko poziom dostępu potrzebny do pomyślnego wykonywania zadań.
Dzienniki zdarzeń programu PowerShell
Jeśli włączono rejestrowanie bloków modułu lub skryptu w systemie, zdarzenia są widoczne w dziennikach zdarzeń systemu Windows dla każdego polecenia, które użytkownik uruchamia w sesji JEA. Aby znaleźć te zdarzenia, otwórz dziennik zdarzeń Microsoft-Windows-PowerShell/Operational i poszukaj zdarzeń o identyfikatorze zdarzenia 4104.
Każdy wpis dziennika zdarzeń zawiera informacje o sesji, w której uruchomiono polecenie. W przypadku sesji JEA zdarzenie zawiera informacje o Połączenie edUser i RunAsUser. Połączenie edUser jest rzeczywistym użytkownikiem, który utworzył sesję JEA. RunAsUser to konto JEA używane do wykonywania polecenia.
Dzienniki zdarzeń aplikacji pokazują zmiany wprowadzane przez użytkownika RunAsUser. Dlatego włączenie rejestrowania modułu i skryptu jest wymagane do śledzenia określonego wywołania polecenia z powrotem do Połączenie edUser.
Dzienniki zdarzeń aplikacji
Polecenia uruchamiane w sesji JEA, która współdziała z zewnętrznymi aplikacjami lub usługami, mogą rejestrować zdarzenia do własnych dzienników zdarzeń. W przeciwieństwie do dzienników i transkrypcji programu PowerShell inne mechanizmy rejestrowania nie przechwytują połączonego użytkownika sesji JEA. Zamiast tego te aplikacje rejestrują tylko wirtualnego użytkownika Uruchom jako. Aby określić, kto uruchomił polecenie, należy skonsultować się z transkrypcją sesji lub skorelować dzienniki zdarzeń programu PowerShell z czasem i użytkownikiem wyświetlanym w dzienniku zdarzeń aplikacji.
Dziennik usługi WinRM może również pomóc w skorelowaniu użytkowników uruchomiania jako z użytkownikiem łączącym się w dzienniku zdarzeń aplikacji. Identyfikator zdarzenia 193 w dzienniku Microsoft-Windows-Windows Remote Management/Operational rejestruje identyfikator zabezpieczeń (SID) i nazwę konta zarówno dla użytkownika łączącego, jak i uruchom jako użytkownika dla każdej nowej sesji JEA.
Transkrypcje sesji
Jeśli skonfigurowano narzędzie JEA do tworzenia transkrypcji dla każdej sesji użytkownika, kopia tekstowa akcji każdego użytkownika jest przechowywana w określonym folderze.
Następujące polecenie (jako administrator) znajduje wszystkie katalogi transkrypcji.
Get-PSSessionConfiguration |
Where-Object { $_.TranscriptDirectory -ne $null } |
Format-Table Name, TranscriptDirectory
Każda transkrypcja rozpoczyna się od informacji o czasie rozpoczęcia sesji, do której użytkownik nawiązał połączenie z sesją, oraz do której tożsamości JEA przypisano.
**********************
Windows PowerShell transcript start
Start time: 20160710144736
Username: CONTOSO\Alice
RunAs User: WinRM Virtual Users\WinRM VA_1_CONTOSO_Alice
Machine: SERVER01 (Microsoft Windows NT 10.0.14393.0)
[...]
Treść transkrypcji zawiera informacje o każdym poleceniu wywoływanym przez użytkownika. Dokładna składnia używanego polecenia jest niedostępna w sesjach JEA ze względu na sposób przekształcania poleceń na potrzeby komunikacji zdalnej programu PowerShell. Jednak nadal można określić skuteczne polecenie, które zostało wykonane. Poniżej znajduje się przykładowy fragment kodu transkrypcji z użytkownika uruchomionego Get-Service Dns
w sesji JEA:
PS>CommandInvocation(Get-Service): "Get-Service"
>> ParameterBinding(Get-Service): name="Name"; value="Dns"
>> CommandInvocation(Out-Default): "Out-Default"
>> ParameterBinding(Out-Default): name="InputObject"; value="Dns"
Running Dns DNS Server
Wiersz commandInvocation jest napisany dla każdego polecenia uruchamianego przez użytkownika. ParametrBindings rejestruje każdy parametr i wartość dostarczoną za pomocą polecenia . W poprzednim przykładzie widać, że parametr Name został podany z wartością Dns dla Get-Service
polecenia cmdlet.
Dane wyjściowe każdego polecenia wyzwalają również wywołanie CommandInvocation, zwykle do Out-Default
. Obiekt InputObject obiektu Out-Default
to obiekt programu PowerShell zwrócony z polecenia . Szczegóły tego obiektu są drukowane kilka wierszy poniżej, ściśle naśladując to, co użytkownik widział.
Zobacz też
Wpis w blogu Blue Team dotyczący zabezpieczeń w programie PowerShell ♥