Как мониторить:
Дату окончания действия домена
Дату продления SSL сертификата
Задача: Проработать настройку, как поставить на мониторинг собственные доменные имена дабы знать когда их нужно продлить. А то бывает, что регистратор у которого Вы купили доменное имя может и отправил Вам письмо, что срок Вашего доменного имени заканчивает, но вот письмо до Вас не дошло/потерялось/попало в спам/потерян доступ к почтовому ящику.
Вот для этого всего если Вы грамотный системный администратор и следите за вверенной инфраструктурой Вам жизненно необходимо настроить ваш Zabbix
сервер на мониторинг SSL
сертификата и даты окончания действия домена.
Я для основного блога ekzorchik.ru
использую бесплатный сертификат Let's Encrypt
выдается он сроком на 3 месяца (90 дней)
. И если в cron
нет строчки на перерегистрацию, то этим действием мне придется заниматься самолично, но я все же имею добавленную строчку в cron
:
ekzorchik@ekzorchik:~$ sudo crontab -e 0 2 * * * sudo /usr/sbin/certbot-auto -q renew
Чтобы узнать дату окончания сертификата для доменного имени или поддомена основного домена:
ekzorchik@srv-zabbix:~$ openssl s_client -connect lin.ekzorchik.ru:443 -servername lin.ekzorchik.ru -tlsextdebug 2>/dev/null | openssl x509 -noout -dates 2>/dev/null notBefore=Oct 2 16:47:50 2019 GMT notAfter=Dec 31 16:47:50 2019 GMT
спустя некого количества времени запрос завершается, хотя может показать, что он чего-то ожидает и его нужно прервать по сочетанию клавиш Ctrl + C
. Но погодите.
Из вывода видно, что сертификат был создан 2 октября 2019 года, а истечет 31 декабря 2019. У меня правда настроена автоматическое обновление, но в то же время я хочу, чтобы мой Zabbix Server 4.4
также следил за этим выводом.
Шаг №1: Вот, к примеру данные по поддомену win.ekzorchik.ru
на тему когда выдан сертификат и когда он закончится:
ekzorchik@srv-zabbix:~$ openssl s_client -connect lin.ekzorchik.ru:443 -servername win.ekzorchik.ru -tlsextdebug 2>/dev/null | openssl x509 -noout -dates 2>/dev/null notBefore=Nov 10 22:04:44 2019 GMT notAfter=Feb 8 22:04:44 2020 GMT ekzorchik@srv-zabbix:~$
Шаг №2: Чтобы получить дату окончания (After
) сертификата:
ekzorchik@srv-zabbix:~$ openssl s_client -connect lin.ekzorchik.ru:443 -servername win.ekzorchik.ru -tlsextdebug 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep notAfter | cut -d '=' -f2 Feb 8 22:04:44 2020 GMT ekzorchik@srv-zabbix:~$
Шаг №3: Создаю текстовый файл со списком доменов за которыми мой Zabbix
—сервер будет вести мониторинг:
ekzorchik@srv-zabbix:~$ sudo nano /usr/lib/zabbix/script/ssl_https.txt win.ekzorchik.ru lin.ekzorchik.ru net.ekzorchik.ru
Шаг №4: Создаем скрипт обрабатывающий вывод даты окончания сертификата:
ekzorchik@srv-zabbix:~$ sudo nano /usr/lib/zabbix/externalscripts/ssl_discovery #!/bin/bash JSON=$(for i in `cat /usr/lib/zabbix/script/ssl_https.txt`; do printf "{\"{#DOMAIN_HTTPS}\":\"$i\"},"; done | sed 's/^\(.*\).$/\1/') printf "{\"data\":[" printf "$JSON" printf "]}" ekzorchik@srv-zabbix:~$ sudo chmod +x /usr/lib/zabbix/externalscripts/ssl_discovery ekzorchik@srv-zabbix:~$ sudo /usr/lib/zabbix/externalscripts/ssl_discovery {"data":[{"{#DOMAIN_HTTPS}":"win.ekzorchik.ru"},{"{#DOMAIN_HTTPS}":"lin.ekzorchik.ru"},{"{#DOMAIN_HTTPS}":"net.ekzorchik.ru"}]} ekzorchik@srv-zabbix:~$ ekzorchik@srv-zabbix:~$ sudo nano /usr/lib/zabbix/externalscripts/ssl_checks #!/bin/bash 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 ${RETVAL} ekzorchik@srv-zabbix:~$ sudo chmod +x /usr/lib/zabbix/externalscripts/ssl_checks
Шаг №5: Проверяю вычисление даты окончания сертификата для доменного имени:
ekzorchik@srv-zabbix:~$ sudo /usr/lib/zabbix/externalscripts/ssl_checks lin.ekzorchik.ru 43 ekzorchik@srv-zabbix:~$ sudo /usr/lib/zabbix/externalscripts/ssl_checks win.ekzorchik.ru 82 ekzorchik@srv-zabbix:~$
Шаг №6: На Zabbix
-сервере, на нем же у меня стоит Zabbix
-агент создаю конфигурационный файл который будет получать дату окончания для доменного имени.
ekzorchik@srv-zabbix:~$ sudo nano /etc/zabbix/zabbix_agentd.d/ssl.conf UserParameter=ssl.discovery[*],/usr/lib/zabbix/externalscripts/ssl_discovery UserParameter=ssl.expires[*],/usr/lib/zabbix/externalscripts/ssl_checks $1 ekzorchik@srv-zabbix:~$ sudo systemctl restart zabbix-agent
Шаг №7: Проверяю, что Zabbix
—агент может считывать данные со скрипта:
ekzorchik@srv-zabbix:~$ sudo zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t ssl.discovery ssl.discovery [t|{"data":[{"{#DOMAIN_HTTPS}":"win.ekzorchik.ru"},{"{#DOMAIN_HTTPS}":"lin.ekzorchik.ru"},{"{#DOMAIN_HTTPS}":"net.ekzorchik.ru"}]}] ekzorchik@srv-zabbix:~$ ekzorchik@srv-zabbix:~$ sudo zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t ssl.expires[lin.ekzorchik.ru] ssl.expires[lin.ekzorchik.ru] [t|43] ekzorchik@srv-zabbix:~$ sudo zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t ssl.expires[win.ekzorchik.ru] ssl.expires[win.ekzorchik.ru] [t|82] ekzorchik@srv-zabbix:~$ sudo zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t ssl.expires[net.ekzorchik.ru] ssl.expires[net.ekzorchik.ru] [t|86] ekzorchik@srv-zabbix:~$
Шаг №8: Создаю шаблон: Template_SSL
и внутри него завожу «Элементы данных
» с периодом опроса пока на этапе настройке раз в 5
минут, а после изменяю на раз в 30
дней.
На заметку: Изменить значение
«Интервал обновления
»: c 5m на 30d нельзя
«Не удалось обновить элемент данных. Элемент данных не будет обновляться. Интервал обновления должен быть между 1s и 1d. Также можно использовать интервалы по расписанию/гибкие.
»
Для этого нужно использовать
«Пользовательские интервалы» - По расписания – Формат:
На заметку: За справкой лучше обратиться к мануалу от используемой версии Zabbix Server: https://www.zabbix.com/documentation/4.4/ru/manual/config/items/item/custom_intervals
Интервалы по расписанию используются для опроса элементов данных в заданное время. Тогда как гибкие интервалы разрабатывались для переопределения интервала обновления элементов данных по умолчанию, интервалы по расписанию используются для обозначения независимого расписания опроса, которое выполняется параллельно.
Интервал по расписанию задается как: md<фильтр>wd<фильтр>h<фильтр>m<фильтр>s<фильтр> where:
md — дни месяца
wd — дни недели
h — часы
m — минуты
s – секунды
<фильтр> используется для того, чтобы указать значения по своему префиксу (дни, часы, минуты, секунды) и задается как: [<от>[-<до>]][/<шаг>][,<фильтр>] где:
<от> и <до> определяют диапазон соответсвующих значений (включительно). Если <до> не указывается, тогда фильтр совпадает с диапазоном <от> — <от>. Если <от> также не указан, тогда фильтр совпадает со всеми возможными значениями.
<шаг> определяет пропуски количества значений через диапазон. По умолчанию значение <шаг> равно 1, что означает что все значения указанного диапазона совпадают.
Хотя добавление фильтра опционально, по крайней мере один фильтр должен использоваться. Фильтр должен определять либо диапазон, либо значение <шага>.
Пустой фильтр соответствует либо ‘0’, если фильтр более низкого уровня не определен, либо, в противном случае, все возможные значения. Например, если фильтр часа опущен, тогда будет соответствовать только ‘0’, если фильтры минут и секунд также опущены, в противном случае пустой фильтр часа будет соответствовать всем значениям часа.
Допустимые значения <от> и <до> по их соответствующему префиксу фильтра:
Префикс | Описание | <от> | <до> |
md | Дни месяца | 1-31 | 1-31 |
wd | Дни недели | 1-7 | 1-7 |
h | Часы | 0-23 | 0-23 |
m | Минуты | 0-59 | 0-59 |
s | Секунды | 0-59 | 0-59 |
Значение <от> должно быть меньше или равно значению <до>. Значение <шага> должно быть больше или равно 1 и меньше или равно <от> — <до>.
К одиночным цифрам значений дней месяца, часов, минут и секунд можно добавлять префикс 0. Например, md01-31 и h/02 являются допустимыми интервалами, но md01-031 и wd01-07 — нет.
В веб-интерфейсе Zabbix, несколько интервалов по расписанию вводятся в отдельных строках. В Zabbix API, они складываются в одну строку с разделителем точкой с запятой ;.
Если время совпадает по нескольким интервалам, опрос выполнится только раз. Например, wd1h9;h9 выполнится только один раз в Понедельник в 9 утра.
Для меня это будет:
Каждые 30 дня в 23 часа 59 минут
Интервал обновления: 1s
Пользовательские интервалы: md30h23m59
И нажимаю «Обновить
», изменения к элементу данных применились.
Имя «Элемента данных
»: Certificate lin.ekzorchik.ru expire
Выделил все три элемента данных и получив принудительно данные вижу через «Мониторинг
» — «Последние данные
»
Так все выше очень полезно.
Шаг №9: А как быть с датой продления доменного имени, купленного у регистратора DNS
имен, к примеру: reg.ru, jino.ru
и т.д.
Создаю скрипт который будет проверять дату окончания доменного имени (используется анализ whois
вывода):
ekzorchik@srv-zabbix:~$ sudo nano /usr/lib/zabbix/externalscripts/domain_checks #!/bin/bash # получаем имя домена DOMAIN=$1 #если домен не передан - выводим массив для автообнаружения if [[ $DOMAIN = "" ]]; then #заполняем массив из файла и выводим в JSON readarray DOMAINLIST < /usr/lib/zabbix/script/domain.txt if ((${#DOMAINLIST[*]}>0)); then echo "{" echo " \"data\": [" for ((a=0; a < ${#DOMAINLIST[*]}; a++)) do x=${DOMAINLIST[$a]}; x=${x//[[:space:]]/}; echo " {" echo " \"{#DOMAIN}\": \"${x}\"" if ((a+1 < ${#DOMAINLIST[*]})); then echo " }," else echo " }" fi done echo " ]" echo "}" fi else # получаем имя зоны ZONE=`echo $DOMAIN | sed 's/\./ /' | awk '{ print $2 }'` # получаем дату протухания домена # Должна вернуться в формате ГГГГ-ММ-ДД (год-месяц-день) case "$ZONE" in ru|net.ru|org.ru|pp.ru|рф) DATE=`whois $DOMAIN | grep paid-till | awk '{ print $2 }' | sed 's/\./-/g'` ;; spb.ru|msk.ru) DATE=`whois -h whois.nic.ru $DOMAIN | grep paid-till | awk '{ print $2 }' | sed 's/\./-/g'` ;; re) DATE="$(whois $DOMAIN | awk '/[Ee]xpir.*[Dd]ate:/ || /[Tt]ill:/ || /expire/ {print $NF; exit;}')" DATE=`date --date=$DATE +%d/%m/%Y` ;; org|com|net) DATE=`whois $DOMAIN | grep "Registry Expiry Date:" | sed 's/Registry Expiry Date: //g;s/T/ /g' | awk '{ print $1 }'` ;; *) DATE="$(whois $DOMAIN | awk '/[Ee]xpir.*[Dd]ate:/ || /[Tt]ill:/ || /expire/ {print $NF; exit;}')" if test -z "$DATE"; then #Отсутствует информация в Whois для домена echo "-1" continue fi esac # считаем дни и выводим expr \( `date --date="$DATE" +%s` - `date +%s` \) / 60 / 60 / 24 fi
ekzorchik@srv-zabbix:~$ sudo chmod +x /usr/lib/zabbix/externalscripts/domain_checks ekzorchik@srv-zabbix:~$ sudo nano /usr/lib/zabbix/script/domain.txt ekzorchik.ru ekzorchik@srv-zabbix:~$ sudo /usr/lib/zabbix/externalscripts/domain_checks { "data": [ { "{#DOMAIN}": "ekzorchik.ru" } ] } ekzorchik@srv-zabbix:~$ sudo /usr/lib/zabbix/externalscripts/domain_checks ekzorchik.ru 94 ekzorchik@srv-zabbix:~$
Шаг №10: Создаю конфигурационный файл для Zabbix
—агента в котором будет предопределен ключ и скрипт выше при запросе которого будет получена дата окончания доменного имени:
ekzorchik@srv-zabbix:~$ sudo nano /etc/zabbix/zabbix_agentd.d/paidtill.conf UserParameter=paidtill[*],/usr/lib/zabbix/externalscripts/domain_checks $1 ekzorchik@srv-zabbix:~$ sudo systemctl restart zabbix-agent
Шаг №11: Проверяю ключ из «Шаг №10»:
ekzorchik@srv-zabbix:~$ sudo zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -t paidtill[ekzorchik.ru] paidtill[ekzorchik.ru] [t|94] ekzorchik@srv-zabbix:~$
Отлично.
Шаг №12: Создаю шаблон Template_DOMAIN_CHECKS
+ элементы данных в нем и привязываю данный шаблон к хосту, а хост – это “Zabbix servers
”
http://IP&DNS/zabbix - user&pass - Настройка – Шаблоны – Создать шаблон
Имя шаблона: Template_DOMAIN_CHECKS
Группы: Zabbix servers
И нажимаю «Добавить
», перехожу затем в «Элементы данных
» — «Создать элемент данных
»
Имя: Domain ekzorchik.ru paid-till:
Тип: Zabbix-агент
Ключ: paidtill[ekzorchik.ru]
Тип информации: Числовой (целое положительное)
Единица измерения: дня(ей)
Интервал обновления: 1m (в рамках теста)
Новая группа элементов данных: Paidtill (у меня нет пока никаких, так что я создаю)
Активировано: Отмечено галочкой
И нажимаю «Добавить
», привязываю шаблон к хосту – должно получиться так:
Т.к. у меня в рамках теста «Интервал обновления
» равен 1m
, то мне не нужно инициализировать запуск опроса принудительно, как если бы временной промежуток составлял минуты или дни. А делается это так на будущее:
http://IP&DNS/zabbix - user&pass - Настройка – Шаблоны – Template_DOMAIN_CHECKS – Элементы данных
– и отмечаю галочкой элемент и нажимаю «Проверить сейчас
»:
После проверяю, что информацию в Web
-интерфейсе появляется:
http://IP&DNS/zabbix - user&pass - Мониторинг – Последние данные
, выполняю сортировку:
Группа элементов данных: Paidtill
и нажимаю «Применить
», вижу:
Если для вашего доменного имени виден результат, то можно смело изменить «Интервал обновления» на раз в месяц или раз в год, но по аналогии с указанием временного промежутка опроса для SSL
сертификата используем «Пользовательские интервалы».
Интервал обновления: 1s
По расписанию: md30
И нажимаю «Обновить
».
итого 94
дня до окончания действия проплаченного срока пользования доменным именем. Мне обычно от регистратора, где я его (доменное имя) приобрел уже за 2
месяца (60
дней) на почту приходят уведомления об продлении доменного имени. А таким вот образом выше я и сам буду знать, когда время подходит.
Выше работает. На этом у меня всё, поставленные и разобранные задачи выполнены, с уважением автор блога Олло Александр aka ekzorchik.