В любой инфраструктуре со временем накапливается множество версий сервисов: 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. Главный вывод: не пытайтесь сразу охватить всё — начните с критичных сервисов, автоматизируйте сбор и регулярно обновляйте базы. Инструмент должен быть простым в использовании и не создавать дополнительную нагрузку на инфраструктуру. В итоге вы получите контроль над зоопарком версий и сможете своевременно реагировать на угрозы.