Partilhar via


Auditoria e relatórios sobre a JEA

Depois de implantar o JEA, você precisa auditar regularmente a configuração do JEA. A auditoria ajuda a avaliar se as pessoas corretas têm acesso ao ponto de extremidade JEA e se suas funções atribuídas ainda são apropriadas.

Encontre sessões JEA registadas numa máquina

Para verificar quais sessões JEA estão registradas em uma máquina, use o 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

Os direitos efetivos para o ponto de extremidade estão listados na propriedade Permissão . Esses usuários têm o direito de se conectar ao ponto de extremidade JEA. No entanto, as funções e comandos aos quais eles têm acesso são determinados pela propriedade RoleDefinitions no arquivo de configuração de sessão que foi usado para registrar o ponto de extremidade. Expanda a propriedade RoleDefinitions para avaliar os mapeamentos de função em um ponto de extremidade JEA registrado.

# 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 }
}

Encontre recursos de função disponíveis na máquina

O JEA obtém recursos de função dos .psrc arquivos armazenados na pasta RoleCapabilities dentro de um módulo do PowerShell. A função a seguir localiza todos os recursos de função disponíveis em um computador.

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
}

Nota

A ordem dos resultados dessa função não é necessariamente a ordem na qual os recursos de função serão selecionados se vários recursos de função compartilharem o mesmo nome.

Verificar os direitos efetivos de um utilizador específico

O cmdlet Get-PSSessionCapability enumera todos os comandos disponíveis em um ponto de extremidade JEA com base nas associações de grupo de um usuário. A saída de Get-PSSessionCapability é idêntica à do usuário especificado em execução Get-Command -CommandType All em uma sessão JEA.

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

Se os usuários não forem membros permanentes de grupos que lhes concederiam direitos JEA adicionais, esse cmdlet pode não refletir essas permissões extras. Isso acontece ao usar sistemas de gerenciamento de acesso privilegiado just-in-time para permitir que os usuários pertençam temporariamente a um grupo de segurança. Avalie cuidadosamente o mapeamento de usuários para funções e recursos para garantir que os usuários obtenham apenas o nível de acesso necessário para realizar seus trabalhos com êxito.

Logs de eventos do PowerShell

Se você habilitou o registro em log de bloco de módulo ou script no sistema, poderá ver eventos nos logs de eventos do Windows para cada comando que um usuário executa em uma sessão JEA. Para localizar esses eventos, abra o log de eventos Microsoft-Windows-PowerShell/Operational e procure eventos com a ID de evento 4104.

Cada entrada de log de eventos inclui informações sobre a sessão na qual o comando foi executado. Para sessões JEA, o evento inclui informações sobre o ConnectedUser e o RunAsUser. O ConnectedUser é o usuário real que criou a sessão JEA. O RunAsUser é a conta JEA usada para executar o comando.

Os logs de eventos do aplicativo mostram as alterações que estão sendo feitas pelo RunAsUser. Portanto, ter o registro em log de módulo e script habilitado é necessário para rastrear uma invocação de comando específico de volta ao ConnectedUser.

Logs de eventos do aplicativo

Os comandos executados em uma sessão JEA que interagem com aplicativos ou serviços externos podem registrar eventos em seus próprios logs de eventos. Ao contrário dos logs e transcrições do PowerShell, outros mecanismos de log não capturam o usuário conectado da sessão JEA. Em vez disso, esses aplicativos registram apenas o usuário virtual executado como. Para determinar quem executou o comando, você precisa consultar uma transcrição de sessão ou correlacionar os logs de eventos do PowerShell com a hora e o usuário mostrados no log de eventos do aplicativo.

O log do WinRM também pode ajudá-lo a correlacionar usuários run-as ao usuário conectado em um log de eventos do aplicativo. A ID de Evento 193 no log de Gerenciamento Remoto/Operacional do Microsoft-Windows-Windows registra o identificador de segurança (SID) e o nome da conta para o usuário conectado e executado como usuário para cada nova sessão JEA.

Transcrições das sessões

Se você configurou o JEA para criar uma transcrição para cada sessão de usuário, uma cópia de texto das ações de cada usuário será armazenada na pasta especificada.

O comando a seguir (como administrador) localiza todos os diretórios de transcrição.

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

Cada transcrição começa com informações sobre a hora em que a sessão começou, qual usuário se conectou à sessão e qual identidade JEA foi atribuída a eles.

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

O corpo da transcrição contém informações sobre cada comando que o usuário invocou. A sintaxe exata do comando usado não está disponível em sessões JEA devido à maneira como os comandos são transformados para a comunicação remota do PowerShell. No entanto, você ainda pode determinar o comando efetivo que foi executado. Abaixo está um exemplo de trecho de transcrição de um usuário em execução Get-Service Dns em uma sessão 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

Uma linha CommandInvocation é escrita para cada comando executado por um usuário. ParameterBindings registram cada parâmetro e valor fornecido com o comando. No exemplo anterior, você pode ver que o parâmetro Name foi fornecido com o valor Dns para o Get-Service cmdlet.

A saída de cada comando também dispara um CommandInvocation, geralmente para Out-Default. O InputObject of Out-Default é o objeto do PowerShell retornado do comando. Os detalhes desse objeto são impressos algumas linhas abaixo, imitando de perto o que o usuário teria visto.

Consulte também

PowerShell ♥ a postagem do blog Blue Team sobre segurança