Продолжаю тему мониторинга различных систем и метрик серверов с помощью известной и бесплатной системы мониторинга заббикс. Сегодня я расскажу, как настроить мониторинг openvpn подключений в zabbix с помощью автообнаружения конфигов пользователей. Способ придуман не мной, приведу ссылку на github страницу проекта.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Содержание:
Введение
Идея настроить мониторинг openvpn подключений с помощью zabbix витала у меня давно, но никак не доходили руки. Когда выбрал время и сел настраивать, сходу не придумал, а как же лучше это сделать. Так как в задаче много нюансов, то и подходов тоже может быть несколько.
Изначально я думал как-нибудь распарсить лог openvpn и вытаскивать подключенных пользователей оттуда. После того, как внимательно посмотрел на основной лог, понял, что это не самая простая задача, пришлось бы повозиться, чтобы все отладить.
Перед настройкой решил погуглить и посмотреть, что уже есть из готового. И сразу же нашел вот этот проект - https://github.com/Grifagor/zabbix-openvpn. Идею быстро понял, оценил все плюсы и минусы и решил не заморачиваться сам, а взять готовое, благо тут все в комплекте:
- Скрипты
- Конфиги
- Шаблон с автообнаружением, графиками и триггерами.
Шаблон имеет следующие элементы в своем составе:
- Итемы для мониторинга за полученным и переданным трафиком пользователя.
- Итемы для мониторинга за статусом подключения, отключения пользователя.
- Триггер со срабатыванием на подключение и отключение пользователя.
- График полученных, отправленных данных в байтах.
- График со статусом подключения пользователя.
- Количество подключенных пользователей к openvpn серверу.
Все эти итемы, графики и триггеры создаются автоматически для каждого пользователя.
Минус один и весьма существенный - добавление итемов в виде отдельных пользователей работает через автообнаружение конфигураций пользователей в директории с ccd. Для того, чтобы приведенный способ мониторинга openvpn подключений работал, у вас должны существовать индивидуальные конфигурации пользователей, заданные в конфиге openvpn параметром client-config-dir.
Сами конфигурации пользователей могут быть пустыми. Их содержимое не используется. Они нужны только для того, чтобы получить имя пользователя и затем по этому имени анализировать лог файл состояния openvpn, настроенный с помощью параметра status в конфигурации openvpn сервера.
В принципе, скрипт обнаружения пользователей можно переделать и искать логины по сертификатам, если они у вас хранятся на сервере. Но с этим тоже есть нюансы. Какие-то сертификаты могут быть отозваны, либо вообще не храниться на сервере. Им там, по большому счету, делать нечего.
С учетом указанных особенностей мониторинга openvpn, переходим к настройке. Возможно, у меня что-то не будет совпадать точь в точь с тем, что есть в репозитории github, так как редактировал под свои реалии, причем достаточно давно. Нюансов уже не помню, буду приводить свои конфиги как есть.
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
То же самое на Debian 10, если предпочитаете его:
Настройка zabbix-agent на openvpn сервере
Для настройки мониторинга за openvpn подключениями, создадим скрипт автообнаружения пользователей. У меня директория для ccd файлов следующая - /etc/openvpn/ccd-users-udp. В связи с этим делаем скрипт /etc/zabbix/scripts/discover_vpn.sh
#!/bin/bash path=/etc/openvpn/ccd-users-udp users=`ls -F $path | sed 's/\///g'` # array of users name echo "{" echo "\"data\":[" comma="" for user in $users do echo " $comma{\"{#VPNUSER}\":\"$user\"}" comma="," done echo "]" echo "}"
Сохраняем его, назначаем владельца zabbix и делаем исполняемым.
# chown zabbix. discover_vpn.sh && chmod +x discover_vpn.sh
Запустите файл и проверьте, что он выводит список пользователей из директории ccd в json формате.
Далее создаем конфиг с Userparameters - /etc/zabbix/zabbix_agentd.d/openvpn.conf следующего содержания:
UserParameter=discovery.openvpn,/etc/zabbix/scripts/discover_vpn.sh UserParameter=user_status.openvpn[*], cat /var/log/openvpn/status-users-udp.log | grep $1, >/dev/null && echo 1 || echo 0 UserParameter=num_user.openvpn, cat /var/log/openvpn/status-users-udp.log | sed -n '/Connected Since/,/ROUTING/p' | sed -e '1d' -e '$d' | wc -l UserParameter=user_byte_received.openvpn[*], if [ "`grep -c $1, /var/log/openvpn/status-users-udp.log`" != "0" ]; then cat /var/log/openvpn/status-users-udp.log | grep $1, | tr "," "\n" | sed -n '3p' ; else echo "0" ; fi UserParameter=user_byte_sent.openvpn[*], if [ "`grep -c $1, /var/log/openvpn/status-users-udp.log`" != "0" ]; then cat /var/log/openvpn/status-users-udp.log | grep $1, | tr "," "\n" | sed -n '4p' ; else echo "0" ; fi
Не забудьте в конфиге поменять пути к status логу. У меня он живет по адресу /var/log/openvpn/status-users-udp.log.
Перезапускаем zabbix-agent.
# systemctl restart zabbix-agent
Проверяем работу итемов.
# zabbix_agentd -t discovery.openvpn
Вы должны увидеть вывод в формате json, как и при запуске скрипта в консоли. Если это не так, то разбирайтесь, в чем проблема. Возможно права на скрипт не дали или ошиблись в конфигурации агента.
Далее можно взять какого-нибудь пользователя, который в данный момент подключен к openvpn серверу и посмотреть по нему информацию.
# zabbix_agentd -t user_status.openvpn[ovpn_user1] user_status.openvpn[ovpn_user1] [t|1]
Агент возвращает 1, что значит, что пользователь подключен. Таким же образом можете проверить все остальные UserParameter. После того, как убедитесь, что все работает, можете переходить к настройке zabbix сервера для мониторинга за openvpn подключениями.
Мониторинг openvpn подключений в zabbix
На сервере zabbix никакой особой настройки для мониторинга openvpn подключений делать не надо. Достаточно просто импортировать готовый шаблон. Вы можете его взять на гитхабе, либо скачать у меня. Насколько я помню, не менял в нем ничего. Но это не 100%. В любом случае, если изменения и есть, то косметические. Например, интервалы обновления, либо перевод названий.
Скачать шаблон для openvpn подключенийПосле добавления шаблона, прикрепите его к хосту с openvpn сервером, где ранее настроили zabbix-agent. После этого данные начнут поступать на сервер мониторинга. Проверить это, как обычно, можно в Latest data.
После подключения какого-нибудь пользователя, вы получите уведомление и увидите информацию об этом на дашборде.
Если вам это не нужно, то отключите в шаблоне триггер. Если сам триггер все же нужен, но не нужны уведомления о подключениях пользователей, отключите уведомления по триггеру в общем правиле по отправке оповещений, если оно используется.
В общем, кастомизируйте данный шаблон на свой вкус. На этом по самой настройке мониторинга за openvpn пользователями на сервере zabbix все.
Заключение
Описанный способ мониторинга за подключениями openvpn пользователей не идеальный. Надежнее не привязываться к готовому списку пользователей, а напрямую анализировать лог файл openvpn. Иначе, если по какой-то причине пользователя не будет в списке, который формируется правилом автообнаружения, вы ничего не узнаете о подключениях. Особенно это актуально, когда мониторинг используется не просто для сбора информации, а для целей обеспечения безопасности, где важно фиксировать абсолютно все подключения.
В данной статье рассмотрен только мониторинг за подключениями пользователей. Если вам нужно мониторить работу самой службы openvpn, то можете это сделать по другой моей статье - мониторинг работы служб linux.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
добрый день, а будет ли работать шаблон в 6,7 версии забикса и может ли скрипт работать с забикс агент актив2, и быть начеленным на syslog , при проверке агентом из консоли подлюченных пользователей - агент говрит что не поддерживает данную метрику. Может подскажете куда копать или при моей конфигурации данный скрипт не подходит?
Кому интересно собрал шаблон OpenVPN-LLD.zip для Zabbix
Данные берутся из через sqlite3 /usr/local/openvpn_as/etc/db/log.db
Более подробно тут https://diyit.ru/viewtopic.php?t=2010
Интересное решение. Надо будет попробовать.
Добрый день!
Все получается прекрасно, даже количество общих подключений отрабатывает. в логах информация отображается, все отлично. Но тем не менее индивидуальные данные не отображаются - т.е. увидеть, что конкретный пользователь подключен нельзя((
Прочитав последнее сообщение в ветке полагаю, что виной всему очередные изменения, но как их побороть так и не нашел. Может сталкивался кто?
а можно как то в забиксе попонятнее пользователей подписать, у меня они все при генерации сертификатов называются почти одинаково:
user11, user12 и т д, а мне бы понимать кто это написать "user11 - stick monitor"
I cannot get data from discover_vpn.sh
Can you help me? Thanks
Заработало после изменения прав с root на zabbix на файл в котором содержатся данные о пользователях (в моем случае status server1-status.log)
Спасибо за статью, да и вообще, за всю Вашу деятельность.
Special characters "\, ', ", `, *, ?, [, ], {, }, ~, $, !, &, ;, (, ), , |, #, @, 0x0a" are not allowed in the parameters.
Что делать?
Здравствуйте Владимир. Подскажите пожалуйста какой вывод будет у команды zabbix_agentd -t num_user.openvpn
У меня нет сейчас под рукой сервера с этими настройками.
я уже разобрался с этим, спасибо
Это не приватные сообщения, это комменты - читают все, пиши для всех.
Обиженки. Не нравится, не пользуйся. Пользуешься - веди себя как человек.
Получил динамический список пользователей (SED):
Спасибо за полезную информацию.
Была лишняя запятая.
Подправил
Не хватало привилегий делал в pfSense. Вышел из положения созданием симлинка через кронтаб:
Нашёл иное решение проблемы автообнаружения пользователей без использования ccd. При генерации сертификата вместе с ключами меняется файл index.txt (я использовал пакет easy-rsa из репозиториев). В файле упоминаются все выпущенные сертификаты. В начале строки с действующим сертификатом стоит буква V, показывающая, как я понял, что сертификат валиден. Осталось в скрипте автообнаружения прописать что-то вроде "users=`grep "V" /etc/zabbix/scripts/index.txt | grep -v "vm-vpn-1" | cut -d= -f7 | cut -d\/ -f1`" и список текущих пользователей готов.
Файл index.txt надо после каждой генерации скрипта переносить в папку со скриптами заббикса, например, потому что нечего OpenVPN-серверу глядеть куда не надо :)
И всё будет работать. За скрипт и статью спасибо.
Да, я тоже знаю этот файл и так же думал его распарсить. У меня как-то не пошла идея с мониторингом, поэтому развивать не стал. По факту никому он оказался не нужен.
Единственное нормальное хавто, и нужный.
Добрый день.
Делал все по инструкции, менял лишь пути к скрипту и логам.
К сожалению в элементах данных напротив необходимого элемента (Template App OpenVPN: openvpn num_user) пишет значение Not supported и восклицательный знак Unsupported item key.
Прошу помощи, куда копать, и как можно решить данную проблему.
Zabbix 4.0 Appliance
Так же пробовал другие варианты и инструкции, но там вообще глушняк.
Начать нужно с того, что проверить все итемы через консоль на сервере с zabbix-agent. Примеры у меня показаны в статье:
zabbix_agentd -t discovery.openvpn
zabbix_agentd -t user_status.openvpn[ovpn_user1]
и т.д.
Проверял, и еще раз сейчас перепроверил, они отрабатывают как нужно.
Сервер заббикс общается с агентом нормально(так же работает шаблон linux), данные идут.
А что можно еще проверить?
По логам сервера zabbix бьется ошибка
964:20200128:083301.896 item "192.168.0.15:num_user.openvpn" became not supported: Unsupported item key.
В принципе, других ошибок по хосту 192.168.0.15(OpenVPN Server) я не вижу
Продолжаю копать.
Параметры UserParameters воткнул в конфиг агента заббикса.
Чтобы проверить приходят ли запросы от итемов на сервер заббкса, поменял выдал полные права пользователю заббикс
в папке /etc/sudoers.d создал фаил zabbix_openvpn, и прописал в нем
Defaults:zabbix !requiretty
zabbix ALL=(ALL) NOPASSWD: ./etc/openvpn/discover_vpn.sh
Зашел на сервер заббикса, и выполнил команду
zabbix_get -s 192.168.0.15 -k discovery.openvpn
в итоге получил нормальный вывод, как от команды zabbix_agentd -t discovery.openvpn на самом клиенте.
{
"data":[
{"{#VPNUSER}":"11111"}
,{"{#VPNUSER}":"22222"}
,{"{#VPNUSER}":"33333"}
]
}
Однако все так же не могу побороть проблему, все так же статус в Discovery rules - Unsupported item key.
Для проверки работает ли вообще передача параметров, создал простенький итем, и указал в конфиге агента подходящий параметр, параметр передается корректно.
Какие есть еще варианты проверки, что может быть? Все таки очень хотелось бы, чтобы данный функционал заработал.
Возникла сложность:
[root@openvpn ~]# sudo -u zabbix /etc/zabbix/scripts/discover_vpn.sh
ls: cannot access /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued: Permission denied
{
"data":[
]
}
Скрипт не выполняется от имени заббикса, права не особо помогли. в чем может быть сложность
sudoers так же правился но ошибка та же
openvpn num_user - работает
Как лучше обойти предоставление прав так глубоко?
Хотелось бы узнать про уровень логирования в настройках server.conf,userparameter только первый отрабатывает,в остальных пишет что zabbix unsuported
Насколько я помню, это несоответствие типов данных между скриптом и шаблоном забикса
Хмм... Можно сделать по другому: в файле конфигурации openvpn использовать опцию "client-connect" - данная опция вызывает внешний скрипт при подключении к серверу кого-либо. А в этом скрипте уже прописываем всё, что душе угодно, к примеру оповещение на почту или запись в бд. С помощью следующих переменных получаем доп. информацию: ${common_name}, ${HOSTNAME}, ${untrusted_ip}, ${ifconfig_pool_remote_ip}
Интересная возможность. Но мне сходу не приходит в голову, как это в заббикс красиво завернуть.
Да, zabbix в данном случае ни к чему. Лучше прикрутить уже к готовому Openvpn монитору https://github.com/furlongm/openvpn-monitor
ошибка zabbix_agentd -t num_user.openvpn[test]
num_user.openvpn[test] [m|ZBX_NOTSUPPORTED] [Item does not allow parameters.]
В конфиге server.conf выставлен параметр status-version 3
Openvpn 2.4.7
а можете сбросить xml под Zabbix 4.0. при импорте шаблона нет триггеров, всего один элемент данных
Там правило автообнаружения есть. Оно создает итемы и триггеры на хостах.
На стороне zabbix сервера а именно в "Элементах данных" пиишет что Value "cat: /var/log/openvpn/openvpn-status.log: Permission denied
0" of type "string" is not suitable for value type "Numeric (unsigned)"
Так видно же, что ошибка в том, что у zabbix нет доступа к логу openvpn-status.log.
меня такая же проблема. На сервере вижу данные о количестве подключений, вижу кто активен, приходят оповещения о новых подключениях. Но данных по понятым/переданным байтам - нет, нули...
вам как-то удалось побелить эту проблему?
Спасибо помогло частично openvpn num_user отображает нормально,остальные параметры 0
У меня такая же проблема. На сервере вижу данные о количестве подключений, вижу кто активен, приходят оповещения о новых подключениях. Но данных по понятым/переданным байтам - нет, нули...
вам как-то удалось побелить эту проблему?
Сам отвечаю на свой вопрос...
Проблема, по всей видимости, в том, что формат лога OpenVPN изменился и когда мы агентом пытаемся взять из него данные, то вместо информации о принятых/переданных байтах получаем IP адреса.
Сама проблема в этом файле:
конфиг с Userparameters - /etc/zabbix/zabbix_agentd.d/openvpn.conf следующего содержания:
особое внимание на строчки (именно по ним агент получает данные о принятых/переданных байтах):
UserParameter=user_byte_received.openvpn[*], if [ "`grep -c $1, /var/log/openvpn/status-users-udp.log`" != "0" ]; then cat /var/log/openvpn/status-users-udp.log | grep $1, | tr "," "\n" | sed -n '3p' ; else echo "0" ; fi
UserParameter=user_byte_sent.openvpn[*], if [ "`grep -c $1, /var/log/openvpn/status-users-udp.log`" != "0" ]; then cat /var/log/openvpn/status-users-udp.log | grep $1, | tr "," "\n" | sed -n '4p' ; else echo "0" ; fi
Для совсем чайников (как в общем и я сам) в кратце объясню то, что эти команды делают:
1) проверяют есть ли пользователь с заданным именем в логе
2) если есть начинают разбирать лог следующими командами, которые передают данные одна - другой по цепочке.
(это как раз вот это место в скрипте:
cat /var/log/openvpn/status-users-udp.log | grep $1, | tr "," "\n" | sed -n '4p'
здесь происходит следующее:
- читается файл лога (команда cat и дальше расположение каталога с файлом лога) и передаем данные следующей команде (через | ) grep
- командой grep выделяем из всего лога строчку с именем пользователя и так же как и в прошлой команде через | передаем данные следующей команде tr
- командой tr заменяем все запятые в строке с именем пользователя символом перевода строки и так же через | передаем данные следующей команде sed. Результатом действия команды tr будет разложенный по строчкам лог пользователя, где на каждой отдельной строке будет соответствующие данные из лога.
- командой sed -n '4p' мы выводит (и передаем агенту) 4-ю строчку. Вот тут и есть проблема!
У меня строка с логом пользователя выглядит так:
СLIENT_LIST,user1,Reap_IP,Virtual_IP,Virtual_IPV6,Byte_Received,Byte_Sent, и т.д... нам далее не очень интересно.
А теперь, если мысленно заменить запятые в этой строчке на символы перевода строки, мы получим, что нужные нам данные (Byte_Received,Byte_Sent) будут располагаться не на 3-й и 4-й строке, как в примере автора, а на 6 и 7 строках.
Если считывать данные из 3-й и 4-й строки то мы получаем вместо переданных/принятых байтов информацию об IP адресе с которого подключается клиент и IP адрес, который ему присвоен в системе. Данные совершенно не в том, формате, в котором их ожидает получать zabbix => и ошибка в его логах type "string" is not suitable for value type "Numeric (unsigned)
Соответственно, строки конфига zabbix агента в моем случае должны быть такими:
UserParameter=user_byte_received.openvpn[*], if [ "`grep -c $1, /var/etc/openvpn/openvpn-status.log`" != "0" ]; then cat /var/etc/openvpn/openvpn-status.log | grep $1, | tr "," "\n" | sed -n '6p' ; else echo "0" ; fi
UserParameter=user_byte_sent.openvpn[*], if [ "`grep -c $1, /var/etc/openvpn/openvpn-status.log`" != "0" ]; then cat /var/etc/openvpn/openvpn-status.log | grep $1, | tr "," "\n" | sed -n '7p' ; else echo "0" ; fi
Для профи, конечно, это объяснение слишком развернуто, но надеюсь будет полезно тем, кто, как и я, нашел эту инструкцию и делает четко по ней... но ничего не получается. Как всегда, нужно все делать осознанно, вдумываясь в то, что и зачем делаем.
Спасибо за полезную информацию.