- . Шифрование [Zabbix Documentation 5.4]
- Zabbix web-сервер <-> база данных zabbix
- Zabbix-прокси <-> бд zabbix-прокси
- Zabbix-сервер <-> zabbix-агент и zabbix-прокси <-> zabbix-агент
- Zabbix-сервер <-> zabbix-прокси
- Zabbix-сервер <-> база данных zabbix
- Авторегистрация с шифрованием
- Возможные ошибки
- Мониторинг ssl сертификатов в zabbix – centos
- Мониторинг ssl-сертификатов в zabbix | xandroskin blog
- Настройка zabbix-agent
- Пользователь (web-браузер) <-> zabbix web-сервер
- Примечание
- Проверяем средства для мониторинга
- Список проверяемых ssl сертификатов
- Хранение чувствительной информации в vault
- Заключение
- Zabbix sender -> zabbix-прокси и zabbix-агент -> zabbix get
. Шифрование [Zabbix Documentation 5.4]
Zabbix поддерживает шифрование соединений между Zabbix сервером, Zabbix прокси, Zabbix агентом, zabbix_sender и zabbix_get утилитами с использованием Transport Layer Security (TLS) протокола v.1.2. Шифрование поддерживается начиная с Zabbix 3.0. Поддерживаются шифрования на основе сертификата и на основе pre-shared ключа.
Шифрование опционально и настраивается для отдельных компонентов (например, некоторые прокси и агенты можно настроить на использование шифрования с сервером на основе сертификатов, в то время как другие могут использовать шифрование на основе pre-shared ключа, а остальные могут продолжать использовать незашифрованные соединения как и ранее).
Сервер (прокси) может использовать различные настройки с разными узлами сети.
Программы Zabbix демонов слушают один порт для шифрованных и незашифрованных входящих подключений. Добавление шифрования не потребует открывать новые порты на брандмауэрах.
Для поддержки шифрования Zabbix должен быть скомпилировать и связан с по крайней мере одной крипто библиотекой:
Библиотека выбирается при помощи опции в скрипте “configure”:
Например, чтобы сконфигурировать исходные коды сервера и агента с OpenSSL, вы можете использовать что-то вроде:
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl
Можно скомпилировать разные компоненты Zabbix с различными крипто библиотеками (например, сервер с OpenSSL, агент с GnuTLS).
Соединения в Zabbix могут использовать:
Имеется два важных параметра, которые используются, чтобы указать шифрование между компонентами Zabbix:
TLSConnect задает какое использовать шифрование и может принимать одно из 3 значений (unencrypted, PSK, certificate).
TLSConnect используется в файлах конфигурации Zabbix прокси (в активном режиме задает только подключения к серверу) и Zabbix agentd (при активных проверках). В веб-интерфейсе Zabbix параметр TLSConnect является эквивалентом поля Подключения к узлу сети с вкладки Настройка→Узлы сети→<какой-то узел сети>→Шифрование и поля Подключения к прокси с вкладки Администрирование→Прокси→<какой-то прокси>→Шифрование.
Если настроенный тип шифрования для соединения завершится неудачей, другие типы шифрования не будут опробованы.
TLSAccept задает какой тип соединений разрешен при входящих подключениях. Тип подключений: unencrypted, PSK, certificate. Можно указать одно или более значений.
TLSAccept используется в файлах конфигурации Zabbix прокси (в пассивном режиме задает только соединения с сервера) и Zabbix agentd (при пассивных проверках). В веб-интерфейсе Zabbix параметр TLSAccept является эквивалентом поля Соединения с узла сети с вкладки Настройка→Узлы сети→<какой-то узел сети>→Шифрование и поля “Соединения с прокси” с вкладки Администрирование→Прокси→<какой-то прокси>→Шифрование.
Как правило, вы настраиваете только один тип шифрования для входящих подключений. Но вы можете захотите переключить режим шифрования, например с незашированного на основанный на сертификатах с минимальным временем простоя и с возможностью отката. Для этого вы можете задать TLSAccept=unencrypted,cert в файле конфигурации agentd и перезапустить агента Zabbix.
Затем вы можете протестировать подключение от zabbix_get к агенту, используя сертификат. Если подключение работает, вы можете перенастроить шифрование у этого агента в Zabbix веб-интерфейсе на вкладке Настройка→Узлы сети→<какой-то узел сети>→Шифрование, переключив настройку Подключения к узлу сети на “Сертификат”.
Когда кэш конфигурации сервера обновится (и конфигурация прокси обновится, если узел сети наблюдается через прокси), тогда подключения к этому агенту будут зашифрованы.
Если всё работает как ожидается, вы можете задать TLSAccept=cert в файле конфигурации агента и перезапустить Zabbix агента.
Теперь агент будет принимать только зашифрованные подключения на основе сертификатов. Незашифрованные и основанные на PSK подключения будут отклонены.
Шифрование на сервере и прокси работает аналогичным образом. Если в веб-интерфейсе Zabbix в настройке узла сети Соединения с узла сети задано равным “Сертификат”, тогда от агента (активные проверки) и zabbix_sender (траппер элементы данных) будут приниматься только зашифрованные соединения на основе сертификатов.
Скорее всего вы настроите входящие и исходящие соединения на использование одного типа шифрования или без шифрования вовсе. Но, технически, имеется возможность настроить шифрование асимметрично, например, шифрование на основе сертификатов для входящих подключений и на основе PSK для исходящих подключений.
Обзорные настройки шифрования отображаются в веб-интерфейсе Zabbix Настройка→Узлы сети по каждому узлу сети по правой стороне, в колонке ШИФРОВАНИЕ АГЕНТА. Примеры отображения настроек:
Смотрите страницы помощи zabbix_get и zabbix_sender по использованию этих утилит при наличии шифрования.
Zabbix web-сервер <-> база данных zabbix
Перед началом настройки на стороне Zabbix, в БД должны быть созданы пользователи и роли с атрибутами, требующими шифрованное подключение.
mysql> CREATE USER
'zabbix_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',
'zabbix_web'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>'
REQUIRE SSL
PASSWORD HISTORY 5;
mysql> CREATE ROLE 'zabbix_srv_role', 'zabbix_web_role';
mysql> GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, ALTER, INDEX, REFERENCES ON zabbix.* TO 'zabbix_srv_role';
mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON zabbix.* TO 'zabbix_web_role';
mysql> GRANT 'zabbix_srv_role' TO 'zabbix_srv'@'%';
mysql> GRANT 'zabbix_web_role' TO 'zabbix_web'@'%';
mysql> SET DEFAULT ROLE 'zabbix_srv_role' TO 'zabbix_srv'@'%';
mysql> SET DEFAULT ROLE 'zabbix_web_role' TO 'zabbix_web'@'%';Вызов статуса вернет, в том числе, данные по настройкам шифрования. Убедимся, что в строке SSL указаны алгоритмы шифрования.
Настройку шифрования между Zabbix и базой данных можно выполнить сразу при первичной настройке Zabbix через web-интерфейс. Обратите внимание на подпись напротив Database TLS encryption. Из-за того, что для подключения к локальной БД используется socket file, нет возможности настроить шифрованное подключение. Поэтому в поле Хост базы данных должны быть указаны IP-адрес или имя сервера с БД.
Меняем localhost на IP-адрес сервера и появляется чекбокс.
На двух скриншотах выше можно увидеть нововведение в Zabbix версии 5.2 — поддержку интеграции с хранилищем Vault. Перед началом настройки Zabbix мы создали пару ключей и учетными данными для подключения к БД.
Берем клиентские ключи MySQL, заполняем необходимые поля и нажимаем Далее.
Другой способ настроить то же самое — соответствующие ключи в конфигурационном файле zabbix.conf.php.
$DB[‘ENCRYPTION’] = true;$DB[‘KEY_FILE’] = ‘/etc/ssl/mysql/client-key.pem’;$DB[‘CERT_FILE’] = ‘/etc/ssl/mysql/client-cert.pem’;$DB[‘CA_FILE’] = ‘/etc/ssl/mysql/ca.pem’;$DB[‘VERIFY_HOST’] = true;$DB[‘CIPHER_LIST’] = ”;
Zabbix-прокси <-> бд zabbix-прокси
Подход к настройке аналогичен настройке шифрованного соединения между Zabbix-сервером и БД. Названия переменных такие же, указываются в конфигурационном файле Zabbix-прокси.
Zabbix-сервер <-> zabbix-агент и zabbix-прокси <-> zabbix-агент
Мы не будем повторяться, настройка этих соединений аналогична настройке соединения сервера с прокси: для исходящих соединений доступен один вариант, для входящих один или несколько.
Названия переменных для настройки шифрования на стороне агента полностью аналогичны переменным в конфигурации прокси.
Zabbix-сервер <-> zabbix-прокси
Как многие пользователи Zabbix знают, в системе существует два типа подключений для передачи метрик: пассивные и активные. Пассивные подразумевают запрос к источнику данных, а активные – отправку данных от источника вне зависимости запроса приемника.
Обратите внимание, что исходящие соединения (пассивные) могут выполняться каким-то одним способом на выбор, а для входящих доступны комбинации вариантов: без шифрования, PSK или сертификат.
На стороне прокси все настройки выполняются в конфигурационном файле. Для активных проверок:
TLSConnect=pskTLSPSKIdentity=test_zabbixTLSPSKFile=/var/zabbix/agentd.psk
Для пассивных проверок:
TLSAccept=pskTLSPSKIdentity=test_zabbixTLSPSKFile=/var/zabbix/agentd.psk
Второй способ шифрования подключения – использование сертификатов. Заметим, что для pre-shared key (PSK) и сертификатов, закрытый ключ хранится на файловой системе в открытом виде. Подробная информация доступна в документации Zabbix.
Zabbix-сервер <-> база данных zabbix
На предыдущем шаге мы уже создали пользователя для подключения, клиентские ключи для подключения тоже есть. Осталось прописать эти данные в конфигурационный файл Zabbix-сервера.
DBTLSConnect=requiredDBTLSCAFile=/etc/ssl/mysql/ca.pemDBTLSCertFile=/etc/ssl/mysql/client-key.pemDBTLSKeyFile=/etc/ssl/mysql/client-cert.pemDBTLSCipher=”
Авторегистрация с шифрованием
Шифрование также поддерживается и для процесса авторегистрации.
После авторегистрации нового узла, настройки соединения с ним будут автоматически настроены на использование шифрования PSK.
Возможные ошибки
Самая распространенная ошибка, с которой можно столкнуться — скрипты не работают от системного пользователя zabbix. Причем вы никак не поймете, в чем реально ошибка. Просто на сервере ваши правила обнаружения или итемы с доменами будут отключены с ошибкой item not supported. Для того, чтобы убедиться, что все в порядке, проверьте, как ваши скрипты работают под нужным пользователем.
Мониторинг ssl сертификатов в zabbix – centos
Рассмотрим вариант мониторинга SSL сетификатов с помощью Zabbix.
Существуют условно говоря два метода: дискавери и ручной. Рассмотрю ручной, т.к. в дискваре может попадать много лишнего и часто прийдется изменять регулярные выражения для исключения ненужных доменов. Иной вариант, всё дискавери сведется к тому, что вы в нем оставите только нужные домены, а все новые проигнорируте, поэтому делаем ручной метод с возможность редактирования (добавления/удаления) необходимых доменов для проверки из самого Zabbix.
Для начала необходим скрипт, который будет проверять и возвращать нам значения:
cat ssl_check.sh
Вариант №2 скрипта, логика возврата переменной RETVAL несколько изменена, т.к. наблюдались ошибки с получением кол-ва дней до конца сертификата:
Проверим в какой каталог смотрит заббикс для использвания внешних скриптов, если нет, дописываем
# cat /etc/zabbix/zabbix_server.conf | grep externalscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
Помещаем наш скрипт ssl_check.sh в каталог /usr/lib/zabbix/externalscripts и добавляем атрибуты на выполнения:
chmod x /usr/lib/zabbix/externalscripts/ssl_check.sh
Также создаем файл для логов и выставляем ему соответствующего владельца
touch /usr/lib/zabbix/externalscripts/ssl_check.log
chown zabbix:zabbix /usr/lib/zabbix/externalscripts/ssl_check.log
Перезагружаем zabbix сервер
systemctl restart zabbix-server
Cозданию Items и Triggers
Можно использовать темплейт, но быстрее создать необходимое самостоятельно.
zbx2-4_SSL_Template
zbx_ssl_with_6macro_and_graph_templates.xml
Для нашего zabbix-server в hosts zabbix создаем новый Items

Новый Items

Поле Key заполняем и указываем в нем необходимый нам домен
ssl_check.sh[google.com,{$SSL_PORT}]
Далее переходим в Triggers и создаем новый тригер

Новый trigger

Непосредственно само выражение:
{Zabbix server:ssl_check.sh[google.com,{$SSL_PORT}].last(0)}<6
В данном выражение стоит обратить внимание на срок, когда сработает тригер, когда до срока окончание будет менее 6 дней.
На этом все, следите за сертификатами и не забывайте их вовремя продлевать
Мониторинг ssl-сертификатов в zabbix | xandroskin blog
После покупки и добавления сертификата к домену обычно не обращаешь внимания на его срок жизни, пока в один прекрасный день сайт не перестаёт открываться по HTTPS. Для сертификатов для почтовых служб еще хуже, о не дошедшей почте узнаёшь гораздо позже. Чтобы такого не происходило, можно сделать напоминание о необходимости продления в системе мониторинга Zabbix.
Варианта проверки валидности сертификата как минимум два: зайти через интерфейс, к которому добавлен SSL, и проверить его данные; либо же непосредственно на сервере обратиться к содержимому файла сертификата и наверняка получить желаемый результат.
Чем плох первый случай? Для проверки используется стандартный клиент openssl, происходит обращение к домену примерно следующего вида
openssl s_client -host $host -port $port -showcerts
Однако, nginx давно умеет SNI, и мы завели несколько доменов на одном IP. Возможно, есть способы проверки и для такого случая, но командой выше у меня не вышло получить время жизни дальше чем для первого сертификата на одном интерфейсе.
Если кому-то этот способ понравится больше предложенного мной ниже, его полная реализация с темплейтом и скриптами на Bash и Python имеются в официальной документации Zabbix. Замечу, однако, что помимо всего прочего, в данной реализации используется внешняя проверка с zabbix-сервера, что само по себе не является best practice и привносит на сервер дополнительную нагрузку.
Я же предлагаю другой вариант: проверка непосредственно файлов сертификатов на тех серверах, где они используются. Для актуализации списка можно парсить конфиги веб- или почтового сервера. В приведенном ниже скрипте используется nginx.conf, в котором фильтруются закомментированные строки. Помимо количества дней до конца действия сертификата считывается выдавшая его организация, чтобы в случае чего знать куда бежать за новым. За основу взят скрипт из вышеупомянутой документации, он лишь был доработан напильником для автономной работы.
#!/bin/bash
#------------------------------------------------------------
# ssl_int_check.sh
# Script checks for number of days until certificate expires or the issuing authority
# depending on switch passed on command line.
#
#Based on script from aperto.fr (http://aperto.fr/cms/en/blog/15-blog-en/15-ssl-certificate-expiration-monitoring-with-zabbix.html)
#with additions by racooper@tamu.edu.
#------------------------------------------------------------
if [ -z ${2} ]; then
certs=`grep "ssl_certificate " /etc/nginx/nginx.conf |grep -v "^#"|sed -n 's/.*ssl_certificate *//p'|tr -d ";"`
if [[ -n ${certs} ]]; then
JSON="{ "data":["
for CRT in ${certs}; do
JSON=${JSON}"{ "{#CERTIFICATE}":"${CRT}"},"
done
JSON=${JSON}"]}"
echo ${JSON}|sed '$s/,]}$/]}/'
fi
else
f=$1
cert=$2
case $f in
-d)
end_date=`openssl x509 -noout -enddate -in $cert | cut -d '=' -f 2`
if [ -n "$end_date" ]
then
end_date_seconds=`date ' %s' --date "$end_date"`
now_seconds=`date ' %s'`
echo "($end_date_seconds-$now_seconds)/24/3600" | bc
fi
;;
-i)
issue_dn=`openssl x509 -noout -text -in $cert |sed -n 's/ *Issuer: *//p'`
if [ -n "$issue_dn" ]
then
issuer=`echo $issue_dn | sed -n 's/.*CN=*//p'`
echo $issuer
fi
;;
*)
echo "usage: $0 [-i|-d] /path/to/crt"
echo " -i Show Issuer"
echo " -d Show valid days remaining"
;;
esac
fi
Еще одним дополнением является наличие discovery, позволяющего обойти рутинную работу по монотонному добавлению всех доменов в Zabbix. Результат работы скрипта без каких либо аргументов дает валидный JSON, который подхватывает Zabbix и заводит все необходимые параметры автоматически.
Для работы необходимо наличие на сервере калькулятора bc.
Подключить скрипт нужно в файле конфигурации zabbix_agentd.conf с помощью UserParameter:
#SSL Certificate Expiry UserParameter=cert.discovery, /etc/zabbix/scripts/ssl_int_check.sh UserParameter=cert.check[*], /etc/zabbix/scripts/ssl_int_check.sh $1 $2
Темплейт для Zabbix можно скачать по ссылке: ssl_check.xml. В нем имеется 3 триггера, срабатывающие за месяц, за неделю и в день истечения срока годности сертификата. Проверка и обнаружение новых SSL осуществляется раз в сутки.
Ссылки:
Настройка zabbix-agent
Создаем папку для скриптов в директории с настройками zabbix:
# mkdir /etc/zabbix/scripts
Первым делом создадим 2 текстовых файла для хранения списков доменов.
Пользователь (web-браузер) <-> zabbix web-сервер
Шифрование этой коммуникации не поддерживается со стороны Zabbix, нужно самостоятельно выполнить настройку на стороне Apache или Nginx. В этой статье мы рассмотрим настройку Nginx с самоподписанным SSL-сертификатом, т.к. преимущественно используем именно Nginx в своих проектах по мониторингу на базе Zabbix.
Можно использовать сертификат доверенного центра сертификации, например, бесплатный от Let’s Encrypt. Это позволит избежать страшных предупреждений в браузере. Обращаем внимание, что использование самоподписанного сертификата никак не умаляет надежности шифрованного соединения, оно будет таким же защищённым как и при использовании сертификата от доверенного CA.


Примечание
Если приходится часто проверять данные SSL сертификатов, то можно вынести скрипт на отдельный хост.
Если домены не входят в один JSON, то можно сделать несколько шаблонов с разными именами и разным набором проверяемых SSL сертификатов.
Данные исключённых из списка SSL сертификатов удаляются через 30 дней согласно правилам низкоуровневого обнаружения LLD.
Триггеры, отслеживающие срок действия SSL сертификата, настроены на 30, 14, 7, 1, 0- дней.
Значение {$SSL_NODATA_PERIOD} должно превышать {$SSL_REQUEST_PERIOD}, иначе сработает триггер, отслеживающий отсутствие данных SSL сертификата.
Один и тот же SSL сертификат на разных доменах можно обнаружить по одинаковому серийному номеру. Такой сертификат не имеет смысла мониторить несколько раз.
Проверяем средства для мониторинга
Прежде чем приступим к написанию скриптов для мониторинга, предлагаю отдельно проверить технические средства, которые будем использовать. В данном случае это будет консольная утилита openssl с различными параметрами и преобразованием ее вывода.
Для начала просто запросим сертификат сайта и проверим вывод:
Список проверяемых ssl сертификатов
Находим шаблон в Configuration → Templates. Я назвал шаблон SSL check.
Переходим в items. Здесь всего один элемент данных под названием SSL domain list.
Кликаем по нему.
Выбираем вкладку Preprocessing.
Здесь один шаг препроцессинга JavaScript. Нажимаем на его параметр.
А вот и список SSL сертификатов в формате JSON. Здесь его можно отредактировать и указать свой список. Формат списка:
Хранение чувствительной информации в vault
Приятное нововведение, которое появилось в версии Zabbix 5.2 — поддержка хранилища Vault. Его можно использовать как для хранения учетных данных для доступа к БД так и для значений макросов. Так значения макросов выглядят в Vault:
А так на них можно сослаться в интерфейсе Zabbix:
Хранение значений макросов очень сильно упрощает управление учетными данными для разных шаблонов, позволяет легко отзывать учетные данные и вести аудит. Разумеется, из Vault можно брать значения любых макросов и это добавляет ещё одну степень свободы при автоматизации мониторинга в Zabbix.
Заключение
В статье мы рассказали о возможностях шифрования в Zabbix. Перед решением об использовании шифрованных подключений, важно понимать, что это снижает производительность системы мониторинга и сильнее утилизирует аппаратное обеспечение. Без понятной причины шифрование использовать не стоит.
Мы давно и успешно работаем с Zabbix, если у вас есть задачи по развитию, сопровождению или обновлению системы, оставьте заявку через форму обратной связи или свяжитесь другим удобным способом.
А ещё можно почитать:
Добавляем CMDB и географическую карту к Zabbix
Мониторинг принтеров — дело благородное
Структурированная система мониторинга на бесплатных решениях
Elastic под замком: включаем опции безопасности кластера Elasticsearch для доступа изнутри и снаружи
Для обработки событий от Zabbix, Prometheus, Elastic и других систем рекомендуем использовать Amixr (презентация по запросу).
Zabbix sender -> zabbix-прокси и zabbix-агент -> zabbix get
Шифрование соединения с утилитами Zabbix sender и Zabbix get выполняется при помощи специальных параметров при вызове соответствующих утилит.
zabbix_sender -z 127.0.0.1 -s zabbix02 -k Encrypt -o 18 –tls-connect psk –tls-psk-identity «test_zabbix» –tls-psk-file /etc/zabbix/keys/agent.psk
zabbix_get -s 127.0.0.1 -k agent.version –tls-connect psk –tls-psk-identity «test_zabbix» –tls-psk-file /etc/zabbix/keys/agent.psk
