Búsqueda de sitios web

Auditoría e informes sobre JEA


Una vez que haya implementado JEA, deberá auditar periódicamente la configuración de JEA. La auditoría le ayuda a evaluar que las personas correctas tengan acceso al punto final JEA y que sus roles asignados sigan siendo apropiados.

Encuentra sesiones JEA registradas en una máquina

Para comprobar qué sesiones JEA están registradas en una máquina, utilice 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 final se enumeran en la propiedad Permiso. Estos usuarios tienen derecho a conectarse al punto final JEA. Sin embargo, las funciones 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 utilizó para registrar el punto final. Expanda la propiedad RoleDefinitions para evaluar las asignaciones de roles en un punto final 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 }
}

Encuentre capacidades de roles disponibles en la máquina

JEA obtiene capacidades de rol de los archivos .psrc almacenados en la carpeta RoleCapabilities dentro de un módulo de PowerShell. La siguiente función encuentra todas las capacidades de rol disponibles en una computadora.

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 capacidades de función si varias capacidades de función comparten el mismo nombre.

Verifique los derechos efectivos para un usuario específico

El cmdlet Get-PSSessionCapability enumera todos los comandos disponibles en un extremo JEA según la pertenencia a grupos de un usuario. La salida de Get-PSSessionCapability es idéntica a la del usuario especificado que ejecuta Get-Command -CommandType All en una sesión JEA.

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

Si sus usuarios no son miembros permanentes de grupos que les otorgarían derechos JEA adicionales, es posible que este cmdlet no refleje esos permisos adicionales. Esto sucede cuando se utilizan sistemas de administración de acceso privilegiado justo a tiempo para permitir que los usuarios pertenezcan temporalmente a un grupo de seguridad. Evalúe cuidadosamente la asignación de usuarios a roles y capacidades para garantizar que los usuarios solo obtengan el nivel de acceso necesario para realizar su trabajo con éxito.

Registros de eventos de PowerShell

Si habilitó el registro de bloques de módulos o scripts en el sistema, puede ver eventos en los registros de eventos de Windows para cada comando que un usuario ejecuta en una sesión JEA. Para encontrar estos eventos, abra el registro de eventos de Microsoft-Windows-PowerShell/Operational y busque eventos con el ID 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 el ConnectedUser y el RunAsUser. El ConnectedUser es el usuario real que creó la sesión JEA. RunAsUser es la cuenta que JEA utilizó 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 rastrear una invocación de comando específica hasta el ConnectedUser.

Registros de eventos de aplicaciones

Los comandos ejecutados en una sesión JEA que interactúan 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 JEA. En cambio, esas aplicaciones solo registran al usuario de ejecución virtual. Para determinar quién ejecutó el comando, debe consultar una transcripción de la sesión o correlacionar los registros de eventos de PowerShell con la hora y el usuario que se muestran en el registro de eventos de la aplicación.

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

Transcripciones de sesiones

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 transcripciones.

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

Cada transcripción comienza con información sobre la hora en que comenzó la sesión, qué usuario se conectó a la sesión y qué identidad JEA se le 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 JEA debido a la forma en que se transforman los comandos para la comunicación remota de PowerShell. Sin embargo, aún puede determinar el comando efectivo que se ejecutó. A continuación se muestra un fragmento de transcripción de ejemplo de un usuario que ejecuta 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 al parámetro Name se le proporcionó el valor Dns para el cmdlet Get-Service.

La salida de cada comando también activa una CommandInvocation, generalmente a Out-Default. El InputObject de Out-Default es el objeto de PowerShell devuelto por el comando. Los detalles de ese objeto están impresos unas líneas más abajo, imitando fielmente lo que el usuario habría visto.

Ver también

PowerShell ♥ the Blue Team publicación de blog sobre seguridad

Artículos relacionados