Мониторинг SSL-сертификатов в Zabbix

После покупки и добавления сертификата к домену обычно не обращаешь внимания на его срок жизни, пока в один прекрасный день сайт не перестаёт открываться по 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 осуществляется раз в сутки.

Ссылки: