Как мониторить:

  • Дату окончания действия домена
  • Дату продления 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

Проверка окончания сертификата раз в 30 дней

И нажимаю «Обновить», изменения к элементу данных применились.

Имя «Элемента данных»: Certificate lin.ekzorchik.ru expire

Элемент данных проверки сертификата раз в 5 минут (для теста)

Созданные "Элементы данных" для всех доменов

Выделил все три элемента данных и получив принудительно данные вижу через «Мониторинг» — «Последние данные»

Результат извлечения по трем поддоменам

Так все выше очень полезно.

Шаг №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.