Появился интерес мониторить с помощью Zabbix сессии пользователей подключающихся к Windows серверу по RDP. Использовать данную возможность можно как для целей мониторинга производительности сервера, так и для целей безопасности. С точки зрения безопасности можно записывать и уведомлять о том какие именно пользователи подключены к серверу. Это полезно для мониторинга подключения к серверам не являющихся терминальными для отслеживания административных подключений. Как установить и минимально настроить Zabbix хорошо показано здесь.
Как узнать кто подключен к серверу по RDP в консоли
За основу решения взял консольную команду qwinsta, которая отображает все активные подключения к серверу по RDP и на консоль. Запущенная без параметров она просто выведет список всех подключений в виде таблицы:
C:\Users\Dyachenko>qwinsta
СЕАНС ПОЛЬЗОВАТЕЛЬ ID СТАТУС ТИП УСТР-ВО
services 0 Диск
>console Dyachenko 1 Активно
31c5ce94259d4... 65536 Прием
rdp-tcp 65537 Прием
Чтобы посчитать количество пользователей можно перенаправить вывод этой команды в команду find и отфильтровать только rdp подключения, а с ключом /c посчитать количество строк — это и будет число подключенных пользователей по RDP.
qwinsta | find /i "rdp-tcp#" /c
Эту команду ровно в таком виде можно использовать в сенсоре Zabbix для подсчета количества подключенных пользователей, рисовать на ее основе график и слать алерты. Но мне захотелось так же отображать в дашборде и алертах список логинов пользователей.
Список пользователей из qwinsta в Powershell
Для этих целей я нагуглил готовое решение и буквально двумя последними строчками доработал его под свои нужды. Я пытался сначала реализовать подобное с помощью bat-скрипта, но в итоге оказалось быстрее и проще на powershell. Вот сам скрипт:
function Get-TSSessions {
param(
$ComputerName = "localhost"
)
qwinsta /server:$ComputerName |
#Parse output
ForEach-Object {
$_.Trim() -replace "\s+",","
} |
#Convert to objects
ConvertFrom-Csv
}
#Get-TSSessions -ComputerName "localhost"
Get-TSSessions -ComputerName "localhost" | where -Property СЕАНС -Like "rdp-tcp#*" | select ПОЛЬЗОВАТЕЛЬ -ExpandProperty ПОЛЬЗОВАТЕЛЬ
Get-TSSessions -ComputerName "localhost" | where -Property SESSIONNAME -Like "rdp-tcp#*" | select USERNAME -ExpandProperty USERNAME
Что он делает:
Функция получает список подключений с помощью qwinsta, после чего все пробелы в выводе меняются на запятые и полученный csv конвертируется в объект powershell, с которым потом очень удобно работать.
Последние две строки собственно получают объекты и выводят столбиком список пользователей без заголовка. Кусок кода с условием where отвечает за то, чтобы вывести только пользователей подключенных по RDP. Если вам нужно так же мониторить тех кто подключен к консоли сервера то необходимо будет эту часть отредактировать.
Два варианта вызова с русским и английским написанием параметров объекта нужны чтобы одинаково работать как на Windows Server с русской локализацией так и с английской. Если будете использовать на сервере с альтернативной локализацией, то раскоментируйте строчку #Get-TSSessions -ComputerName «localhost» и посмотрите вывод объекта, там будут все поля которые нужно прописать по аналогии с русским и английским вариантом.
Настройка на стороне сервера в Zabbix Agent
Все протестировано на серверах под управлением Windows Server 2012, 2016, 2019. В качестве Zabbix Agent использовалась версия Zabbix Agent 2 v 5.4.8. Агент установлен в папку c:\zabbix в которой используется следующая структура:
- c:\zabbix\conf.d — папка с подключаемыми конфигами;
- c:\zabbix\scripts — папка со скриптами для сбора различных параметров для сенсоров Zabbix.
Если у вас другая структура каталогов и размещение агента то внесите соответствующие коррективы. Конфиг для мониторинга подключений по RDP следующего содержания:
UserParameter=rdps[*],qwinsta.exe | find /i "rdp-tcp#" /c
UserParameter=rdp_users[*],powershell.exe -NoProfile -ExecutionPolicy bypass -File "C:\zabbix\scripts\ts_users.ps1"
Необходимо положить в папку conf.d, а представленный выше скрипт в папку scripts.
Шаблон мониторинга RDP подключений для Zabbix 5.4
Данный шаблон добавляет 2 сенсора собирающие данные по количеству подключенных пользователей и их логины, 2 тригера с уровнем «Информация» для отображения на дашборде, а так же график для отрисовки количества подключений. График можно использовать для сравнительного анализа загрузки сервера с количеством подключенных пользователей и таким образом иметь дополнительный индикатор необходимости увеличения ресурсов.
zabbix_export:
version: '5.4'
date: '2021-12-21T09:38:18Z'
groups:
-
uuid: 7df96b18c230490a9a0a9e2307226338
name: Templates
templates:
-
uuid: d6d88a7e91e649a59825a04299287151
template: 'Template RDP User sessions'
name: 'Template RDP User sessions'
groups:
-
name: Templates
items:
-
uuid: 5f7ee37d4ab541138238b3166d906787
name: 'RDP Open Sessions'
key: rdps
tags:
-
tag: Application
value: Security
triggers:
-
uuid: 0598b2cf3f4a44a894999de4eccbe115
expression: 'last(/Template RDP User sessions/rdps)>0'
name: 'Open Sessions on {HOST.NAME}'
opdata: 'Users: {ITEM.LASTVALUE1}'
priority: INFO
-
uuid: 7e507bc13ee54124ab7dd9497738ddfd
name: 'RDP User Sessions'
key: rdp_users
trends: '0'
value_type: TEXT
tags:
-
tag: Application
value: Security
triggers:
-
uuid: 5992e489b8b145b0a921b94ac67d003f
expression: 'last(/Template RDP User sessions/rdp_users,#1)<>""'
name: 'Users on {HOST.NAME}'
opdata: 'Users: {ITEM.LASTVALUE1}'
priority: INFO
graphs:
-
uuid: 9f890c1d1b094e20b2d7e4c152c95f5b
name: 'RDP Users'
show_triggers: 'NO'
graph_items:
-
sortorder: '1'
drawtype: GRADIENT_LINE
color: 199C0D
item:
host: 'Template RDP User sessions'
key: rdps
Вот как выглядит результат в веб-консоли Zabbix.
Скачать шаблон и скрипты с Github
Для удобства залил все наработки на github https://github.com/dkplayer/zabbix-windows-rdp-users
Вопросы, дополнения и здравая критика приветствуются в комментариях.
Добрый день! Использую забикс 6.0. Сделал все по инструкци, но у меня ошибка в заббикс, что он не понимает ключи rdps и rdp
Это ключи из конфига агента, которые необходимо на стороне клиента (сервера) либо добавить в конфиг агента напрямую, либо положить в папку conf.d соответствующий файл конфигурации о чем и написано в статье.
Здравствуйте, спасибо за ваши труды и наработки. Но честно говоря (как нубу) не понятно куда и какие класть файлы чтобы работало .
у вас на гите — 3 файла по сути: zbx_windows_rdp_template.yaml, ts_users.ps1 и rdps.conf.
а еще в статье упоминание о некоем конфиге
UserParameter=rdps[*],qwinsta.exe | find /i «rdp-tcp#» /c
UserParameter=rdp_users[*],powershell.exe -NoProfile -ExecutionPolicy bypass -File «C:\zabbix\scripts\ts_users.ps1»
и вот у меня есть уже настроенный zabbix с прикрученными серваками, но не понимаю что из ваших наработок надо куда положить, чтобы это работало.
Если не сложно — дополните пожалуйста для тех кто в танке, что куда кладём и где включаем. Спасибо
Целью статьи не было донести все основы работы Zabbix, для этого у разработчиков существует обширная документация в том числе на русском языке. Пересказывать ее считаю бессмысленно. Изучите ее и еще раз мою статью и вопросы отпадут вы с легкостью поймете, что zbx_windows_rdp_template.yaml — файл шаблона, который нужно загрузить на сервер Zabbix и потом подключить к серверу, который собираетесь мониторить. Ну а про скрипт и конфиг агента и так написано в статье читайте внимательно.
Кое как заработало это на Zabbix 6. За что спасибо.
Вопрос как можно настроить триггер на подключение пользователя не из белого списка. Сталкиваюсь с проблемой в решении в том что может подключиться одновременно пользователь из белого списка и «враг». Очень легко вычленить определенное имя из белого списка, а вот как дальше не знаю. Есть идеи?
Евгений, я не очень понял как вы собираетесь вычленять «врага». Если на сервер зашёл пользователь со своим логином и паролем, но ему туда нельзя заходить, то это решается ограничением доступа, а не мониторингом. Просто запретите ему туда заходить. А если зашёл злоумышленник, то он зашёл с учетной записью легитимного пользователя (подобрав или украв пароль), не будет никаких признаков, кроме ip адреса и его активности на сервере, по которым вы сможете его отличить. Это контролируется уже другими средствами, а не мониторингом. Или я вас не понял и тогда поясните 🙂
В целом вы правы что это делается другими средствами. В моем случае есть «враги» которым можно. Например, директор и куча его замов. И вроде как их всех можно добавить в список, но я хочу пойти другим путем.
Добрый день!
а вас не затруднит выложить файл шаблона в формате xml (т.к. используем версию заббикса 5.0.4) ?
Прошу прощения, что долго не отвечал. Шаблона в xml у меня нет и времени конвертировать его тоже особо нет. Если внимательно изучите статью, то там руками сделать всё быстрее чем я доберусь сделать вам шаблон в XML 🙂
Доброго времени суток, я установил все настройки что описано выше и у меня скрипт работает но вывод имен пользователей на русском языке работает неккоректно а именно выводит много знаков вопросов и иероглифы вот ужебьюсь с этой проблемой достаточно долго и не могу решить ее у меня стоит zabbix версии 6.4 на базе Mysql на сервере Ubuntu 22.04 буду признателен если поможете с данной проблемой)
Спасибо)
Очевидно проблема с перекодировкой, PowerShell по умолчанию может отдавать UTF-16LE, а в Zabbix нужно UTF8 скорее всего. Смотрите в эту сторону, модифицируйте скрипты.