Zabbix под замком: включаем опции безопасности компонентов Zabbix для доступа изнутри и снаружи / Хабр

Zabbix под замком: включаем опции безопасности компонентов Zabbix для доступа изнутри и снаружи / Хабр Сертификаты

. Шифрование [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).

Если вы планируете использовать pre-shared ключи (PSK) рассмотрите возможность использования библиотек GnuTLS или mbed TLS с компонентами Zabbix, использующих PSK. Библиотеки GnuTLS и mbed TLS поддерживают наборы шифров PSK с Совершенной прямой секретностью (Perfect forward secrecy). OpenSSL библиотека (версии 1.0.1, 1.0.2c) поддерживает PSK, но доступные наборы шифров PSK не обеспечивают Совершенную прямую секретность.

Соединения в 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 (траппер элементы данных) будут приниматься только зашифрованные соединения на основе сертификатов.

Про сертификаты:  Как настроить Outlook для работы с сертификатом? — Удостоверяющий центр СКБ Контур

Скорее всего вы настроите входящие и исходящие соединения на использование одного типа шифрования или без шифрования вовсе. Но, технически, имеется возможность настроить шифрование асимметрично, например, шифрование на основе сертификатов для входящих подключений и на основе PSK для исходящих подключений.

Обзорные настройки шифрования отображаются в веб-интерфейсе Zabbix Настройка→Узлы сети по каждому узлу сети по правой стороне, в колонке ШИФРОВАНИЕ АГЕНТА. Примеры отображения настроек:

По умолчанию используются незашифрованные подключения. Шифрование необходимо настраивать по каждому узлу сети и прокси отдельно.

Смотрите страницы помощи zabbix_get и zabbix_sender по использованию этих утилит при наличии шифрования.

Zabbix web-сервер <-> база данных zabbix

Перед началом настройки на стороне Zabbix, в БД должны быть созданы пользователи и роли с атрибутами, требующими шифрованное подключение.

Листинг создания пользователей для Zabbix web-сервера и 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

alt

Новый Items

alt

Поле Key запол­ня­ем и ука­зы­ва­ем в нем необ­хо­ди­мый нам домен

ssl_check.sh[google.com,{$SSL_PORT}]

Далее пере­хо­дим в Triggers и созда­ем новый тригер

alt

Новый trigger

alt

Непо­сред­ствен­но само выражение:

{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.

Zabbix под замком: включаем опции безопасности компонентов Zabbix для доступа изнутри и снаружи / Хабр
Zabbix под замком: включаем опции безопасности компонентов Zabbix для доступа изнутри и снаружи / Хабр

Примечание

Если приходится часто проверять данные 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

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