Auditoría y creación de informes en JEAAuditing and Reporting on JEA

Después de haber implementado JEA, tendrá que auditar la configuración de JEA de forma periódica.After you've deployed JEA, you need to regularly audit the JEA configuration. La auditoría ayudar a evaluar si los usuarios adecuados tienen acceso al punto de conexión de JEA y sus roles asignados siguen siendo correctos.Auditing helps you assess that the correct people have access to the JEA endpoint and their assigned roles are still appropriate.

Buscar sesiones de JEA registradas en un equipoFind registered JEA sessions on a machine

Para comprobar qué sesiones de JEA están registradas en un equipo, use el cmdlet Get-PSSessionConfiguration.To check which JEA sessions are registered on a machine, use the Get-PSSessionConfiguration cmdlet.

# 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

Los derechos efectivos del punto de conexión se muestran en la propiedad Permission .The effective rights for the endpoint are listed in the Permission property. Estos usuarios tienen derecho a conectarse al punto de conexión de JEA.These users have the right to connect to the JEA endpoint. Pero los roles y los comandos a los que tienen acceso están determinados por la propiedad RoleDefinitions del archivo de configuración de sesión que se ha usado para registrar el punto de conexión.However, the roles and commands they have access to is determined by the RoleDefinitions property in the session configuration file that was used to register the endpoint. Expanda la propiedad RoleDefinitions para evaluar las asignaciones de rol en un punto de conexión de JEA registrado.Expand the RoleDefinitions property to evaluate the role mappings in a registered JEA endpoint.

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

Buscar funcionalidades de rol disponibles en el equipoFind available role capabilities on the machine

JEA obtiene las funcionalidades de rol de los archivos .psrc almacenados en la carpeta RoleCapabilities dentro de un módulo de PowerShell.JEA gets role capabilities from the .psrc files stored in the RoleCapabilities folder inside a PowerShell module. La función siguiente busca todas las funcionalidades de rol disponibles en un equipo.The following function finds all role capabilities available on a computer.

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

El orden de los resultados de esta función no es necesariamente el orden en que se seleccionarán las funcionalidades de rol si varias de ellas comparten el mismo nombre.The order of results from this function is not necessarily the order in which the role capabilities will be selected if multiple role capabilities share the same name.

Comprobar los derechos efectivos de un usuario específicoCheck effective rights for a specific user

El cmdlet Get-PSSessionCapability enumera todos los comandos disponibles en un punto de conexión de JEA en función de las pertenencias a grupos del usuario.The Get-PSSessionCapability cmdlet enumerates all the commands available on a JEA endpoint based on a user's group memberships. La salida de Get-PSSessionCapability es idéntica a la del usuario especificado que ejecuta Get-Command -CommandType All en una sesión de JEA.The output of Get-PSSessionCapability is identical to that of the specified user running Get-Command -CommandType All in a JEA session.

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

Si los usuarios no son miembros permanentes de grupos que les concederían derechos adicionales de JEA, es posible que este cmdlet no refleje esos permisos adicionales.If your users aren't permanent members of groups that would grant them additional JEA rights, this cmdlet may not reflect those extra permissions. Esto sucede al usar sistemas de administración de acceso con privilegios Just-In-Time para permitir que los usuarios pertenezcan de forma temporal a un grupo de seguridad.This happens when using just-in-time privileged access management systems to allow users to temporarily belong to a security group. Evalúe con atención la asignación de usuarios a roles y funcionalidades para garantizar que los usuarios solo obtienen el nivel de acceso necesario para realizar su trabajo de forma correcta.Carefully evaluate the mapping of users to roles and capabilities to ensure that users only get the level of access needed to do their jobs successfully.

Registros de eventos de PowerShellPowerShell event logs

Si ha habilitado el registro de bloques de script o de módulo en el sistema, puede ver eventos en los registros de eventos de Windows para cada comando que ejecute un usuario en una sesión de JEA.If you enabled module or script block logging on the system, you can see events in the Windows event logs for each command a user runs in a JEA session. Para buscar estos eventos, abra el registro de eventos Microsoft-Windows-PowerShell/Operational y busque eventos con el identificador 4104 .To find these events, open Microsoft-Windows-PowerShell/Operational event log and look for events with event ID 4104 .

En cada entrada del registro de eventos se incluye información sobre la sesión en la que se ha ejecutado el comando.Each event log entry includes information about the session in which the command was run. Para las sesiones de JEA, el evento incluye información sobre ConnectedUser y RunAsUser .For JEA sessions, the event includes information about the ConnectedUser and the RunAsUser . ConnectedUser es el usuario actual que ha creado la sesión de JEA.The ConnectedUser is the actual user who created the JEA session. RunAsUser es la cuenta de JEA que se ha usado para ejecutar el comando.The RunAsUser is the account JEA used to execute the command.

En los registros de eventos de la aplicación se muestran los cambios realizados por RunAsUser .Application event logs show changes being made by the RunAsUser . Por tanto, es necesario tener habilitado el registro de scripts y módulos para realizar el seguimiento de la invocación de un comando específico hasta ConnectedUser .So having module and script logging enabled is required to trace a specific command invocation back to the ConnectedUser .

Registros de eventos de la aplicaciónApplication event logs

Es posible que los comandos que se ejecutan en una sesión de JEA que interactúan con aplicaciones o servicios externos registren eventos en sus propios registros de eventos.Commands run in a JEA session that interact with external applications or services may log events to their own event logs. A diferencia de los registros y las transcripciones de PowerShell, otros mecanismos de registro no capturan el usuario conectado de la sesión de JEA.Unlike PowerShell logs and transcripts, other logging mechanisms don't capture the connected user of the JEA session. En su lugar, esas aplicaciones solo registran el usuario de ejecución virtual.Instead, those applications only log the virtual run-as user. Para determinar quién ha ejecutado el comando, tiene que consultar una transcripción de sesión o poner en correlación los registros de eventos de PowerShell con la hora y el usuario que se muestran en el registro de eventos de la aplicación.To determine who ran the command, you need to consult a session transcript or correlate PowerShell event logs with the time and user shown in the application event log.

El registro de WinRM también puede ayudarle a poner en correlación a los usuarios de ejecución con el usuario que se conecta en un registro de eventos de la aplicación.The WinRM log can also help you correlate run-as users to the connecting user in an application event log. El identificador de evento 193 del registro operativo o de Administración remota de Windows de Microsoft Windows registra el identificador de seguridad (SID) y el nombre de cuenta del usuario que se conecta y del usuario de ejecución en todas las sesiones de JEA nuevas.Event ID 193 in the Microsoft-Windows-Windows Remote Management/Operational log records the security identifier (SID) and account name for both the connecting user and run as user for every new JEA session.

Transcripciones de sesiónSession transcripts

Si ha configurado JEA para crear una transcripción para cada sesión de usuario, se almacena una copia de texto de las acciones de todos los usuarios en la carpeta especificada.If you configured JEA to create a transcript for each user session, a text copy of every user's actions are stored in the specified folder.

El comando siguiente (como administrador) busca todos los directorios de transcripción.The following command (as an administrator) finds all transcript directories.

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

Cada transcripción comienza con información sobre la hora en que se ha iniciado la sesión, qué usuario se ha conectado a la sesión y qué identidad de JEA se le ha asignado.Each transcript starts with information about the time the session started, which user connected to the session, and which JEA identity was assigned to them.

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

El cuerpo de la transcripción contiene información sobre cada comando que ha invocado el usuario.The body of the transcript contains information about each command the user invoked. La sintaxis exacta del comando que se usa no está disponible en las sesiones de JEA debido a la manera en que se transforman los comandos para la comunicación remota de PowerShell.The exact syntax of the command used is unavailable in JEA sessions because of the way commands are transformed for PowerShell remoting. Pero todavía puede determinar el comando real que se ha ejecutado.However, you can still determine the effective command that was executed. A continuación se muestra un fragmento de código de ejemplo de una transcripción de un usuario que ejecuta Get-Service Dns en una sesión de JEA:Below is an example transcript snippet from a user running Get-Service Dns in a JEA session:

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

Se escribe una línea CommandInvocation para cada comando que ejecuta un usuario.A CommandInvocation line is written for each command a user runs. En ParameterBindings se registran todos los parámetros y valores proporcionados con el comando.ParameterBindings record each parameter and value supplied with the command. En el ejemplo anterior, puede ver que al parámetro Name se le ha proporcionado el valor Dns para el cmdlet Get-Service.In the previous example, you can see that the parameter Name was supplied the with value Dns for the Get-Service cmdlet.

El resultado de cada comando también desencadenará una instancia de CommandInvocation , normalmente para Out-Default.The output of each command also triggers a CommandInvocation , usually to Out-Default. InputObject de Out-Default es el objeto de PowerShell que devuelve el comando.The InputObject of Out-Default is the PowerShell object returned from the command. Los detalles de ese objeto se imprimen unas líneas más adelante, imitando detenidamente lo que habría visto el usuario.The details of that object are printed a few lines below, closely mimicking what the user would have seen.

Vea tambiénSee also

Entrada de blog sobre seguridad de PowerShell ♥ the Blue TeamPowerShell ♥ the Blue Team blog post on security