Задача: Как сделать так чтобы Zabbix следил работает ли RDP служба на удаленном сервере(ах)

+ отображал активность и неактивность, удаленный адрес с которого активные подключены и т.д.

Исходные данные:

Тестовый полигон на базе Debian 10 + Proxmox 6 пока с двумя виртуальными машинами

Zabbix Server 4.4 on Ubuntu 18.04 Server

  • Hostname: srv-zabbix
  • IP: 172.33.33.17

Server 2012 R2 std + Role Terminal Server

  • Hostname: srv-ts01
  • IP: 172.33.33.47

Шаг №1: Поднимаю на VM своего тестового полигона операционную систему Ubuntu 18.04 Server amd64, а на нее устанавливаю сервис мониторинга Zabbix 4.4 по заметке

Разбор установки Zabbix 4.4 на Ubuntu 18.04 Server

Шаг №2: Поднимаю на VM своего тестового полигона через сервис FOG Project операционную систему Windows Server 2012 R2 Std через заметку:

Автоматизация установки Server2012R2 + WinPE + Virtio + Fog on Proxmox 6

Шаг №3: Устанавливаю роль терминального сервера на srv-ts01

Шаг №4: Т.к. в рамках этой заметки не используется доменная структура, то на терминальном сервере создаю пользователей и помещаю их в группу на удаленное подключение по RDP:

C:\Windows\system32>net user alektest Aa1234567 /add

C:\Windows\system32>net localgroup "Remote Desktop Users" alektest /add

пусть будут учетные записи с alektest - alektest4

Шаг №5: Также понадобятся несколько рабочих станций с которых инициирую подключение через mstsc к своему терминальному серверу. Они также быстро и легко у меня разворачиваются через заметки:

Автоматизация установки W10X64 + WinPE + Virtio + Fog on Proxmox 6

Автоматизация установки W7X64 + WinPE + Virtio + Fog on Proxmox 6

Шаг №6: Теперь перейдем собственно к делу, к примеру посчитать сколько RDP сессий на терминальном сервере, сделать это можно через заметку:

Получить количество RDP-сессий на терминальных серверах

итог выполнения скрипта

active.bat

set COUNTA=

SET /a COUNTA=0

FOR /f "TOKENS=1 DELIMS= " %%G IN ('query session /server:srv-ts01 /vm ^|find /I "rdp-tcp"') DO SET /a COUNTA+=1

ECHO Active sessions on srv-ts01 = %COUNTA%,^|usersconnected=%COUNTA%

C:\Windows\system32>cd /d c:\Script

c:\Script>active.bat

Active sessions on srv-ts01 = 3,|usersconnected=3

итак если еще применить форматирование к выводу, то может мониторить количество.

Шаг №7: Но лучше будет задействовать модуль PSTerminalServices, о том как его инсталлировать в систему у меня опять же заметка «Как установить модуль PSTerminalServices»

Шаг №8: Устанавливаю Zabbix Agent 4.4.0 на srv-ts01

На момент 22.04.2020 версия агента доступная для скачивания: 4.4.5, но я буду задействовать 4.4.0, т.к. сервер тоже 4.4.0. Пока обновляться не вижу смысла.

«Как установить Zabbix Agent 4.4.0 on Server 2012 R2 Std»

Шаг №9: Создаю скрипт со следующим содержанием в каталоге C:\Script

Name: rdpts.ps1

# Monitoring Windows RDP - Terminal Server

Param(

[string]$select

)

# Active Users: Domain Name, Username, Computer Name, IP Address

if ( $select -eq 'ACTIVE' )

{

Import-Module PSTerminalServices

Get-TSSession -State Active -ComputerName localhost | foreach {$_.DomainName, $_.UserName, $_.ClientName, (($_.IPAddress).IPAddressToString), ""}

}

# Total Active Users

if ( $select -eq 'ACTIVENUM' )

{

Import-Module PSTerminalServices

Get-TSSession -State Active -ComputerName localhost | foreach {$_.UserName} | Measure-Object -Line | select-object Lines | select-object -ExpandProperty Lines

}

# Inactive Users: Domain Name, Username

if ( $select -eq 'INACTIVE' )

{

Import-Module PSTerminalServices

Get-TSSession -State Disconnected -ComputerName localhost | where { $_.SessionID -ne 0 } | foreach {$_.DomainName, $_.UserName, ""}

}

# Toal Inactive Users

if ( $select -eq 'INACTIVENUM' )

{

Import-Module PSTerminalServices

Get-TSSession -State Disconnected -ComputerName localhost | where { $_.SessionID -ne 0 } | foreach {$_.UserName} | Measure-Object -Line | select-object Lines | select-object -ExpandProperty Lines

}

# List of Remote Computer Names

if ( $select -eq 'DEVICE' )

{

Import-Module PSTerminalServices

Get-TSSession -State Active -ComputerName localhost | foreach {$_.ClientName}

}

# List of Remoter IP Addresses

if ( $select -eq 'IP' )

{

Import-Module PSTerminalServices

Get-TSSession -State Active -ComputerName localhost | foreach {(($_.IPAddress).IPAddressToString)}

}

Шаг №10: Копирую данный скрипт из «Шаг №9» в каталог C:\zabbix\scripts. Если каталога scripts нет то создаем — это для удобства, что все скрипты будут в одном месте.

Шаг №11: Вношу изменения в конфигурационный файл агента Zabbix на вызов данного скрипта

C:\Zabbix\zabbix_agentd.conf

UserParameter=rdpts[*],powershell.exe -noprofile -executionpolicy bypass -File C:\Zabbix\scripts\rdpts.ps1 $1

и перезапускаю сервис «Zabbix Agent»

Win + X -> Command Prompt (Admin) - "Yes"

C:\Windows\system32>net stop "Zabbix Agent"

C:\Windows\system32>net start "Zabbix Agent"

Шаг №12: Проверяю, что через Zabbixагент с помощью запуска скрипта смогу получать какую-либо информацию с учетом его функционала:

Win + X -> Command Prompt (Admin) - "Yes"

C:\Windows\system32>cd /d c:\Zabbix

c:\Zabbix>zabbix_get.exe -s 127.0.0.1 -p 10050 -k rdpts[ACTIVE]

zabbix_get.exe [4848]: Get value error: ZBX_TCP_READ() failed: [0x00002746] An existing connection was forcibly closed by the remote host.

zabbix_get.exe [4848]: Check access restrictions in Zabbix agent configuration

Это значит, Вам нужно в конфигурационный файл C:\Zabbix\zabbix_agentd.conf добавить к параметру Server значение, как IP&DNS вашего Zabbix-сервера, так и localhost, т.е. будет вот так:

Server=172.33.33.17,127.0.0.1

после перезапустить Zabbix агент.

c:\Zabbix>zabbix_get.exe -s 127.0.0.1 -p 10050 -k rdpts[ACTIVE]

SRV-TS01

ekzorchik

navy

172.33.33.16

SRV-TS01

alektest

EKZORCH-D9VNKEM

172.33.33.11

SRV-TS01

alektest1

EKZORCH-GTVREI9

172.33.33.43

Шаг №13: Импортирую найденный на просторах интернета шаблон Template__Windows_RDP_Terminal_Server: «Template__Windows_RDP_Terminal_Server.xml»

http://IP&DNS/zabbix (http://172.33.33.17/zabbix) - user&pass - Configuration - Templates - Import

Import file: нажимаю «Выберите файл» — нахожу шаблон в файловой системе и нажимаю «Открыть«, а после нажимаю Import. Вижу статус «Imported successfully«.

Проверяю, что шаблон успешно находится:

Configuration - Templates -

  • Name: Terminal

и нажимаю Apply

вот он добавленный по именем: «Template - Windows Terminal Server RDP»

вот он добавленный по именем: "Template - Windows Terminal Server RDP"

Шаг №14: Создаю ключи для макросов

http://IP&DNS/zabbix (http://172.33.33.17/zabbix) - user&pass - Administration - General

  • Macro: {$RDPPORT}
  • Value: 3389
  • Macro: {$RDPA}
  • Value: 10
  • Description: если более 10 активных то будет сигнал тревоги
  • Macro: {$RDPI}
  • Value: 5
  • Description: если более 5 учетных записей не активны, то сигнал тревоги

и нажимаю после каждого дополнения Add, а затем «Update» и Вы должны увидеть надпись «Macros updates»

Шаг №15: Нацеливаю данный шаблон «Template - Windows Terminal Server RDP» из «Шаг №13» на хост srv-ts01

http://IP&DNS/zabbix (http://172.33.33.17/zabbix) - user&pass - Configuration - Hosts — перехожу в srv-ts01, вкладка Templates - Select - Group: Template RDP и отмечаю галочкой шаблон "Template - Windows Terminal Server RDP" & "Template Module Zabbix agent active", затем нажимаю Select - Update

Шаг №16: Проверяю по хосту srv-ts01 какие данные по нацеленному шаблону из «Шаг №15» будут теперь видны в мониторинге Zabbix:

http://IP&DNS/zabbix (http://172.33.33.17/zabbix) - user&pass - Monitoring - Latest data

  • Hosts groups: Group_TS

и нажимаю Apply

Но что-то данных нет.

Шаг №17: Проверяю с Zabbixсервера какие данные я могу получить

ekzorchik@srv-zabbix:~$ sudo apt-get install -y zabbix-get

ekzorchik@srv-zabbix:~$ zabbix_get -s 172.33.33.43 -k rdpts[ACTIVE]

zabbix_get [23822]: Timeout while executing operation

ekzorchik@srv-zabbix:~$ zabbix_get -s 172.33.33.43 -k rdpts[IP]

zabbix_get [23838]: Timeout while executing operation

Разбираюсь…

Решение:

нужно конфигурационный файл агента привести к виду:

Notepad++ - C:\Zabbix\zabbix_agentd.conf

LogFile=C:\Zabbix\zabbix_agentd.log

EnableRemoteCommands=1

LogRemoteCommands=1

Server=172.33.33.17,127.0.0.1

ServerActive=172.33.33.17

#для активных проверок указываем имя хоста не IP

Hostname=srv-ts01

RefreshActiveChecks=120

Timeout=30

Include=C:\Zabbix\zabbix_agentd.conf.d\

UnsafeUserParameters=1

UserParameter=rdpts[*],powershell.exe -noprofile -executionpolicy bypass -File C:\Zabbix\scripts\rdpts.ps1 $1

Win + X -> Command Prompt (Admin) - "Yes"

C:\Windows\system32>net stop "Zabbix Agent"

C:\Windows\system32>net start "Zabbix Agent"

нужно конфигурационный файл сервера привести к виду:

ekzorchik@srv-zabbix:~$ sudo nano /etc/zabbix/zabbix_server.conf

LogFile=/var/log/zabbix/zabbix_server.log

LogFileSize=0

PidFile=/var/run/zabbix/zabbix_server.pid

SocketDir=/var/run/zabbix

DBHost=localhost

DBName=db_zabbix

DBUser=us_zabbix

DBPassword=612mbddr@

DBPort=3306

SNMPTrapperFile=/var/log/snmptrap/snmptrap.log

Timeout=10

AlertScriptsPath=/usr/lib/zabbix/alertscripts

ExternalScripts=/usr/lib/zabbix/externalscripts

FpingLocation=/usr/bin/fping

Fping6Location=/usr/bin/fping6

LogSlowQueries=3000

StatsAllowedIP=127.0.0.1

ekzorchik@srv-zabbix:~$ sudo systemctl restart zabbix-server

Шаг №18: Проверяю по хосту srv-ts01 какие данные по нацеленному шаблону из «Шаг №15» будут теперь видны в мониторинге Zabbix и с учетом «Шаг №17»

Результат снимаемых данных с srv-ts01 посредством Zabbix

Ура! Заработало, пусть это не мой скрипт, но все равно все что было на просторах интернета допилено и адаптировано для меня и я могу это в дальнейшем использовать в своих наработках на Ubuntu 18.04 Server. На этом пока все, с уважением автор блога Олло Александр aka ekzorchik.