Thank you for reading this post, don't forget to subscribe!
Рассмотрим вариант мониторинга SSL сетификатов с помощью Zabbix.
Существуют условно говоря два метода: дискавери и ручной. Рассмотрю ручной, т.к. в дискваре может попадать много лишнего и часто прийдется изменять регулярные выражения для исключения ненужных доменов. Иной вариант, всё дискавери сведется к тому, что вы в нем оставите только нужные домены, а все новые проигнорируте, поэтому делаем ручной метод с возможность редактирования (добавления/удаления) необходимых доменов для проверки из самого Zabbix.
Для начала необходим скрипт, который будет проверять и возвращать нам значения:
cat ssl_check.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#! /bin/sh SERVER=$1 TIMEOUT=25 RETVAL=0 TIMESTAMP=`echo | date` if [ -z "$2" ] then PORT=443; else PORT=$2; fi EXPIRE_DATE=`echo | openssl s_client -connect $SERVER:$PORT -servername $SERVER 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep notAfter | cut -d'=' -f2` EXPIRE_SECS=`date -d "${EXPIRE_DATE}" +%s` EXPIRE_TIME=$(( ${EXPIRE_SECS} - `date +%s` )) if test $EXPIRE_TIME -lt 0 then RETVAL=0 else RETVAL=$(( ${EXPIRE_TIME} / 24 / 3600 )) fi echo "$TIMESTAMP | $SERVER:$PORT expires in $RETVAL days" >> /usr/lib/zabbix/externalscripts/ssl_check.log echo ${RETVAL} |
Вариант №2 скрипта, логика возврата переменной RETVAL несколько изменена, т.к. наблюдались ошибки с получением кол-ва дней до конца сертификата:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#! /bin/bash SERVER=$1 TIMEOUT=25 RETVAL=0 #TIMESTAMP=`echo | date` TIMESTAMP=$(date) if [ -z "$2" ] then PORT=443; else PORT=$2; fi EXPIRE_DATE=`echo | openssl s_client -connect $SERVER:$PORT -servername $SERVER 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep notAfter | cut -d'=' -f2` EXPIRE_SECS=`date -d "${EXPIRE_DATE}" +%s` EXPIRE_TIME=$(( ${EXPIRE_SECS} - `date +%s` )) if test $EXPIRE_TIME -lt 0 then RETVAL=0 else RETVAL=$(( ${EXPIRE_TIME} / 24 / 3600 )) fi echo "$TIMESTAMP | $SERVER:$PORT expires in $RETVAL days" >> /usr/lib/zabbix/externalscripts/ssl_check.log #echo ${RETVAL} cat /usr/lib/zabbix/externalscripts/ssl_check.log | grep $SERVER | tail -n1 | awk '{print $11}' |
Проверим в какой каталог смотрит заббикс для использвания внешних скриптов, если нет, дописываем
# 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
Можно использовать темплейт, но быстрее создать необходимое самостоятельно.
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 дней.
На этом все, следите за сертификатами и не забывайте их вовремя продлевать