В любой инфраструктуре со временем накапливается множество версий сервисов: PostgreSQL, nginx, MySQL, Redis и других. Часть из них уже не поддерживается (EOL), а на некоторых висят известные уязвимости (CVE). Если вы не можете быстро ответить, сколько у вас версий PostgreSQL и какие из них устарели, значит, контроль потерян. В этой статье я расскажу, как подойти к созданию собственного инструмента инвентаризации, какие шаги предпринять, на что обратить внимание и каких ошибок избежать.

Зачем нужна инвентаризация с EOL и CVE

Без централизованного учёта версий вы рискуете столкнуться с неожиданными отказами, уязвимостями и проблемами совместимости. Ручной сбор данных по чатам и вики быстро устаревает. Инструмент, который автоматически собирает информацию о версиях, сравнивает их с базами EOL и CVE, позволяет принимать решения на основе фактов. Это не только безопасность, но и планирование обновлений, оценка рисков и экономия времени.

Шаг 1: Определите источники данных и способ сбора

Первое, что нужно сделать, — понять, откуда брать информацию о сервисах. Варианты: опрос хостов по SSH, использование API систем оркестрации (Kubernetes, Docker), сканирование сети, интеграция с системами мониторинга (Zabbix, Prometheus). Критерии выбора: охват инфраструктуры, частота обновления, сложность реализации. Например, для начала можно ограничиться сбором версий через SSH-команды (psql --version, nginx -v) и парсинг вывода. Важно предусмотреть обработку ошибок: недоступность хоста, отсутствие прав, нестандартные пути установки.

Шаг 2: Настройте хранение и обновление баз EOL и CVE

Для EOL можно использовать открытые источники, например, endoflife.date, который предоставляет JSON-API с датами поддержки. Для CVE — базы NVD (National Vulnerability Database) или OSV. Важно регулярно обновлять эти данные, иначе инструмент будет давать устаревшие сведения. Реализуйте кэширование и фоновые задачи для периодической синхронизации. Учтите, что не все сервисы имеют однозначные идентификаторы в базах CVE, поэтому потребуется маппинг названий и версий.

Шаг 3: Спроектируйте модель данных и интерфейс

Модель должна включать: хост, сервис, версию, дату окончания поддержки (EOL), список CVE с оценкой критичности. Продумайте, как вы будете сопоставлять версии с диапазонами уязвимых версий. Например, для nginx CVE может затрагивать версии с 1.18.0 по 1.20.1. Храните эту информацию в структурированном виде (JSON, реляционная БД). Интерфейс может быть простым: CLI-утилита, выводящая отчёт, или веб-панель. Начните с минимального MVP — CLI, который собирает данные и выводит таблицу.

Типичные ошибки и как их избежать

  • Игнорирование нестандартных установок. Сервисы могут быть установлены в Docker, из исходников или в необычных путях. Реализуйте несколько методов обнаружения.
  • Отсутствие обработки ошибок. Недоступный хост или таймаут не должны ломать весь процесс. Используйте повторные попытки и логирование.
  • Пренебрежение кэшированием. Частые запросы к внешним API могут привести к блокировкам. Например, MySQL однажды заблокировал хост из-за слишком частых запросов — ставьте лимиты и кэш.
  • Неточное сопоставление версий и CVE. Версии могут иметь суффиксы (например, 1.2.3-beta). Учитывайте это при сравнении.
  • Забыли про безопасность. Инструмент собирает чувствительные данные, поэтому обеспечьте шифрование и ограничение доступа.

Пример из практики: при сканировании версий MySQL инструмент так часто обращался к серверу, что сработала защита от брутфорса и хост заблокировал IP. Решение — увеличить интервалы и использовать кэш.

Пример реализации и выводы

Я начал с простого скрипта на Python, который по списку хостов собирал версии PostgreSQL и nginx, затем сверял с endoflife.date и выводил отчёт. Постепенно добавил поддержку других сервисов, интеграцию с NVD и веб-интерфейс на Flask. Главный вывод: не пытайтесь сразу охватить всё — начните с критичных сервисов, автоматизируйте сбор и регулярно обновляйте базы. Инструмент должен быть простым в использовании и не создавать дополнительную нагрузку на инфраструктуру. В итоге вы получите контроль над зоопарком версий и сможете своевременно реагировать на угрозы.