Sdílet prostřednictvím


Audit a vytváření zpráv o JEA

Po nasazení JEA je potřeba pravidelně auditovat konfiguraci JEA. Auditování pomáhá vyhodnotit, že správné osoby mají přístup ke koncovému bodu JEA a jejich přiřazené role jsou stále vhodné.

Vyhledání registrovaných relací JEA na počítači

Pokud chcete zkontrolovat, které relace JEA jsou zaregistrované na počítači, použijte rutinu 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

Platná práva pro koncový bod jsou uvedena ve vlastnosti Oprávnění . Tito uživatelé mají právo připojit se ke koncovému bodu JEA. Role a příkazy, ke kterým mají přístup, jsou však určeny vlastností RoleDefinitions v konfiguračním souboru relace , který byl použit k registraci koncového bodu. Rozbalte vlastnost RoleDefinitions a vyhodnoťte mapování rolí v registrovaném koncovém bodu 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 }
}

Vyhledání dostupných funkcí rolí na počítači

JEA získá schopnosti role ze .psrc souborů uložených ve složce RoleCapabilities v PowerShell modulu. Následující funkce najde všechny funkce rolí dostupné v počítači.

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
}

Poznámka:

Pořadí výsledků této funkce nemusí nutně odpovídat pořadí, ve kterém budou možnosti role vybrány, pokud více funkcí rolí sdílí stejný název.

Kontrola platných práv pro konkrétního uživatele

Rutina Get-PSSessionCapability vyčísluje všechny příkazy dostupné na koncovém bodu JEA na základě členství ve skupinách uživatele. Výstup Get-PSSessionCapability je stejný jako u zadaného uživatele v relaci JEA spouštějícího Get-Command -CommandType All.

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

Pokud uživatelé nejsou trvalými členy skupin, kteří by jim udělili další práva JEA, nemusí tato rutina odrážet tato dodatečná oprávnění. K tomu dochází v případě, že používáte systémy pro správu privilegovaného přístupu za běhu, které uživatelům umožní dočasně patřit do skupiny zabezpečení. Pečlivě vyhodnoťte mapování uživatelů na role a možnosti, abyste zajistili, že uživatelé získají pouze úroveň přístupu potřebnou k úspěšné práci.

Protokoly událostí PowerShellu

Pokud jste povolili protokolování modulu nebo bloku skriptu v systému, můžete zobrazit události v protokolech událostí Systému Windows pro každý příkaz, který uživatel spustí v relaci JEA. Pokud chcete tyto události najít, otevřete Microsoft-Windows-PowerShell nebo protokol provozních událostí a vyhledejte události s ID události 4104.

Každá položka protokolu událostí obsahuje informace o relaci, ve které byl příkaz spuštěn. U relací JEA událost obsahuje informace o ConnectedUser a RunAsUser. ConnectedUser je skutečný uživatel, který vytvořil relaci JEA. RunAsUser je účet JEA použitý ke spuštění příkazu.

Protokoly událostí aplikace zobrazují změny provedené uživatelem RunAsUser. Je nutné mít povolené protokolování modulů a skriptů, aby bylo možné vysledovat konkrétní vyvolání příkazu zpět k ConnectedUser.

Protokoly událostí aplikace

Příkazy se spouštějí v relaci JEA, která komunikuje s externími aplikacemi nebo službami, mohou zaznamenávat události do svých vlastních protokolů událostí. Na rozdíl od protokolů a přepisů PowerShellu ostatní mechanismy protokolování nezachytí připojeného uživatele relace JEA. Místo toho tyto aplikace protokolují pouze virtuální spustit jako uživatele. Pokud chcete zjistit, kdo příkaz spustil, musíte se podívat na přepis relace nebo korelovat protokoly událostí PowerShellu s časem a uživatelem zobrazeným v protokolu událostí aplikace.

Protokol WinRM vám také může pomoci provázat uživatele spuštěné prostřednictvím funkce run-as s připojujícím se uživatelem v protokolu událostí aplikace. ID události 193 v Microsoftu –Windows-Windows protokol vzdálené správy nebo provozního protokolu zaznamenává identifikátor zabezpečení (SID) a název účtu pro uživatele, který se připojuje, a běží jako uživatel pro každou novou relaci JEA.

Přepisy relací

Pokud jste nakonfigurovali JEA tak, aby vytvořil přepis pro každou uživatelskou relaci, uloží se v zadané složce textová kopie akcí každého uživatele.

Následující příkaz (jako správce) najde všechny adresáře s přepisy.

Get-PSSessionConfiguration |
  Where-Object { $_.TranscriptDirectory -ne $null } |
    Format-Table Name, TranscriptDirectory

Každý přepis začíná informacemi o čase spuštění relace, který uživatel se připojil k relaci, a která identita JEA mu byla přiřazena.

**********************
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)
[...]

Tělo přepisu obsahuje informace o každém příkazu, který uživatel vyvolal. Přesná syntaxe použitého příkazu není dostupná v relacích JEA kvůli způsobu, jakým se příkazy transformují pro vzdálené správy PowerShellu. Přesto ale můžete určit efektivní příkaz, který byl proveden. Níže je příklad fragmentu přepisu od uživatele spuštěného Get-Service Dns v relaci 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

Řádek CommandInvocation se zapisuje pro každý příkaz, který uživatel spustí. ParametrBindings zaznamenává každý parametr a hodnotu zadanou příkazem. V předchozím příkladu vidíte, že parametr Name byl zadán s hodnotou Dns pro rutinu Get-Service .

Výstup každého příkazu také aktivuje CommandInvocation, obvykle na Out-Default. InputObject je Out-Default objekt PowerShellu vrácený příkazem. Podrobnosti o objektu jsou vytištěny několik řádků níže, věrně napodobujíce, co by uživatel viděl.

Viz také

Blogový příspěvek PowerShell ♥ Blue Team o zabezpečení