Búsqueda de sitios web

Seguimiento y análisis de registros de conexión de escritorio remoto en Windows


En este artículo, describiremos cómo obtener y auditar los registros de conexión RDP en Windows. Los registros de conexión RDP permiten a los administradores de servidores de terminal RDS obtener información sobre qué usuarios iniciaron sesión en el servidor cuando un usuario RDP específico inició sesión y finalizó la sesión, y desde qué dispositivo (nombre DNS o dirección IP) inició sesión el usuario.

Eventos de conexión RDP en el Visor de eventos de Windows

Cuando un usuario se conecta a un host RDS o habilitado para Escritorio remoto, la información sobre estos eventos se almacena en los registros del Visor de eventos (

eventvwr.msc

). Considere las etapas principales de la conexión RDP y los eventos relacionados en el Visor de eventos, que pueden ser de interés para el administrador

  1. Conexión de red;

  2. Autenticación;

  3. Iniciar sesión;

  4. Sesión Desconectar/Reconectar;

  5. Desconectarse.

Conexión de red : establece una conexión de red a un servidor desde el cliente RDP del usuario. Es el evento con el EventID 1149 (

Remote Desktop Services: User authentication succeeded

). Si se encuentra este evento, no significa que la autenticación del usuario haya sido exitosa. Este registro se encuentra en "Registros de aplicaciones y servicios -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager > Operativo". Habilite el filtro de registro para este evento (haga clic con el botón derecho en el registro -> Filtrar registro actual -> Id. de evento 1149).

Puede enumerar todos los intentos de conexión RDP con PowerShell:

$RDPAuths = Get-WinEvent -LogName 'Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational' -FilterXPath '<QueryList><Query Id="0"><Select>*[System[EventID=1149]]</Select></Query></QueryList>'
[xml[]]$xml=$RDPAuths|Foreach{$_.ToXml()}
$EventData = Foreach ($event in $xml.Event)
{ New-Object PSObject -Property @{
TimeCreated = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm:ss K')
User = $event.UserData.EventXML.Param1
Domain = $event.UserData.EventXML.Param2
Client = $event.UserData.EventXML.Param3
}
} $EventData | FT

Luego obtendrá una lista de eventos con el historial de todas las conexiones RDP a este servidor. Los registros proporcionan un nombre de usuario, un dominio (en este caso, se usa la autenticación de nivel de red; si NLA está deshabilitado, la descripción del evento se ve diferente) y la dirección IP de la computadora del usuario.

Autenticación muestra si un usuario RDP se ha autenticado correctamente en el servidor o no. El registro se encuentra en Windows -> Seguridad. Por lo tanto, es posible que le interesen los eventos con el EventID 4624 (

An account was successfully logged on

) o 4625 (

An account failed to log on

).

Preste atención al valor LogonType en la descripción del evento.

  • LogonType=10 o 3: si el servicio de escritorio remoto se ha utilizado para crear una nueva sesión durante el inicio de sesión;

  • LogonType=7, significa que un usuario se ha vuelto a conectar a la sesión RDP existente;

  • LogonType=5 : conexión RDP a la consola del servidor (en el modo mstsc.exe /admin).

Puede usar eventos de falla de autenticación de RDP para protegerse contra ataques de fuerza bruta de RDP. Puede bloquear automáticamente las direcciones IP de los atacantes en el Firewall de Windows Defender mediante un simple script de PowerShell.

En este caso, el nombre de usuario está contenido en la descripción del evento en el campo Nombre de la cuenta, el nombre de la computadora en el Nombre de la estación de trabajo y la IP del usuario en la Dirección de red de origen.

Tenga en cuenta el valor del campo LogonID. Este es un identificador de sesión RDP de usuario único que ayuda a rastrear la actividad adicional del usuario. Sin embargo, si se desconecta una sesión RDP y un usuario se vuelve a conectar a ella, se le asignará un nuevo ID de inicio de sesión (aunque la sesión RDP sigue siendo la misma).

Puede obtener una lista de eventos de autenticación RDP exitosos (EventID 4624) usando este comando de PowerShell:

Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and $_.Message -match 'logon type:\s+(10)\s'} | Out-GridView

Inicio de sesión se refiere a un inicio de sesión RDP en Windows. EventID 21: este evento aparece después de que un usuario se haya autenticado correctamente (

Remote Desktop Services: Session logon succeeded

). Estos eventos se encuentran en "Registros de aplicaciones y servicios -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operativo". Como puede ver, aquí puede encontrar el ID de una sesión RDP de usuario: ID de sesión.

Id. de evento: 21 (

Remote Desktop Services: Shell start notification received

) indica que el shell de Explorer se ha iniciado correctamente (el escritorio de Windows aparece en la sesión RDP del usuario).

Desconexión/reconexión de la sesión: los eventos de desconexión y reconexión de la sesión tienen ID diferentes según la causa de la desconexión del usuario (desconexión debido a la inactividad establecida en los tiempos de espera para las sesiones RDP, el usuario seleccionó la opción Desconectar en la sesión, la sesión RDP finalizó por otro usuario o un administrador, etc.). Puede encontrar estos eventos en el Visor de eventos en "Registros de aplicaciones y servicios -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operacional". Consideremos los ID de eventos de RDP que podrían ser útiles:

  • Id. de evento: 24 (

    Remote Desktop Services: Session has been disconnected

    ) -un usuario se ha desconectado de la sesión RDP;

  • Id. de evento: 25 (

    Remote Desktop Services: Session reconnection succeeded

    ) - un usuario se ha vuelto a conectar a la sesión RDP existente en el servidor;

  • Id. de evento: 39 (

    Session <A> has been disconnected by session <B>

    ): un usuario se ha desconectado de la sesión RDP seleccionando la opción de menú correspondiente (en lugar de simplemente cerrar la ventana del cliente RDP). Si los ID de sesión son diferentes, otro usuario (o administrador) ha desconectado a un usuario;

  • Id. de evento: 40 (

    Session <A> has been disconnected, reason code <B>

    ). Aquí debe verificar el código de motivo de desconexión en la descripción del evento. Por ejemplo:

    • código de razón 0 (

    • No additional information is available

      ) significa que un usuario acaba de cerrar la ventana del cliente RDP;

    • código de motivo 5 (

      The client’s connection was replaced by another connection

      ) significa que un usuario se ha vuelto a conectar a la sesión RDP anterior;

    • código de motivo 11 (

      User activity has initiated the disconnect

      ) un usuario ha hecho clic en el botón Desconectar en el menú de inicio.

EventID 4778 en Windows -> Registro de seguridad (una sesión se volvió a conectar a una estación de Windows). Un usuario se ha vuelto a conectar a una sesión RDP (a un usuario se le asigna un nuevo ID de inicio de sesión).

EventID 4779 en el registro "Windows -> Seguridad" (

A session was disconnected from a Window Station

). Un usuario ha sido desconectado de una sesión RDP.

Cerrar sesión se refiere al final de la sesión de un usuario. Se registra como el evento con el EventID 23 (

Remote Desktop Services: Session logoff succeeded

) en "Registros de aplicaciones y servicios -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operacional".

Al mismo tiempo, el EventID 4634 (

An account was logged off

) aparece en el registro de seguridad.

El ID de evento 9009 (

The Desktop Window Manager has exited with code <X>

) en el registro del sistema significa que un usuario inició el cierre de sesión de RDP con la ventana y el shell gráfico del usuario terminados.

EventID 4647: cierre de sesión iniciado por el usuario

Obtener el historial de inicio de sesión de escritorio remoto con PowerShell

Aquí hay una breve secuencia de comandos de PowerShell que enumera el historial de todas las conexiones RDP para el día actual desde los registros de eventos del servidor RDS del terminal. La tabla resultante muestra el tiempo de conexión, la dirección IP del cliente (nombre de la computadora DNS) y el nombre de usuario remoto (si es necesario, puede incluir otros tipos de inicio de sesión en el informe).

Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match 'logon type:\s+(10)\s'}| %{
(new-object -Type PSObject -Property @{
TimeGenerated = $_.TimeGenerated
ClientIP = $_.Message -replace '(?smi).*Source Network Address:\s+([^\s]+)\s+.*','$1'
UserName = $_.Message -replace '(?smi).*\s\sAccount Name:\s+([^\s]+)\s+.*','$1'
UserDomain = $_.Message -replace '(?smi).*\s\sAccount Domain:\s+([^\s]+)\s+.*','$1'
LogonType = $_.Message -replace '(?smi).*Logon Type:\s+([^\s]+)\s+.*','$1'
})
} | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP `
, @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} `
, @{N='LogType';E={
switch ($_.LogonType) {
2 {'Interactive - local logon'}
3 {'Network connection to shared folder)'}
4 {'Batch'}
5 {'Service'}
7 {'Unlock (after screensaver)'}
8 {'NetworkCleartext'}
9 {'NewCredentials (local impersonation process under existing connection)'}
10 {'RDP'}
11 {'CachedInteractive'}
default {"LogType Not Recognised: $($_.LogonType)"}
}
}}

Este método le permite recopilar y analizar registros de conexión RDP en un servidor RDSH independiente. Si tiene varios servidores en la granja de RDS, puede consultar cada uno de ellos con este script u obtener registros de un servidor de administración con la función Agente de conexión a Escritorio remoto.

Puede exportar registros de conexión RDP desde el Visor de eventos a un archivo CSV (para un análisis más detallado en una hoja de cálculo de Excel). Puede exportar el registro desde la GUI del Visor de eventos (suponiendo que los registros del Visor de eventos no se borren) o a través del símbolo del sistema:

WEVTUtil query-events Security > c:\ps\rdp_security_log.txt

O con PowerShell:

get-winevent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | Export-Csv c:\ps\rdp_connection_log.txt  -Encoding UTF8

Si sus usuarios se conectan a hosts RDS corporativos a través de Remote Desktop Gateway, puede verificar los registros de conexión de usuario en el registro de Microsoft-Windows-TerminalServices-Gateway por el EventID 302. Por ejemplo, el siguiente script de PowerShell mostrará el historial de conexión del usuario especificado a través de RD Gateway:

$rdpusername="b.smith"
$properties = @(
@{n='User';e={$_.Properties[0].Value}},
@{n='Source IP Adress';e={$_.Properties[1].Value}},
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='Target RDP host';e={$_.Properties[3].Value}}
)
(Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-Gateway/Operational';ID='302'} | Select-Object $properties) -match $rdpusername

Puede verificar los siguientes eventos de conexión de usuario de RD Gateway en el registro de eventos de Microsoft-Windows-TerminalServices-Gateway:

  • 300: el NOMBRE del usuario, en el equipo cliente DISPOSITIVO, cumplió con los requisitos de la política de autorización de recursos y, por lo tanto, estaba autorizado para conectarse al recurso RDPHOST;

  • 302: el NOMBRE de usuario, en el equipo cliente DISPOSITIVO, conectado al recurso RDPHOST;

  • 303: el NOMBRE de usuario, en el DISPOSITIVO de la computadora del cliente, se desconectó del siguiente recurso de red: RDPHOST. Antes de que el usuario se desconectara, el cliente transfirió X bytes y recibió X bytes. La duración de la sesión del cliente fue de X segundos.

Puede mostrar la lista de sesiones remotas actuales en su host RDS con el comando:

qwinsta

El comando devuelve el ID de la sesión, el NOMBRE DE USUARIO y el estado de la sesión (Activa/Desconectada). Este comando es útil cuando necesita obtener el ID de sesión de RDP del usuario al usar conexiones de Escritorio remoto en la sombra.

Puede mostrar la lista de los procesos en ejecución en la sesión RDP específica (se especifica el ID de la sesión):

qprocess /id:5

Registros de conexión RDP salientes en Windows

También puede ver los registros de conexión RDP salientes en el lado del cliente. Están disponibles en el siguiente registro de eventos: Registros de aplicaciones y servicios -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> Operational.

Por ejemplo, EventID 1102 ocurre cuando un usuario se conecta a un host RDS de Windows Server remoto o a una computadora con Windows 10/11 con RDP habilitado (las ediciones de escritorio de Windows también admiten varias conexiones RDP simultáneas).

The client has initiated a multi-transport connection to the server 192.168.13.201.

El siguiente script RDP mostrará el historial de conexiones de clientes RDP en la computadora actual:

$properties = @(
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='LocalUser';e={$_.UserID}}
@{n='Target RDP host';e={$_.Properties[1].Value}}
)
Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-RDPClient/Operational';ID='1102'} | Select-Object $properties

El script devuelve los SID de los usuarios que iniciaron conexiones RDP en esta computadora, así como los nombres DNS/direcciones IP de los hosts de Escritorio remoto a los que se conectaron los usuarios. Puede convertir SID en nombres de usuario de la siguiente manera.

Además, puede consultar el historial de conexión RDP en el registro del usuario.

Artículos relacionados