Compartir a través de


Auditoría e informes sobre JEA

Después de implementar JEA, debe auditar periódicamente la configuración de JEA. La auditoría le ayuda a evaluar que las personas correctas tienen acceso al punto de conexión de JEA y sus roles asignados siguen siendo adecuados.

Búsqueda de sesiones de JEA registradas en una máquina

Para comprobar qué sesiones de JEA están registradas en un equipo, use el 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

Los derechos efectivos para el punto de conexión se muestran en el campo Permission. Estos usuarios tienen derecho a conectarse al punto de conexión de JEA. Sin embargo, los roles y comandos a los que tienen acceso están determinados por la propiedad RoleDefinitions en el archivo de configuración de sesión que se usó para registrar el punto de conexión. Amplíe la propiedad RoleDefinitions para analizar las asignaciones de roles en un punto de conexión de 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 }
}

Búsqueda de funcionalidades de rol disponibles en la máquina

JEA obtiene funcionalidades de rol de los .psrc archivos almacenados en la carpeta RoleCapabilities dentro de un módulo de PowerShell. La función siguiente busca todas las funcionalidades de rol disponibles en un equipo.

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 el que se seleccionarán las funcionalidades de rol si varias funcionalidades de rol comparten el mismo nombre.

Comprobación de los derechos efectivos de un usuario específico

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 de un usuario. La salida de Get-PSSessionCapability es idéntica a la del usuario especificado ejecutando Get-Command -CommandType All en una sesión de JEA.

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. Esto sucede cuando se usan sistemas de administración de acceso con privilegios Just-In-Time para permitir que los usuarios pertenezcan temporalmente a un grupo de seguridad. Evalúe cuidadosamente la asignación de usuarios a roles y funcionalidades para asegurarse de que los usuarios solo obtienen el nivel de acceso necesario para realizar sus trabajos correctamente.

Registros de eventos de PowerShell

Si ha habilitado el registro de bloques de script o módulo en el sistema, puede ver eventos en los registros de eventos de Windows para cada comando que un usuario ejecuta en una sesión de JEA. Para buscar estos eventos, abra el registro de eventos Microsoft-Windows-PowerShell/Operational y busque eventos con el identificador de evento 4104.

Cada entrada del registro de eventos incluye información sobre la sesión en la que se ejecutó el comando. Para las sesiones de JEA, el evento incluye información sobre ConnectedUser y RunAsUser. ConnectedUser es el usuario real que creó la sesión de JEA. RunAsUser es la cuenta de JEA que se usa para ejecutar el comando.

Los registros de eventos de la aplicación muestran los cambios realizados por RunAsUser. Por lo tanto, es necesario tener habilitado el registro de módulos y scripts para realizar un seguimiento de una invocación de comandos específica a ConnectedUser.

Registros de eventos de la aplicación

Los comandos que se ejecutan en una sesión de JEA interactuando con aplicaciones o servicios externos pueden registrar eventos en sus propios registros de eventos. A diferencia de los registros y transcripciones de PowerShell, otros mecanismos de registro no capturan al usuario conectado de la sesión de JEA. En su lugar, esas aplicaciones solo registran al usuario virtual en modo "run-as". Para determinar quién ejecutó el comando, debe consultar una transcripción de sesión o correlacionar los registros de eventos de PowerShell con la hora y el usuario que se muestra en el registro de eventos de la aplicación.

El registro de WinRM también puede ayudarle a correlacionar los usuarios de ejecución con el usuario que se conecta en un registro de eventos de la aplicación. El identificador de evento 193 en el registro Microsoft-Windows-Windows Administración Remota/Operativo registra el identificador de seguridad (SID) y el nombre de cuenta tanto del usuario que se conecta como del usuario que se ejecuta para cada nueva sesión de JEA.

Transcripciones de sesión

Si configuró JEA para crear una transcripción para cada sesión de usuario, se almacena una copia de texto de las acciones de cada usuario en la carpeta especificada.

El siguiente comando (como administrador) busca todos los directorios de transcripción.

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

Cada transcripción comienza con información sobre la hora en que se inició la sesión, el usuario que se conectó a la sesión y la identidad de JEA que se les asignó.

**********************
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 invocó el usuario. La sintaxis exacta del comando utilizado no está disponible en las sesiones de JEA debido a la forma en que los comandos se transforman para el uso de PowerShell remoting. Sin embargo, todavía puede determinar el comando efectivo que se ejecutó. A continuación se muestra un fragmento de la transcripción de ejemplo de un usuario ejecutando Get-Service Dns en una sesión de 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

Se escribe una línea CommandInvocation para cada comando que ejecuta un usuario. ParameterBindings registra cada parámetro y valor proporcionado con el comando . En el ejemplo anterior, puede ver que el parámetro Name se proporcionó con el valor Dns para el Get-Service cmdlet.

La salida de cada comando también desencadena un CommandInvocation, normalmente hacia Out-Default. InputObject de Out-Default es el objeto de PowerShell devuelto por el comando. Los detalles de ese objeto se imprimen unas pocas líneas a continuación, imitando estrechamente lo que el usuario habría visto.

Consulte también

Entrada de blog de PowerShell ♥ al Blue Team sobre seguridad