Udostępnij za pośrednictwem


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 ♥