Статистика 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)
1234567891011 | C:\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)
12345678910111213 | C:\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
не в колонках.
Шаг №5:
Нужно отформатировать:
А) Открыв его в блокноте сохраняю как файл расширением txt
Б) Запускаем Excel
, создаем новую книгу, файл – Открыть и указываем сохраненный ранее файл с расширением txt
Полученный результат:
По сути это анализ логов:
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
1 | PS 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
Отображает даты и время начала сессии и время окончания
Вычисляет продолжительность.
Как были авторизованы в системе:
Interactive - локально
Remote Interactive - через RDP соединение
Можно выделить несколько строк и сформировать отчет в html
Шаг №9:
Вообще коды где искать логи удаленных подключений к серверу в оснастке Event Log
локально.
Сетевые логи (Network logs
)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | Microsoft-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
Самое большое зло этого 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 |
Итого задача выполнена.
По правильному я бы создавал VPN
соединение от клиента до ресурсов компании где уже этой под сетью рулил и соответственно мог бы опознать кто и куда подключается.
Тут если посмотреть на заметку «Настройка подключения к RDG на pfSense 2.4.4» — я же вижу WAN
адрес который авторизовался на RDG
На заметку: Не претендую на уникальность, но оформляя заметку понял как работает и как и где за что отвечает логирование от роли Remote Desktop
.
Итого, данная заметка прояснила некоторые моменты, сформировала требования к понятию логирования RDP
соединений, что и где смотреть. Дабы не заниматься ручным трудом возможно стоит посмотреть в сторону централизованного сбора логов (к примеру инструмент LogAnalyzer
или на основе Windows
сервиса) или писать под конкретную задачу PowerShell
скрипт. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.