Мониторинг пользователей RDP терминала Windows с помощью Zabbix

zabbix rdp monitoring

Появился интерес мониторить с помощью 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.

zabbix rdp monitoring
Мониторинг RDP сессий в Zabbix
rdp session graph zabbix
График RDP сессий в Zabbix

Скачать шаблон и скрипты с Github

Для удобства залил все наработки на github https://github.com/dkplayer/zabbix-windows-rdp-users

Вопросы, дополнения и здравая критика приветствуются в комментариях.

Оцените статью
Добавить комментарий

Внимание! Нажимая кнопку "Отправить комментарий" вы соглашаетесь с политикой конфиденциальности сайта.

  1. Игорь

    Добрый день! Использую забикс 6.0. Сделал все по инструкци, но у меня ошибка в заббикс, что он не понимает ключи rdps и rdp

    Ответить
    1. dkplayer автор

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

      Ответить
  2. андрей

    Здравствуйте, спасибо за ваши труды и наработки. Но честно говоря (как нубу) не понятно куда и какие класть файлы чтобы работало .
    у вас на гите — 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 с прикрученными серваками, но не понимаю что из ваших наработок надо куда положить, чтобы это работало.
    Если не сложно — дополните пожалуйста для тех кто в танке, что куда кладём и где включаем. Спасибо

    Ответить
    1. dkplayer автор

      Целью статьи не было донести все основы работы Zabbix, для этого у разработчиков существует обширная документация в том числе на русском языке. Пересказывать ее считаю бессмысленно. Изучите ее и еще раз мою статью и вопросы отпадут вы с легкостью поймете, что zbx_windows_rdp_template.yaml — файл шаблона, который нужно загрузить на сервер Zabbix и потом подключить к серверу, который собираетесь мониторить. Ну а про скрипт и конфиг агента и так написано в статье читайте внимательно.

      Ответить
  3. Евгений

    Кое как заработало это на Zabbix 6. За что спасибо.
    Вопрос как можно настроить триггер на подключение пользователя не из белого списка. Сталкиваюсь с проблемой в решении в том что может подключиться одновременно пользователь из белого списка и «враг». Очень легко вычленить определенное имя из белого списка, а вот как дальше не знаю. Есть идеи?

    Ответить
    1. dkplayer автор

      Евгений, я не очень понял как вы собираетесь вычленять «врага». Если на сервер зашёл пользователь со своим логином и паролем, но ему туда нельзя заходить, то это решается ограничением доступа, а не мониторингом. Просто запретите ему туда заходить. А если зашёл злоумышленник, то он зашёл с учетной записью легитимного пользователя (подобрав или украв пароль), не будет никаких признаков, кроме ip адреса и его активности на сервере, по которым вы сможете его отличить. Это контролируется уже другими средствами, а не мониторингом. Или я вас не понял и тогда поясните 🙂

      Ответить
      1. Евгений

        В целом вы правы что это делается другими средствами. В моем случае есть «враги» которым можно. Например, директор и куча его замов. И вроде как их всех можно добавить в список, но я хочу пойти другим путем.

        Ответить