Статистика RDP авторизаций Terminal Server & Remote Desktop Gateway

Задача: Нужно с системы с ролью Remote Desktop Gateway формировать статистику кто на ней авторизовался через RDP соединение, как при работе связки извне, так и в пределах локальной сети.

Роль Remote Desktop Gateway настраивается по разобранной в лабораторных условиях заметке: «Доступ к RDP через авторизацию RADIUS» которая является полным сопоставление того что сейчас у меня на рабочем месте. Просто чтобы на работе сервис работал как надо все разбираюсь от и до со всеми нюансами.

Шаг №1: Т.к. у меня все системы в домене то посредством общей групповой политики Default Domain Policy активирую запись только полезных логов:

Srv-dc.polygon.com – Win + X – Control Panel – Administrative Tools – Group Policy Management – Group Policy Management – Forest: polygon.com – Domains – polygon.com – через редактирование Default Domain Policy – Default Domain Policy [SRV-DC.POLYGON.COM] Policy – Computer Configuration – Policies – Windows Settings – Security Settings – Local Policies – Audit Policy –

  • Audit account logon events (аудит входа в систему): Success, Failure
  • Audit logon events (аудит событий входа в систему): Success, Failure
  • Audit privilege user: Success, Failure

Srv-dc.polygon.com – Win + X – Control Panel – Administrative Tools – Group Policy Management – Group Policy Management – Forest: polygon.com – Domains – polygon.com – через редактирование Default Domain Policy – Default Domain Policy [SRV-DC.POLYGON.COM] Policy – Computer Configuration – Policies – Windows Settings – Security Settings – Local Policies – Advanced Audit Policy Configuration – Audit Policies – Logon/Logoff

  • Audit Account Lockout: Failure
  • Audit Logoff: Success
  • Audit Logon: Success and Failure
  • Audit Other Logon/Logoff Events: Failure

После того, как все доменные компьютеры перезагрузятся, я посредством шагов ниже смогу снимать статистику RDP подключений.

Шаг №2: Качаю скрипт посредством разобранной ранее заметки: «Скачать файл встроенными средствами Windows»

От компании Microsoft посредством которого можно распарсить логи моего терминального сервера под управлением Windows Server 2012 R2 Std (Version 6.3.9600)

Win + X -> Command Prompt (Admin)

1234567891011C:\Windows\system32>if not exist c:\Script mkdir c:\Script C:\windows\system32> cd /d c:\Script c:\Script>bitsadmin /transfer RDPConnectionParser.ps1 /download /priority normal https://gallery.technet.microsoft.com/Remote-Desktop-Connection-3fe225cd/file/136148/7/RDPConnectionParser.ps1 c:\Script\RDPConnectionParser.ps1 DISPLAY: ‘RDPConnectionParser.ps1’ TYPE: DOWNLOAD STATE: TRANSFERRED PRIORITY: NORMAL FILES: 1 / 1 BYTES: 2555 / 2555 (100%) Transfer complete.

Шаг №3: Разрешаю выполнение PowerShell скриптов:

Win + X -> Command Prompt (Admin)

12345678910111213C:\Windows\system32> powershell PS C:\Windows\system32> set-executionpolicy Unrestricted PS C:\Windows\system32> cd C:\Script PS C:\Script> .\RDPConnectionParser.ps1 Writing File: C:\Users\aolloadm\Desktop\2020-01-27T09.21.19_RDP_Report.csv Done! PS C:\Script>

Шаг №4: Смотрю как выглядит лог, можно открыть его через Notepadd++ или же Excel, но вывод если в Excel не в колонках.

Лог работы скрипта RDPConnectionParser.ps1

Шаг №5: Нужно отформатировать:

А) Открыв его в блокноте сохраняю как файл расширением txt

Б) Запускаем Excel, создаем новую книгу, файл – Открыть и указываем сохраненный ранее файл с расширением txt

Полученный результат:

Результат форматирования в Excel

По сути это анализ логов:

  • Event View (Local): Applications and Services Logs – Microsoft – Windows – TerminalServices – LocalSessionManager – Operational

Но скрипт не анализирует лог

  • Event Viewer\Applications and Services Logs\Microsoft\Windows\TerminalServices-RemoteConnectionManager

И

  • Event Viewer\Windows Logs\Security (Event ID: 4624, Logon Type: 10)

На заметку: Я бы посоветовал также включить архивирование логов для каждого файла логов и выставить максимальный размер лога файлов через правый клик мышью открыв свойства:

  • Maximum log size (KB): 65536
  • When maximum event log size is reached: Archive the log when full, do not overwrite events

На заметку: В зависимости от того как разрастаются логи («%SystemRoot%\System32\Winevt\Logs\*») уже либо копировать их на удаленную систему либо удалять через планировщик.

На заметку: Может стоит настроить централизованный сбор логов на подобии LogAnalyzer (я его когда-то использовал).

Шаг №6: Задача: Сформировать отчет тех, кто подключался к терминальному серверу с 24.01.2020

1PS C:\Script> .\RDPConnectionParser.ps1 -StartTime “January 24, 2020”

Шаг №7: Но, наверное, не правильно снимать лог с самого терминального сервера, т.к. IP Address – это откуда было произведено подключение, т.е. те компьютеры, которые в правиле Remote Desktop Gateway предопределены кто могут. Значит нужно сформировать точно такой же лог с сервера с ролью Remote Desktop Gateway (это на srv-rdsg.polygon.com):

Проделываю шаги «Шаг №1» & «Шаг №2», да вывод есть. Но вот только у меня же он выставлен в интернет через правило проброс порта при подключении из вне на WAN-IP:443 -> srv-rdsg.polygon.com:443 где записи внешних IP адресов. А все потому что на работе «Шаг №1» о попытках авторизации был деактивирован прошлым системным администратором. Задачи сбора логов не стояло, вот отключено и было.

Шаг №8: Есть бесплатная утилита, которая может считывать логи локально и подключившись из интерфейса к другой – имя есть WinLogOnView

Что видит утилита WinLogOnView
  • Отображает даты и время начала сессии и время окончания
  • Вычисляет продолжительность.
  • Как были авторизованы в системе:
  • Interactive - локально
  • Remote Interactive - через RDP соединение
  • Можно выделить несколько строк и сформировать отчет в html

Шаг №9: Вообще коды где искать логи удаленных подключений к серверу в оснастке Event Log локально.

Сетевые логи (Network logs)

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071Microsoft-Windows-Terminal-Services-RemoteConnectionManager Event 1149 A successful RDP client network connection but does not indicate a successful authentication (despite what the log event has as description). System authentication Microsoft-Windows-Security-Auditing Event 4624 + LogonType : 10 or 7 Successful authentication with an account Event 4625 Failed authentication RDP Session Microsoft-Windows-TerminalServices-LocalSessionManager Event 21 Successful RDP logon and session start. Often preceded by an event 22. Event 22 Successful RDP logon and shell start. Often followed by an event 22. Event 24 The user has disconnected from an RDP session Event 25 The user has reconnected to an existing RDP session Event 39 The user formally disconnected from the RDP session. Event 40 The user disconnected from or reconnected to an RDP session Event 23 The user initiated a formal system logoff (versus a simple session disconnect) Microsoft-Windows-Security-Auditing Event 4778 The user reconnected to an existing RDP session. Often paired with ID 25. Event 4779 The user disconnected from from an RDP session. Often paired with ID 24, likely also 39 and 40. Event 4634 A user disconnected from, or logged off, an RDP session. Event 4647 The user initiated a formal logoff (NOT a simple disconnect). Microsoft-Windows-System Event 9009 A user has closed out an RDP connection.

Шаг 10: Сервис RDG не логирует, кто из вне подключается к нему, только из локальной сети. Чуть погодя я стал умнее и перестал так думать.

(Это в моей инфраструктуре)

Даже в оснастке RD Gateway Manager – Monitoring текущее WAN соединение идет от шлюза (у меня на работе TMG), значит можно сформировать лог. У меня на TMG Настроено вести логи в базу. Это так для пояснения.

Смотрим лог

Microsoft Forefront Threat Management – Forefront TMG (srv-gateway01) – Logs & Reports – (Tasks) – Edit Filter

  • Filter by: Rule:Contains:IN.RemoteApp
  • Filter by: Log Record Type: Equals: Firewall or Web Proxy Filter
  • Filter by: Log Time:On or After:28.01.2020 0:00:00

И нажимаю Start Query

Пример полученного и отформатированного отчета в Excel

Пример полученного и отформатированного отчета в Excel от TMG

Самое большое зло этого RDG – это то что в логах фигурирует внешний IP это адрес TMG, а не WAN_IP. А все потому что в настройках правила стоит

Specify how Forefront TMG forwards requests to the published server: “Requests appear to come from the Forefront TMG computer”, хотелось бы видеть «Requests appear to come from the original client

А в логах TMG есть WAN и статус успешно или разъединено, но нет привязки как дальше.

Чуть позже понял где я был не прав говоря, что RDG не логирует WAN-IP адрес.

RDG правильно ведет логи, я просто на тот момент не понимал что он записывает.

Шаг №11: Если на TMG настроить правило проброса порта до терминального сервера, то в логах и через программу WinLogOnView виден внешний WAN-IP и через какую учетную запись был совершен или не совершен вход. Но так можно перебирать учетные записи всего домена или даже заблокировать их неверным вводом пароля, а когда используешь RDG, то только предопределенные могу подключаться из вне.

Шаг №12: Переделал правило на TMG и теперь на RDG все же вижу внешний IP:

Настройки правила:

Вкладка General

  • Name: IN. RDP to TS

Вкладка Action

  • Action: Allow
  • Log requests matching this rule: отмечаю галочкой

Вкладка Traffic

  • Allow network traffic using the following protocol: HTTPS Server

Нажимаю Ports

  • (Firewall Ports) Publish on this port instead of the default port: 20000
  • (Published Server Ports) Send requests to this port on the published server: 443
  • (Source Ports) Allow traffic from any allowed source port

Вкладка From:

  • This rule applies to traffic from these sources: External, Internal (мои IP сети)

Вкладка To:

  • Specify the network address of the server to publish: 10.90.90.11 (это RDG)
  • Specify how Forefront TMG forwards requests to the published server: Requests appear to come from the original client

Вкладка Networks:

  • Selected networks for this listener: External, Internal

Вкладка Schedule:

  • Schedule: Always

Лог смотрится на Remote Desktop Gateway

Event View (Local): Applications and Services Logs – Microsoft – Windows –TerminalServices-Gateway – Operational

Event ID: 313 – Нет-то подключается с WAN—ip используя учетные данные

  • The user "aollo@polygon.com", on client computer "176.193.190.74:50170", has initiated an inbound connection. This connection may not be authenticated yet.

Event ID: 312 – Не прошла аутентификация

  • The user "aollo@polygon.com", on client computer "176.193.190.74:50166", has initiated an outbound connection. This connection may not be authenticated yet.

Event ID: 200 – Прошел авторизацию политики

  • The user "POLYGON\AOllo", on client computer "176.193.190.74", met connection authorization policy requirements and was therefore authorized to access the RD Gateway server. The authentication method used was: "NTLM" and connection protocol used: "HTTP".

Event ID: 300 – после переключение на srv—ts02-host

  • The user "POLYGON\AOllo", on client computer "176.193.190.74", met resource authorization policy requirements and was therefore authorized to connect to resource "srv-ts02-host.polygon.com".

Event ID: 303 – Продолжительность политики

  • The user "POLYGON\AOllo", on client computer "176.193.190.74", disconnected from the following network resource: "srv-ts02-host.polygon.com". Before the user disconnected, the client transferred 2152 bytes and received 2006 bytes. The client session duration was 0 seconds. Connection protocol used: "HTTP".

Вот скрипт на PowerShell который позволяет из «User Data» формировать отчет:

1234567891011121314$Events = Get-WinEvent -FilterHashtable @{Logname = “Microsoft-Windows-TerminalServices-Gateway/Operational” ; ID = 300,302,303} $ArrayList = New-Object System.Collections.ArrayListForeach ($Event in $Events){[xml]$Xml = $Event.ToXml()$Row = “” | Select Username,TimeCreated,IPAddress$Row.Username = $Xml.Event.UserData.EventInfo.Username$Row.TimeCreated = $Event.TimeCreated.ToString()$Row.IPAddress = $Xml.Event.UserData.EventInfo.IpAddress[void]$ArrayList.Add($Row)} $ArrayList | export-csv C:\script\log.csv -nti

Теперь дабы подключиться из вне нужно указывать сервер шлюза удаленных рабочих столов:

  • Компьютер: srv-ts02-host.polygon.com
  • Имя сервера: mail.polygon.com:20000

А все остальное как раньше.

Шаг №13: Раз мое руководство хочет видеть Excel документ кто из авторизованного списка подключался: учетная запись, дата и время, то в скрипте выше оставляем только ID=300 и добавляем колонку Resource означающую куда инициализировано подключение:

123456789101112131415$Events = Get-WinEvent -FilterHashtable @{Logname = “Microsoft-Windows-TerminalServices-Gateway/Operational” ; ID = 300} $ArrayList = New-Object System.Collections.ArrayListForeach ($Event in $Events){[xml]$Xml = $Event.ToXml()$Row = “” | Select Username,TimeCreated,IPAddress,Resource$Row.Username = $Xml.Event.UserData.EventInfo.Username$Row.TimeCreated = $Event.TimeCreated.ToString()$Row.IPAddress = $Xml.Event.UserData.EventInfo.IpAddress$Row.Resource = $Xml.Event.UserData.EventInfo.Resource[void]$ArrayList.Add($Row)} $ArrayList | export-csv C:\script\log.csv -nti
Самый правильный отчет от роли Remote Desktop Gateway

Итого задача выполнена.

По правильному я бы создавал VPN соединение от клиента до ресурсов компании где уже этой под сетью рулил и соответственно мог бы опознать кто и куда подключается.

Тут если посмотреть на заметку «Настройка подключения к RDG на pfSense 2.4.4»  — я же вижу WAN адрес который авторизовался на RDG

На заметку: Не претендую на уникальность, но оформляя заметку понял как работает и как и где за что отвечает логирование от роли Remote Desktop.

Итого, данная заметка прояснила некоторые моменты, сформировала требования к понятию логирования RDP соединений, что и где смотреть. Дабы не заниматься ручным трудом возможно стоит посмотреть в сторону централизованного сбора логов (к примеру инструмент LogAnalyzer или на основе Windows сервиса) или писать под конкретную задачу PowerShell скрипт. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.