Дали задание на работе мониторить срок окончания действия SSL-сертификата на одном серверов со служебным сайтом. Админ должен быть уведомлен при сроке действия менее 30-ти дней. Имеется для этого Zabbix, и он имеет такую возможность из коробки, но с тем нюансом, что на сервере со служебным сайтом должен стоять Zabbix-agent2 (именно второй). А это не всегда представляется возможным. Но есть и другой способ, который описан вот в этой статье:
https://winitpro.ru/index.php/2023/05/04/monitoring-ssl-sertifikat-expiry-zabbix/
И этот способ действительно рабочий, я его проверил. Но в нём тоже есть нюанс, заключающийся в том, что нужно всё равно использовать zabbix-agent, но уже стоящий на самом Zabbix сервере. А это тоже может быть неудобным в некоторых случаях, точнее, я бы сказал, менее изящным. Например, если в Zabbix уже мониторится сервер, доступа к которому у меня нет и не будет, там кто-то когда-то поставил агента с настройками по умолчанию, чтобы Zabbix собирал основные метрики. А чтобы следить за сертификатом, мне в настройках хоста приходится добавлять ещё одного агента, но уже с адресом 127.0.0.1:
Поэтому я немного переделал под себя решение, предоставленное автором сайта winitpro.ru (кстати, автор и сайт очень хорошие, рекомендую!). Пошагово опишу, как сделал у себя, взяв основу из вышеупомянутой статьи.
Прежде всего, нужно обратиться вот к этой странице документации:
https://www.zabbix.com/documentation/5.4/en/manual/config/items/itemtypes/external
Из которой можно понять, что элемент данных можно собирать напрямую скриптом, а не запуская этот скрипт zabbiz-агентом. Для этого, как и писал автор winitpro.ru, нужно на Zabbix-сервере перейти в каталог /usr/lib/zabbix/externalscripts и там создать bash-скрипт:
#!/bin/bash
data=`echo | openssl s_client -servername $1 -connect $1:${2:-443} 2>/dev/null | openssl x509 -noout -enddate | sed -e 's#notAfter=##'`
ssldate=`date -d "${data}" '+%s'`
nowdate=`date '+%s'`
diff="$((${ssldate}-${nowdate}))"
echo $((${diff}/24/3600))
У себя этот скрипт назвал sslkonchina.sh
Делаю его исполняемым:
chmod +x /usr/lib/zabbix/externalscripts/sslkonchina.sh
Проверяю, что скрипт рабочий:
user@debian12:~$ ./sslkonchina.sh typical-admin.ru 443
37
Далее, в конфиге /etc/zabbix/zabbix_server.conf надо проверить параметр ExternalScripts, чтобы он действительно вёл на каталог /usr/lib/zabbix/externalscripts.
Затем перехожу в вэб интерфейс Zabbix и создаю новый шаблон:
Сперва задаю имя шаблона и отображаемое имя:
Тут нужно уточнить, что имя может быть только латиницей, а вот выводимое имя можно писать на родном языке.
Дальше перехожу на вкладку «Макросы» и создаю макросы {$MONCERT.SITENAME} и {$MONCERT.SSLPORT}:
Макросу {$MONCERT.SSLPORT} присваиваю умолчательное значение — 443.
И далее создаю элемент данных:
И на этом моменте заключается отличие от настройки winitpro.ru. Имя можно задать на свой вкус, у меня это: Оставшийся срок действия SSL сертификата {$MONCERT.SITENAME}. А вот ТИП я выбираю Внешняя проверка:
В поле КЛЮЧ вбиваю вот такую конструкцию:
sslkonchina.sh[{$MONCERT.SITENAME},{$MONCERT.SSLPORT}]
Интервал ставлю 60минут, тут можно даже и больше поставить, ибо нет смысла слишком часто проверять. Остальное по умолчанию ставлю.
Далее настраиваю триггер:
И тут всё также, как предлагает автор winitpro.ru:
Название делаю вот таким:
Действие SSL сертификата {$MONCERT.SITENAME} заканчивается через {ITEM.LASTVALUE1} дней
Таким образом, проблема будет высвечиваться с текстом: Действие SSL сертификата typical-admin.ru заканчивается через 29 дней. Число дней будет тем, которое реально осталось до истечения сертификата. Важность делаю высокой. И добавляю выражение:
Функция нужна last, и значение, в моём случае, должно быть меньше 30ти. Ну и выбираю элемент данных — он там один единственный, который я создал выше:
В итоге получился вот такой простой триггер, остальные параметры не трогаю:
Всё. А дальше иду в нужный мне хост и, вместо добавления дополнительного агента, иду сразу в шаблоны:
Добавляю свой созданный шаблон:
И затем добавляю макрос {$MONCERT.SITENAME} в значении которого прописываю домен, сертификат которого нужно мониторить:
Всё. Потом смотрю последние данные этого хоста и вижу там появившуюся строчку:
Заключительным приятным штрихом будет напоминание админу об истекающем сертификате. Причём, чтобы уведомление приходило каждый день. А для этого перехожу в действия триггеров:
и создаю новое:
Добавляю два условие, одно из которых — нужный мне хост, а второе условие — нужный мне триггер у этого хоста:
Затем перехожу во вкладку «Операции» и указываю длительность шага в один день и добавляю получателей уведомлений:
При выборе получателей нужно указать шаг 1 — 0 и выбрать нужных пользователей:
Ну и всё, жму везде сохранить/добавить. Теперь Zabbix будет долбить админа уведомлениями каждый день, когда срок действия сертификата будет менее 30 дней.
Донаты принимаются на кошельки:
Yoomoney:
4100118091867315
Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077
Карта Альфа-Банк:
2200 1539 1357 2013