Udostępnij za pomocą


Audytowanie i raportowanie na temat 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 możliwości roli z plików .psrc przechowywanych w folderze RoleCapabilities wewnątrz modułu PowerShell. Poniższa funkcja znajduje wszystkie uprawnienia 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 / Notatka

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. Wynik działania Get-PSSessionCapability jest identyczny z wynikiem działania Get-Command -CommandType All uruchomionego przez określonego użytkownika w sesji JEA.

Get-PSSessionCapability -ConfigurationName 'JEAMaintenance' -Username 'CONTOSO\Alice'

Jeśli użytkownicy nie są stałymi członkami grup, które mogłyby przyznać im dodatkowe prawa JEA, to polecenie cmdlet może nie odzwierciedlać tych dodatkowych uprawnień. Dzieje się tak w przypadku korzystania z systemów zarządzania dostępem uprzywilejowanym typu just-in-time, aby umożliwić użytkownikom tymczasową przynależność do grupy bezpieczeństwa. 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 modułów lub bloków skryptów w systemie, można zobaczyć zdarzenia w dziennikach zdarzeń systemu Windows dla każdego polecenia uruchamianego przez użytkownika 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 ConnectedUser i RunAsUser. ConnectedUser jest rzeczywistym użytkownikiem, który utworzył sesję JEA. RunAsUser to konto, z którego JEA korzysta 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 ConnectedUser.

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 uruchomionego 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 pomóc w skorelowaniu użytkowników uruchomionych 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 użytkownika łączącego się, jak i użytkownika, który uruchamia każdą nową sesję 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, użytkowniku, który połączył się z sesją, oraz przypisanej mu tożsamości JEA.

**********************
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, w jaki polecenia są przekształcane na potrzeby zdalnej komunikacji programu PowerShell. Jednak nadal można określić skuteczne polecenie, które zostało wykonane. Poniżej znajduje się przykładowy fragment transkryptu z użytkownika uruchamiającego 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

Dla każdego polecenia uruchamianego przez użytkownika, tworzony jest wiersz CommandInvocation. 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. InputObject to obiekt programu PowerShell zwracany z polecenia. Szczegóły tego obiektu są drukowane kilka wierszy poniżej, ściśle naśladując to, co użytkownik widział.

Zobacz także

Wpis na blogu "PowerShell ♥ the Blue Team" dotyczący zabezpieczeń