Мониторинг openvpn подключений пользователей в zabbix

Продолжаю тему мониторинга различных систем и метрик серверов с помощью известной и бесплатной системы мониторинга заббикс. Сегодня я расскажу, как настроить мониторинг openvpn подключений в zabbix с помощью автообнаружения конфигов пользователей. Способ придуман не мной, приведу ссылку на github страницу проекта.

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Введение

Идея настроить мониторинг openvpn подключений с помощью zabbix витала у меня давно, но никак не доходили руки. Когда выбрал время и сел настраивать, сходу не придумал, а как же лучше это сделать. Так как в задаче много нюансов, то и подходов тоже может быть несколько.

Изначально я думал как-нибудь распарсить лог openvpn и вытаскивать подключенных пользователей оттуда. После того, как внимательно посмотрел на основной лог, понял, что это не самая простая задача, пришлось бы повозиться, чтобы все отладить.

Перед настройкой решил погуглить и посмотреть, что уже есть из готового. И сразу же нашел вот этот проект - https://github.com/Grifagor/zabbix-openvpn. Идею быстро понял, оценил все плюсы и минусы и решил не заморачиваться сам, а взять готовое, благо тут все в комплекте:

  • Скрипты
  • Конфиги
  • Шаблон с автообнаружением, графиками и триггерами.

Шаблон имеет следующие элементы в своем составе:

  1. Итемы для мониторинга за полученным и переданным трафиком пользователя.
  2. Итемы для мониторинга за статусом подключения, отключения пользователя.
  3. Триггер со срабатыванием на подключение и отключение пользователя.
  4. График полученных, отправленных данных в байтах.
  5. График со статусом подключения пользователя.
  6. Количество подключенных пользователей к openvpn серверу.

Все эти итемы, графики и триггеры создаются автоматически для каждого пользователя.

Минус один и весьма существенный - добавление итемов в виде отдельных пользователей работает через автообнаружение конфигураций пользователей в директории с ccd. Для того, чтобы приведенный способ мониторинга openvpn подключений работал, у вас должны существовать индивидуальные конфигурации пользователей, заданные в конфиге openvpn параметром client-config-dir.

Сами конфигурации пользователей могут быть пустыми. Их содержимое не используется. Они нужны только для того, чтобы получить имя пользователя и затем по этому имени анализировать лог файл состояния openvpn, настроенный с помощью параметра status в конфигурации openvpn сервера.

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

С учетом указанных особенностей мониторинга openvpn, переходим к настройке. Возможно, у меня что-то не будет совпадать точь в точь с тем, что есть в репозитории github, так как редактировал под свои реалии, причем достаточно давно. Нюансов уже не помню, буду приводить свои конфиги как есть.

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 8.
  2. Настройка CentOS 8.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 10, если предпочитаете его:

  1. Установка Debian 10.
  2. Базовая настройка Debian.
  3. Установка и настройка zabbix на debian.

Настройка 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 пользователями на сервере zabbix все.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Описанный способ мониторинга за подключениями openvpn пользователей не идеальный. Надежнее не привязываться к готовому списку пользователей, а напрямую анализировать лог файл openvpn. Иначе, если по какой-то причине пользователя не будет в списке, который формируется правилом автообнаружения, вы ничего не узнаете о подключениях. Особенно это актуально, когда мониторинг используется не просто для сбора информации, а для целей обеспечения безопасности, где важно фиксировать абсолютно все подключения.

В данной статье рассмотрен только мониторинг за подключениями пользователей. Если вам нужно мониторить работу самой службы openvpn, то можете это сделать по другой моей статье - мониторинг работы служб linux.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

39 комментариев

  1. добрый день, а будет ли работать шаблон в 6,7 версии забикса и может ли скрипт работать с забикс агент актив2, и быть начеленным на syslog , при проверке агентом из консоли подлюченных пользователей - агент говрит что не поддерживает данную метрику. Может подскажете куда копать или при моей конфигурации данный скрипт не подходит?

  2. Кому интересно собрал шаблон OpenVPN-LLD.zip для Zabbix
    Данные берутся из через sqlite3 /usr/local/openvpn_as/etc/db/log.db
    Более подробно тут https://diyit.ru/viewtopic.php?t=2010

  3. Добрый день!
    Все получается прекрасно, даже количество общих подключений отрабатывает. в логах информация отображается, все отлично. Но тем не менее индивидуальные данные не отображаются - т.е. увидеть, что конкретный пользователь подключен нельзя((
    Прочитав последнее сообщение в ветке полагаю, что виной всему очередные изменения, но как их побороть так и не нашел. Может сталкивался кто?

  4. Сергей

    а можно как то в забиксе попонятнее пользователей подписать, у меня они все при генерации сертификатов называются почти одинаково:
    user11, user12 и т д, а мне бы понимать кто это написать "user11 - stick monitor"

  5. Аноним

    I cannot get data from discover_vpn.sh
    Can you help me? Thanks

  6. Аноним

    Заработало после изменения прав с root на zabbix на файл в котором содержатся данные о пользователях (в моем случае status server1-status.log)
    Спасибо за статью, да и вообще, за всю Вашу деятельность.

  7. Special characters "\, ', ", `, *, ?, [, ], {, }, ~, $, !, &, ;, (, ), , |, #, @, 0x0a" are not allowed in the parameters.

    Что делать?

  8. Сергей

    Здравствуйте Владимир. Подскажите пожалуйста какой вывод будет у команды zabbix_agentd -t num_user.openvpn

    • У меня нет сейчас под рукой сервера с этими настройками.

      • Сергей

        я уже разобрался с этим, спасибо

        • неСергей

          Это не приватные сообщения, это комменты - читают все, пиши для всех.
          Обиженки. Не нравится, не пользуйся. Пользуешься - веди себя как человек.

  9. Получил динамический список пользователей (SED):

    UserParameter=discovery.openvpn
    
    # cat /var/etc/openvpn/openvpn-status.log | sed -n '/Connected Since/,/ROUTING/p' | sed 's/,.*//' | sed                     's/^/,{"{#VPNUSER}":"/' | sed 's/$/"}/' | sed -e '1d' -e '$d' | sed -e '1s/^/{"data"\:[/' -e '$s/$/]}/'
    
    
    UserParameter=discovery.openvpn,cat /var/etc/openvpn/openvpn-status.log | sed -n '/Connected Since/,/ROUTING/p' | sed 's/,.*//' | sed 's/^/,{"{#VPNUSER}":"/' | sed 's/$/"}/' | sed -e '1d' -e '$d' | sed -e '1s/^/{"data"\:[/' -e '$s/$/]}/'
    UserParameter=user_status.openvpn[*], cat /var/etc/openvpn/openvpn-status.log | grep $1, >/dev/null && echo 1 || echo 0
    UserParameter=num_user.openvpn, cat /var/etc/openvpn/openvpn-status.log | sed -n '/Connected Since/,/ROUTING/p' | sed -e '1d' -e '$d' | wc -l
    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 '3p' ; 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 '4p' ; else echo "0" ; fi
    • Спасибо за полезную информацию.

    • Была лишняя запятая.
      Подправил

      cat /tmp/openvpn-status.log | sed -n ‘/Connected Since/,/ROUTING/p’ | sed ‘s/,.*//’ | sed ‘s/^/,{«{#VPNUSER}»:»/’ | sed ‘s/$/»}/’ | sed -e ‘1d’ -e ‘$d’ | sed -e ‘1s/^/{«data»\:[/’ -e ‘$s/,/]}/’

      Не хватало привилегий делал в pfSense. Вышел из положения созданием симлинка через кронтаб:

      0,15,30,45 * * * * /usr/bin/find /tmp/openvpn-status.log||/bin/ln /var/etc/openvpn/openvpn-status.log /tmp/openvpn-statu
      s.log&&/bin/chmod 755 /tmp/openvpn-status.log
  10. Нашёл иное решение проблемы автообнаружения пользователей без использования 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-серверу глядеть куда не надо :)
    И всё будет работать. За скрипт и статью спасибо.

    • Да, я тоже знаю этот файл и так же думал его распарсить. У меня как-то не пошла идея с мониторингом, поэтому развивать не стал. По факту никому он оказался не нужен.

  11. Алексей

    Добрый день.
    Делал все по инструкции, менял лишь пути к скрипту и логам.

    К сожалению в элементах данных напротив необходимого элемента (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.

        Для проверки работает ли вообще передача параметров, создал простенький итем, и указал в конфиге агента подходящий параметр, параметр передается корректно.

        Какие есть еще варианты проверки, что может быть? Все таки очень хотелось бы, чтобы данный функционал заработал.

  12. Возникла сложность:
    [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 - работает

    Как лучше обойти предоставление прав так глубоко?

  13. Хотелось бы узнать про уровень логирования в настройках server.conf,userparameter только первый отрабатывает,в остальных пишет что zabbix unsuported

    • Николай

      Насколько я помню, это несоответствие типов данных между скриптом и шаблоном забикса

  14. Хмм... Можно сделать по другому: в файле конфигурации openvpn использовать опцию "client-connect" - данная опция вызывает внешний скрипт при подключении к серверу кого-либо. А в этом скрипте уже прописываем всё, что душе угодно, к примеру оповещение на почту или запись в бд. С помощью следующих переменных получаем доп. информацию: ${common_name}, ${HOSTNAME}, ${untrusted_ip}, ${ifconfig_pool_remote_ip}

  15. Александр

    а можете сбросить 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

            Для профи, конечно, это объяснение слишком развернуто, но надеюсь будет полезно тем, кто, как и я, нашел эту инструкцию и делает четко по ней... но ничего не получается. Как всегда, нужно все делать осознанно, вдумываясь в то, что и зачем делаем.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar