Отслеживание и анализ журналов подключений к удаленному рабочему столу в Windows

В этой статье мы расскажем о том, как получить и проанализировать журналы соединений RDP в Windows. Журналы соединений RDP позволяют администраторам терминальных серверов RDS получать информацию о том, какие пользователи входили на сервер, когда определенный пользователь RDP входил и завершал сессию, а также с какого устройства (DNS-имя или IP-адрес) пользователь входил в систему.

Статья применима при анализе журналов RDP как для Windows Server 2022/2019/2016, так и для настольных редакций (Windows 11 и 10).

События RDP-соединений в средстве просмотра событий Windows

Когда пользователь подключается к хосту с поддержкой Remote Desktop или RDS, информация об этих событиях сохраняется в журналах Event Viewer (eventvwr.msc). Рассмотрим основные этапы подключения к RDP и связанные с ними события в Event Viewer, которые могут быть интересны администратору

  1. Сетевое подключение;
  2. Аутентификация;
  3. Вход в систему;
  4. Отключение/возобновление сеанса;
  5. Выход из системы.

Сетевое подключение — установление сетевого соединения с сервером с помощью RDP-клиента пользователя. Это событие с идентификатором EventID 1149 (Remote Desktop Services: User authentication succeeded). Если это событие обнаружено, это не означает, что аутентификация пользователя прошла успешно. Этот журнал находится в разделе «Журналы приложений и служб -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager > Operational». Включите фильтр журнала для этого события (щелкните правой кнопкой мыши журнал -> Фильтр текущего журнала -> EventId 1149).

журнал событий windows фильтрация Terminal-Services-RemoteConnectionManager

С помощью PowerShell можно составить список всех попыток подключения по RDP:

$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

сценарий powershell: получить события подключения rdp

После этого вы получите список событий с историей всех RDP-соединений с этим сервером. В журналах указывается имя пользователя, домен (в данном случае используется аутентификация сетевого уровня; если NLA отключена, описание события выглядит по-другому) и IP-адрес компьютера пользователя.

EventID 1149 - Службы удаленных рабочих столов: Аутентификация пользователя прошла успешно

Аутентификация показывает, был ли пользователь RDP успешно аутентифицирован на сервере или нет. Журнал находится в разделе Windows -> Security. Итак, вас могут заинтересовать события с идентификатором EventID 4624 (An account was successfully logged on) или 4625 (An account failed to log on).

Пожалуйста, обратите внимание на LogonType значение в описании события.

  • LogonType = 10 или 3 — если служба Remote Desktop использовалась для создания нового сеанса при входе в систему;
  • LogonType = 7, означает, что пользователь повторно подключился к существующему сеансу RDP;
  • LogonType = 5 — RDP-соединение с консолью сервера (в режиме mstsc.exe /admin).
Вы можете использовать события сбоя аутентификации RDP для защиты от атак грубой силы на RDP. Вы можете автоматически блокировать IP-адреса злоумышленников на брандмауэре Windows Defender с помощью простого сценария PowerShell.

журнал безопасности: событие входа в систему rdp с именем пользователя и ip-адресом удаленного клиента

В этом случае имя пользователя содержится в описании события в файле Имя учетной записи поле, имя компьютера в поле Имя рабочей станции, и IP-адрес пользователя в Адрес сети источника.

Обратите внимание на значение LogonID поле. Это уникальный идентификатор сеанса RDP пользователя, который помогает отслеживать его дальнейшую активность. Однако если сеанс RDP отключается, а пользователь подключается к нему снова, ему присваивается новый LogonID (хотя сеанс RDP остается прежним).

Вы можете получить список событий успешной аутентификации RDP (EventID 4624) с помощью этой команды 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

list sucess rdp auth event with an EventID 4624

Вход в систему относится к входу в систему Windows по протоколу RDP. Идентификатор события 21 — это событие появляется после успешной аутентификации пользователя (Remote Desktop Services: Session logon succeeded). Эти события находятся в разделе «Журналы приложений и служб -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational». Как видите, здесь можно найти идентификатор пользовательской RDP-сессии — ID сеанса.

EventID 21 - Службы удаленных рабочих столов: Вход в сеанс выполнен успешно

EventID — 21 (Remote Desktop Services: Shell start notification received) указывает на то, что оболочка Explorer успешно запущена (рабочий стол Windows появляется в RDP-сессии пользователя).

Отключение/возобновление сеанса — События отключения и повторного подключения сеанса имеют разные идентификаторы в зависимости от того, что стало причиной отключения пользователя (отключение из-за неактивности, установленной в таймаутах для сеансов RDP, опция Disconnect была выбрана пользователем в сеансе, сеанс RDP завершен другим пользователем или администратором и т.д.). Вы можете найти эти события в Event Viewer в разделе «Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational». Давайте рассмотрим идентификаторы событий RDP, которые могут быть полезны:

  • EventID — 24 (Remote Desktop Services: Session has been disconnected) — пользователь отключился от сеанса RDP;
  • EventID — 25 (Remote Desktop Services: Session reconnection succeeded) — пользователь повторно подключился к существующей RDP-сессии на сервере;
  • EventID — 39 (Session <A> has been disconnected by session <B>) — пользователь отключился от сеанса RDP, выбрав соответствующий пункт меню (а не просто закрыл окно клиента RDP). Если идентификаторы сеансов разные, пользователь был отключен другим пользователем (или администратором);
  • EventID — 40 (Session <A> has been disconnected, reason code <B>). Здесь необходимо проверить код причины отключения в описании события. Например:
    • код причины 0 (No additional information is available) означает, что пользователь только что закрыл окно клиента RDP;
    • код причины 5 (The client’s connection was replaced by another connection) означает, что пользователь снова подключился к предыдущему сеансу RDP;
    • код причины 11 (User activity has initiated the disconnect) пользователь нажал кнопку «Отключить» в стартовом меню.

EventID 4778 в Windows -> Журнал безопасности (сеанс был повторно подключен к Window Station). Пользователь повторно подключился к сеансу RDP (пользователю назначен новый идентификатор входа).

EventID 4779 в журнале «Windows -> Security» (A session was disconnected from a Window Station). Пользователь был отключен от сеанса RDP.

Выход из системы Означает завершение сеанса работы пользователя. Оно регистрируется как событие с идентификатором EventID 23 (Remote Desktop Services: Session logoff succeeded) в разделе «Журналы приложений и служб -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational».

EventID 23 - Службы удаленных рабочих столов: Выход из сеанса завершен успешно

В то же время EventID 4634 (An account was logged off) появляется в журнале безопасности.

Идентификатор события 9009 (The Desktop Window Manager has exited with code <X>) в системном журнале означает, что пользователь инициировал выход из сеанса RDP, при этом как окно, так и графическая оболочка пользователя были завершены.

EventID 4647 — Выход из системы по инициативе пользователя

Получение истории входа в систему удаленного рабочего стола с помощью PowerShell

Вот короткий сценарий PowerShell, который выводит историю всех RDP-соединений за текущий день из журналов событий терминального RDS-сервера. В итоговой таблице отображается время соединения, IP-адрес клиента (DNS computername) и имя удаленного пользователя (при необходимости в отчет можно включить и другие LogonTypes).

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)"}
}
}}

powershell: список сегодняшних входов в систему rdp с указанием ip и имени пользователя

Этот метод позволяет собирать и анализировать журналы RDP-соединений на отдельном сервере RDSH. Если у вас несколько серверов в ферме RDS, вы можете запросить каждый из них с помощью этого сценария или получить журналы с сервера управления с ролью Remote Desktop Connection Broker.

Можно экспортировать журналы соединений RDP из Event Viewer в CSV-файл (для дальнейшего анализа в электронной таблице Excel). Журнал можно экспортировать из графического интерфейса Event Viewer (при условии, что журналы Event Viewer не очищены) или через командную строку:

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

Или с помощью PowerShell:

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

Если ваши пользователи подключаются к корпоративным узлам RDS через шлюз удаленных рабочих столов, вы можете проверить журналы пользовательских подключений в файле Microsoft-Windows-TerminalServices-Gateway журнал по идентификатору события 302. Например, следующий сценарий PowerShell отобразит историю подключений указанного пользователя через 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

журналы подключений пользователей шлюза rd

В журнале событий Microsoft-Windows-TerminalServices-Gateway можно проверить следующие события подключения пользователей RD Gateway:

  • 300 — Пользователь NAME на клиентском компьютере DEVICE удовлетворяет требованиям политики авторизации ресурсов и поэтому получил разрешение на подключение к ресурсу RDPHOST;
  • 302 — Пользователь NAME, на клиентском компьютере DEVICE, подключился к ресурсу RDPHOST;
  • 303 — Пользователь NAME на клиентском компьютере DEVICE отключился от следующего сетевого ресурса: RDPHOST. Перед тем как пользователь отключился, клиент передал X байт и принял X байт. Длительность клиентского сеанса составила X секунд.

Список текущих удаленных сессий на хосте RDS можно отобразить с помощью команды:

qwinsta
Команда возвращает ID сеанса, USERNAME и состояние сеанса (Active/Disconnect). Эта команда полезна, когда вам нужно получить идентификатор RDP-сессии пользователя при использовании теневых подключений Remote Desktop.

Qwinsta - список сеансов RDP и имен пользователей

Вы можете отобразить список запущенных процессов в конкретном сеансе RDP (указан идентификатор сеанса):

qprocess /id:5

qprocess - получить список процессов для сеанса RDP

Журналы исходящих соединений RDP в Windows

Вы также можете просмотреть журналы исходящих RDP-соединений на стороне клиента. Они доступны в следующем журнале событий: Application and Services Logs -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> Operational.

Например, EventID 1102 возникает, когда пользователь подключается к удаленному узлу Windows Server RDS или компьютеру Windows 10/11 с включенным RDP (настольные версии Windows также поддерживают несколько одновременных RDP-соединений).

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

Событие подключения Microsoft-Windows-TerminalServices-RDPClient в Windows

Следующий сценарий RDP отобразит историю подключений клиента RDP на текущем компьютере:

$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

события подключений клиента rdp

Сценарий возвращает SID пользователей, инициировавших RDP-соединения на этом компьютере, а также DNS-имена/IP-адреса узлов Remote Desktop, к которым подключались пользователи. Вы можете преобразовать SID в имена пользователей следующим образом.

Также можно проверить историю RDP-соединений в реестре пользователя.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *