Compartilhar via


Auditoria e relatórios no JEA

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

Localizar sessões JEA registradas em um computador

Para verificar quais sessões JEA estão registradas em um computador, 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 do ponto de extremidade são listados na propriedade Permission . Esses usuários têm o direito de se conectar ao ponto de extremidade JEA. No entanto, as funções e os 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 }
}

Localizar recursos de função disponíveis no computador

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
}

Observação

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

Verificar direitos efetivos para um usuário 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 é 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 poderá 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 funcionalidades 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 log de blocos de script ou módulo 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/Operacional e procure eventos com a ID do 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 alterações feitas pelo RunAsUser. Portanto, ter o log de módulo e script habilitado é necessário para rastrear uma invocação de comando específica de volta para o ConnectedUser.

Logs de eventos do aplicativo

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 de execução virtual 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 o tempo e o usuário mostrados no log de eventos do aplicativo.

O log do WinRM também pode ajudá-lo a correlacionar usuários executados como ao usuário conectado em um log de eventos do aplicativo. A ID do evento 193 no log de gerenciamento remoto/operacional da MicrosoftWindows-Windows registra o SID (identificador de segurança) e o nome da conta para o usuário conectado e executado como usuário para cada nova sessão JEA.

Transcrições de sessão

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 foi iniciada, 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 invocado pelo usuário. A sintaxe exata do comando usado não está disponível nas sessões JEA devido à forma 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. Veja abaixo um exemplo de snippet 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 é gravada para cada comando executado por um usuário. ParameterBindings registra cada parâmetro e valor fornecidos com o comando. No exemplo anterior, você pode ver que o nome do parâmetro foi fornecido com Dns de valor para o Get-Service cmdlet.

A saída de cada comando também dispara um CommandInvocation, geralmente para Out-Default. O InputObject é 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

Postagem no blog da Equipe Azul do PowerShell ♥ sobre segurança