Мониторинг срока действия TLS-сертификатов и автопродления

0
8
Обложка статьи: Мониторинг срока действия TLS-сертификатов и автопродления

Автопродление certbot работает надёжно ровно до первого случая, когда оно не сработало: закончилось место на диске, изменился путь для проверки домена, истёк срок действия другого компонента в цепочке. Сертификат истекает молча, сайт перестаёт открываться у части пользователей, а узнаёт об этом обычно сама компания — по жалобам клиентов. Отдельная, независимая от certbot проверка срока действия закрывает именно этот разрыв. Про сами параметры TLS (шифры, протоколы, заголовки) — отдельно: проверка TLS своего сайта и настройка TLS в nginx.

Статья опирается на логику направления «Сетевая безопасность» из методики зрелости Группы Сбер (источник); это методика для крупных компаний, мы используем её как ориентир и пересказываем своими словами. Проверка логики выполнена с самоподписанными тестовыми сертификатами в контейнере, после неё всё удалено.

Что должно получиться

Уровень Что это значит на практике
1. Начальный Истечение срока действия сертификата обнаруживается заранее и автоматически, а не по факту неработающего сайта

Критерии сформулированы нами по мотивам методики, это ориентир, а не оценка соответствия.

Быстрая проверка: да/нет

Самый простой и переносимый способ — встроенный ключ OpenSSL, который сам сравнивает срок действия с указанным интервалом и возвращает код завершения:

openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -checkend 1209600

Интервал задаётся в секундах (1209600 — 14 дней). Код возврата 0 означает «сертификат не истечёт раньше указанного срока», 1 — «истечёт раньше» (в выводе при этом строка «Certificate will expire»). Этого достаточно для простого да/нет в скрипте мониторинга:

if ! openssl x509 -in "$CERT" -noout -checkend 1209600; then
  echo "ПРЕДУПРЕЖДЕНИЕ: $CERT истекает менее чем через 14 дней"
fi

Точное число дней для отчёта

Если нужна не только проверка порога, но и цифра для дашборда или отчёта, посчитайте разницу дат явно:

end_epoch=$(date -d "$(openssl x509 -in "$CERT" -noout -enddate | cut -d= -f2)" +%s)
now_epoch=$(date +%s)
days_left=$(( (end_epoch - now_epoch) / 86400 ))
echo "осталось дней: $days_left"

На тестовом сертификате со сроком действия двое суток обе проверки дали согласованный результат: явный расчёт показал «осталось дней: 2», а -checkend с порогом 14 дней вернул код ошибки (сертификат истечёт раньше), с порогом в один день — код успеха.

Почему недостаточно только автопродления certbot

  • Автопродление и проверка срока — разные механизмы. Таймер certbot может быть выключен, сломан или настроен на домен, который давно не используется, пока независимая проверка срока действия не завязана на certbot и видит фактическое состояние сертификата на диске или на самом сокете.
  • Сертификат может лежать не там, где его ищет мониторинг. После смены пути или домена certbot продлевает один файл, а служба использует другой — отдельная проверка по реальному пути конфигурации веб-сервера находит такое расхождение.
  • Прямая проверка самого соединения надёжнее проверки файла на диске, если нужно убедиться, что именно отдаётся клиентам:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
  | openssl x509 -noout -checkend 1209600

Порядок внедрения

  1. Составьте список доменов и сертификатов, включая внутренние сервисы, не только публичный сайт.
  2. Проверяйте оба уровня: файл на диске (быстро, без сети) и реальное соединение (медленнее, но видит то, что реально отдаётся клиенту).
  3. Задайте порог с запасом на случай, если автопродление не сработает с первого раза и понадобится время на ручное вмешательство (14 дней — разумный старт).
  4. Отправляйте предупреждение туда, где его увидят, а не только в журнал, который никто не читает: канал команды, система мониторинга, отдельное письмо.
  5. Включите в общий мониторинг, а не держите отдельным скриптом по расписанию cron без связи с остальной системой наблюдения.

Диагностика

Симптом Причина и что делать
Сертификат истёк, хотя автопродление настроено Таймер или хук продления не отработал. Проверьте журнал certbot отдельно, независимая проверка срока — это сигнал, а не диагноз причины
Проверка файла на диске показывает «ок», а сайт отдаёт просроченный сертификат Служба не перечитала обновлённый сертификат после продления. Добавьте перезапуск или reload службы в хук продления certbot
date -d не понимает формат даты от openssl x509 -enddate Формат зависит от локали. Используйте -checkend для простой проверки порога, если точное число дней не требуется
Предупреждение срабатывает, но на него никто не реагирует Сообщение уходит туда, где его не видят. Подключите к тому же каналу, что и остальные оповещения мониторинга

Где это в модели зрелости

Материал относится к направлению «Сетевая безопасность» (материалы направления, карта зрелости). Начальный уровень требует, чтобы базовые отказы инфраструктуры обнаруживались заранее: истечение сертификата — один из самых предсказуемых и при этом самых частых по статистике инцидентов именно потому, что его слишком легко оставить без независимой проверки.

Как проверить

  1. Проверка срока действия не зависит от certbot и работает независимо от того, сломалось автопродление или нет.
  2. Проверяются и файл сертификата, и реальное TLS-соединение для публичных сервисов.
  3. Предупреждение приходит с запасом (например, за 14 дней), а не в последний день.
  4. Предупреждение доходит до канала, где его реально увидят и отреагируют.

Источники

  • Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.
  • Документация OpenSSL, команда x509: docs.openssl.org.

Комментарии закрыты.