SSL certificates Zabix
Last updated
Was this helpful?
Last updated
Was this helpful?
«Ничто не вечно под луной» Уильям Шекспир
Если вы отвечаете за работоспособность сайтов, то эта статья поможет вам и вашим клиентам своевременно продлить срок регистрации доменов и вовремя обновить SSL-сертификаты.
Конечно, владельцы сайтов получат по электронной почте извещения о необходимости продления услуг, однако их легко не заметить или проигнорировать. И если просроченный сертификат можно заменить бесплатным Let’s Encrypt за несколько минут, то на восстановление работоспособности домена, у которого снято делегирование, может уйти больше суток. Все это время сайт не будет работать, что принесет вашим клиентам убытки.
Кроме того, после окончания срока регистрации и освобождения доменное имя может быть зарегистрировано кем угодно. В результате клиенту придется либо выкупать домен обратно, либо регистрировать и продвигать новый домен.
На сервисе SAAS интернет-магазинов нужно контролировать сотни доменов. Дополнительно задача контроля усложняется тем обстоятельством, что все время открываются новые сайты, а старые могут закрываться. Поэтому тут не обойтись без автоматизации, которую можно реализовать при помощи Zabbix.
Как и предыдущих статьях нашей серии про Zabbix, мы сначала рассмотрим ручные методы контроля, а затем перейдем к описанию шаблона и скриптов контроля для Zabbix.
Срок действия сертификата можно проверить в браузере, а также в командной строке ОС. Рассмотрим оба способа.
Любой пользователь может узнать срок действия сертификата сайта, открытого в браузере. Для этого в Chrome, например, ему достаточно щелкнуть мышкой символ замка в адресной строке браузера, расположенный слева от URL сайта, выбрать строку Безопасное подключение и щелкнуть строку Действительный сертификат. После этого на экране появится окно с информацией о сертификате, подключенном к сайту (рис. 1).
Рис. 1. Информация о сертификате, подключенном к сайту
В нижней части этого окна в блоке Действителен указан диапазон дат, в пределах которого сертификат будет работоспособен. Попытки подключения к сайту после завершения этого срока приведут к появлению у пользователей предупреждающих сообщений или даже к невозможности работы с сайтом.
Аналогичный способ посмотреть срок действия сертификата есть и в других браузерах. В Firefox, например, нужно щелкнуть символ замка слева от URL сайта, выбрать строку Защищенное соединение, а затем выбрать строку Подробнее. Далее нужно щелкнуть кнопку Посмотреть сертификат. В блоке Срок действия вы найдете информацию о диапазоне дат, в пределах которого сертификат будет действительным.
Аналогичные способы проверки сертификатов есть и в браузерах смартфонов.
В интернете нетрудно найти способ проверки сроков действия сертификата, установленного на сайте, из командной строки с помощью программы openssl.
Сертификат действителен с даты notBefore и до даты notAfter.
Если вас интересует только дата, до которой будет работать сертификат, используйте такую команду:
При запуске передайте ему доменное имя сайта и номер порта:
Узнать, до какой даты оплачена регистрация доменного имени, и когда доменное имя будет освобождено, можно с помощью команды whois. Просто передайте этой команде проверяемое доменное имя:
Параметр paid-till содержит дату и время окончания регистрации доменного имени, а параметр free-date — дату его освобождения.
Используя приведенные выше команды и программу zabbix_sender, описанную в предыдущей статье серии, можно организовать мониторинг сроков окончания действия сертификатов и регистрации доменных имен. В случае SAAS-сервиса интернет-магазинов ситуация осложняется тем, что доменов, подлежащих мониторингу сотни, постоянно добавляются новые и иногда исчезают старые.
Для получения списка доменных имен активных интернет-магазинов мы используем вызов внутренней CRM сервиса SAAS. Далее, на основе этого списка с помощью программного интерфейса Zabbix API создается или редактируется список элементов данных Items, содержащих информацию для мониторинга, а также список соответствующих триггеров.
Мы не можем опубликовать API проприетарной системы CRM сервиса SAAS, но вам в любом случае при постановке аналогичной задачи придется выполнять собственную интеграцию со своей CRM. Мы подскажем, где это нужно сделать в опубликованном скрипте мониторинга.
Программа domain_monitor.pl выполняет все описанные выше функции по динамическому формированию списка элементов данных и триггеров в соответствии со списком работающих интернет-магазинов. Далее она получает информацию обо всех контролируемых доменах и сертификатах, а потом отправляет ее на сервер Zabbix.
Сразу после запуска программа загружает файл конфигурации, содержащий реквизиты доступа к Zabbix API:
В параметре zabbix_server_url укажите URL для доступа к вашему серверу Zabbix для отправки HTTP POST запросов к файлу api_jsonrpc.php.
Через параметры zabbix_server_login и zabbix_server_password следует передать логин и пароль доступа к API. Вы можете использовать здесь реквизиты доступа администратора Zabbix или другого пользователя, обладающего необходимыми правами.
И, наконец, параметр zabbix_server_ip задает адрес IP вашего сервера Zabbix.
Загрузив файл конфигурации, программа domain_monitor.pl открывает соединение с сервером Zabbix через API с помощью функции zabbix_open:
Функции для обращения к Zabbix API будут отписаны ниже в разделе «Функции для работы с API Zabbix» этой статьи.
На следующем шаге программа domain_monitor.pl получает из встроенной CRM ссылку на хэш, содержащий информацию обо всех доменах интернет-магазинов, работающих на момент запуска программы на SAAS-сервисе (открытых сайтов):
Вам нужно будет реализовать эту функцию самостоятельно, так как для получения хэша доменов она обращается к встроенной CRM сервиса SAAS.
Получив хэш доменов работающих интернет-магазинов, программа формирует хэш всех доменов, которые на момент запуска уже контролируются при помощи Zabbix. Для этого вызывается функция get_all_monitored_domains:
Для работы с доменными именами сервиса на сервере Zabbix была создана группа «Shop2YOU Domains». Вам нужно будет создать группу, например, с названием вашего сервиса или компании.
Соединение с Zabbix API передается функции get_all_monitored_domains в качестве первого параметра, а имя группы —в качестве второго параметра.
Таким образом, в переменной all_sites хранится ссылка на хэш со всеми доменами, которые работают, а в переменной all_monitored_domains — с доменами, которые находятся на мониторинге. Эти данные загружены на момент запуска программы domain_monitor.pl.
Теперь нужно актуализировать в Zabbix список доменов, добавив туда отсутствующие с момента предыдущей проверки элементы Items и триггеры, а также удалив ненужные элементы для интернет-магазинов, которые прекратили свою работу.
Первая из этих задач решается функцией create_missing_domain_in_zabbix, а вторая — функцией delete_closed_domains_from_zabbix.
Функции create_missing_domain_in_zabbix нужно передать ссылку на Zabbix API, имя группы, имя шаблона, который применяется для мониторинга доменов, ссылку на хэш с работающими доменами all_sites, а также ссылку на контролируемые домены all_monitored_domains:
Функции delete_closed_domains_from_zabbix передаются те же самые параметры:
Теперь, когда список контролируемых при помощи Zabbix доменов приведен в соответствие списку работающих сайтов из CRM сервиса SAAS, можно отправлять данные с текущей информацией о доменах на сервер Zabbix.
Эта операция выполняется в цикле по хэшу со всеми работающими доменами all_sites:
Отправка данных выполняется при помощи функции send_value_to_zabbix. Как и в предыдущей статье нашей серии, для отправки запускается программа zabbix_sender. Однако здесь каждый параметр отправляется отдельно:
Через параметр -z программе zabbix_sender передается адрес IP сервера Zabbix, через параметр -s передается имя хоста, которое в нашем случае соответствует проверяемому домену. Параметры -k и -o используются, соответственно, для передачи имени ключа и значения.
Изучив приведенный выше цикл по хэшу, вы узнаете, какая информация о доменах попадает на сервер:
days_before_domain_expire — количество дней до завершения регистрации домена;
days_before_ssl_expire — количество дней до завершения периода действия сертификата;
domain_ssl_matches — сертификат на сайте соответствует доменному имени сайта;
domain_has_ssl — к сайту подключен сертификат SSL;
whois_ok — команда whois вернула правильную информацию о домене;
a_found — в DNS домена обнаружена запись A;
a — содержимое записи A для домена;
mx_found — в DNS домена обнаружена запись MX;
mx — содержимое записи MX для домена
Для организации собственной системы мониторинга доменов вам пригодится функция get_domain_info, которая вызывается функцией get_opened_domains_from_billing при получении хэша с данными о доменах открытых интернет-магазинов.
Функции get_domain_info нужно передать в качестве первого параметра доменное имя, а в качестве второго — порт, на котором работает проверяемый сайт (обычно 443). Функция записывает полученные данные в хэш domain_info и возвращает этот хэш вызывающей функции (в нашем случае это get_opened_domains_from_billing).
Прежде всего, функция get_domain_info записывает в хэш доменное имя, для которого она будет определять текущие параметры:
На следующем шаге функция определяет, подключен ли к сайту с этим доменным именем сертификат SSL. Для этого анализируются результаты выполнения следующей команды:
Если на сервере нет сертификата для домена, в хэше по ключу domain_has_ssl записывается нулевое значение, в противном случае — значение единицы. Однако само по себе наличие выдачи результатов использованной здесь команды еще не говорит о валидности сертификата. Может быть такая ситуация, когда на сервере размещено несколько сайтов, и для сайта, у которого нет сертификата, будет получен сертификат другого сайта с этого же сервера.
Чтобы убедиться в соответствии доменного сертификата имени, на который выписан полученный сертификат, проверяем, упоминается ли проверяемое доменное имя в результатах выдачи следующей команды:
Если сертификат соответствует доменному имени, записываем в хэш для ключа domain_ssl_matches значение 1, если нет — значение 0. Несоответствие доменного имени сертификату в данном случае является поводом проверить сертификат данного сайта и настройку Web-сервера.
Для валидного сертификата функция get_domain_info получает количество дней до завершения его срока действия:
Полученное значение записывается в хэш по ключу days_before_ssl_expire.
Для того чтобы получить данные DNS для домена, мы используем функцию parse_whois пакета Net::Whois::Parser:
Прежде всего, функция get_domain_info пытается отыскать в результатах выдачи parse_whois дату завершения регистрации доменного имени. В зависимости от сервера DNS эта дата может обозначаться в выдаче whois по-разному: «paid_till», «expiration_date», «registry_expiry_date» и «Registry Expiry Date». Не исключено, что бывают и другие варианты.
Если ни один из этих способов поиска даты завершения регистрации домена не приводит к успеху, для ключа whois_ok записывается нулевое значение. В этом случае нужно исследовать домен вручную, и, возможно, дополнить приведенный выше фрагмент кода.
Но если дата найдена, то она преобразуется в количество дней до окончания регистрации и записывается в хэш по ключу days_before_domain_expire:
Следующий фрагмент функции get_domain_info используется для определения наличия в DNS записей A и MX для исследуемого домена с помощью функции get_domain_info_from_dns:
Действия, выполняемые этим фрагментом кода, понятны и без дополнительных объяснений. Что же касается функции get_domain_info_from_dns, то она получает данные домена из DSN с помощью модуля Net::DNS::Resolver:
Функция zabbix_open вызывает конструктор модуля Zabbix::Tiny:
Функция get_group_id получает от Zabbix API идентификатор группы по ее имени:
Функция get_group_hosts возвращает хосты для группы с заданным именем и вызывается функцией get_all_monitored_domains:
В нашем случае эти хосты представляют собой доменные имена, для которых нужно контролировать сертификаты SSL.
Чтобы по имени шаблона получить его идентификатор, используется функция get_template_id:
Для мониторинга каждого доменного имени программа domain_monitor.pl создает отдельный хост, вызывая для этого функцию create_host:
В качестве параметров этой функции передаются соединение с сервером Zabbix, имя хоста (то есть имя контролируемого домена), имя группы и шаблона.
Функция get_host_id возвращает идентификатор хоста, заданного своим именем:
Если интернет-магазин закрылся, то его сайт нужно удалить из мониторинга. Функция delete_host удаляет хост по его идентификатору:
Чтобы получить все домены, которые находятся на мониторинге, программа domain_monitor.pl вызывает функцию get_all_monitored_domains. Она возвращает все хосты для группы с заданным именем:
Функция create_missing_domain_in_zabbix добавляет хосты в мониторинг, пользуясь для этого ссылкой на хэш hosts и функцией create_host:
При этом учитывается, что имена доменов могут быть в кодировке Punyсode.
И, наконец, функция delete_closed_domains_from_zabbix удаляет из мониторинга хосты, которые соответствуют сайтам прекративших свою работу интернет-магазинов:
Вам нужно будет самостоятельно реализовать функцию find_domain_in_billing для поиска таких сайтов в вашей CRM.
В этом шаблоне определены ключи, о которых мы говорили в нашей статье (рис. 2).
Рис. 2. Ключи в шаблоне мониторинга доменных имен и сертификатов
Триггеры показаны на рис. 3.
Рис. 3. Триггеры для мониторинга данных доменов и сертификатов
Здесь мы назначили среднюю серьезность только для триггеров Domain registration expires in 30 days (регистрация домена закончится через 30 дней) и SSL expired in 7 days (срок действия сертификата истекает через 7 дней). Остальные триггеры только для информации.
Вы, конечно, можете настроить эти триггеры по своему усмотрению.
Для запуска программы проверки сроков регистрации доменных имен и срока действия сертификатов SSL подготовьте задание crontab, например, такое:
Здесь проверка запускается каждый день ночью, в 3 часа 34 минуты.
Автор: Александр Фролов.
Например, следующая команда покажет в консоли диапазоны дат, в пределах которых будет действителен сертификат сайта , использующего протокол https на порту 443:
Чтобы организовать несложную проверку сертификатов из командной строки, используйте скрипт get_ssl_info.sh, :
Что же касается описания Zabbix API, то для версии 6.2 . На русском языке описание API доступно для версии 6.0 .
Эту программу .
Полный код функции .
Для работы с Zabbix API наша программа использует модуль Zabbix::Tiny: или .
По адресу есть решения для интеграции на разных языках программирования.
Шаблон мониторинга доменных имен и сертификатов вы можете загрузить .