Мониторинг открытых источников об уязвимостях: CVE, БДУ ФСТЭК, бюллетени вендоров

Сканер находит уязвимость только после того, как его ленты тестов обновились и очередной скан дошёл до нужного узла. Это дни, а иногда недели. Критичную дыру в VPN-шлюзе или веб-сервере, которой уже пользуются атакующие, вы должны узнать в день публикации. Для этого нужен второй канал: мониторинг открытых источников. Ниже какие источники читать, как не утонуть в потоке, как отсеивать лишнее скриптом и как показывать, что мониторинг делается регулярно.
Что делать, когда сообщение оказалось про ваш периметр, описано в плейбуке критичной уязвимости. Куда записывать результат — в реестр уязвимостей.
Какие источники читать
Читать «всё» не получится. Выберите источники по принципу: что у вас стоит, то и читаем. Для типовой инфраструктуры с Linux, Windows и сетевым оборудованием набор такой.
| Источник | Что даёт | Как получать |
|---|---|---|
| Каталог KEV (CISA) | Уязвимости, которые уже используются в атаках: главный сигнал срочности | Лента JSON, скрипт ниже; рассылка CISA |
| Банк данных угроз (БДУ) ФСТЭК России | Российская база уязвимостей с оценками и рекомендациями, обязательна для операторов КИИ и ГИС | Сайт bdu.fstec.ru, поиск по продукту; для регулярной проверки скрипт или RSS, если доступен |
| Бюллетени НКЦКИ | Уведомления об уязвимостях и угрозах для организаций, взаимодействующих с ГосСОПКА | Сайт cert.gov.ru, рассылка при подключении к ГосСОПКА |
| Бюллетени вашего дистрибутива | Debian: DSA и трекер безопасности; Ubuntu: USN; RHEL, Rocky, Alma: errata; Astra Linux и РЕД ОС: бюллетени производителя | Почтовые рассылки на общий ящик, а не на личный |
| Microsoft | Ежемесячный Patch Tuesday (второй вторник месяца) и внеплановые выпуски | Msrc, Update Guide, рассылка |
| Производители сетевого оборудования и VPN | Бюллетени PSIRT: Cisco, Fortinet, Palo Alto и других, чьё оборудование стоит у вас | Рассылки по продуктам |
| NVD и GitHub Advisory Database | Подробности по CVE и уязвимости в библиотеках | Поиск по продукту; для зависимостей — SCA в конвейере: SAST и SCA |
Практическое правило: на каждый ваш ключевой продукт должен быть хотя бы один подписанный источник. Если у вас стоит nginx, PostgreSQL, OpenVPN, Fortinet и 1С, должны быть подписки на соответствующие рассылки или записи в списке для скрипта.
Список продуктов для наблюдения
Список вытекает из реестра активов: возьмите оттуда ключевые продукты и версии. С серверов Linux можно быстро собрать то, что установлено:
dpkg-query -W -f='${Package} ${Version}\n' | sort | head -n 20
rpm -qa --qf '%{NAME} %{VERSION}\n' | sort | head -n 20
Ожидаемо: список пакетов с версиями. Он длинный, поэтому для наблюдения выберите значимое: веб-серверы, базы данных, VPN, почта, гипервизоры, сетевые устройства, CMS, ключевые библиотеки. Результат в файл watchlist.txt, по строке на продукт или производителя:
# watchlist.txt
nginx
openssh
postgresql
openvpn
fortinet
cisco
vmware
wordpress
Файл обновляйте при каждом изменении набора систем: новое решение — новая строка. Это работа для владельца реестра активов, а не разовая акция.
Скрипт: что нового в KEV по вашим продуктам
Скрипт скачивает каталог KEV, выбирает записи, добавленные после последнего запуска, и показывает те, где производитель или продукт совпадают со списком. Если находка есть, код выхода 1: удобно запускать из cron и отправлять вывод на общую почту или в трекер.
#!/usr/bin/env python3
"""Новые записи каталога KEV (CISA) по списку продуктов.
Использование: kev_watch.py watchlist.txt state.txt
state.txt хранит дату последней обработанной записи. Перед первым запуском
создайте его с вчерашней датой в формате ГГГГ-ММ-ДД, иначе будет выведена вся история."""
import json
import pathlib
import sys
import urllib.request
URL = 'https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json'
watch = [l.strip().lower() for l in open(sys.argv[1], encoding='utf-8') if l.strip() and not l.startswith('#')]
state = pathlib.Path(sys.argv[2])
last = state.read_text().strip() if state.exists() else '1970-01-01'
with urllib.request.urlopen(URL, timeout=60) as r:
data = json.load(r)
new = [v for v in data['vulnerabilities']
if v['dateAdded'] > last and any(w in f"{v['vendorProject']} {v['product']}".lower() for w in watch)]
for v in sorted(new, key=lambda x: x['dateAdded']):
print(f"{v['dateAdded']} {v['cveID']} {v['vendorProject']} {v['product']}")
print(f" {v['vulnerabilityName']}")
print(f" срок для федеральных агентств США: {v['dueDate']}; в атаках шифровальщиков: {v['knownRansomwareCampaignUse']}")
print(f" что сделать: {v['requiredAction']}")
state.write_text(max(v['dateAdded'] for v in data['vulnerabilities']))
sys.exit(1 if new else 0)
Ожидаемо: если по вашим продуктам ничего не добавили, вывода нет, код 0. Если есть совпадение, блок из четырёх строк на каждую запись. Каталог содержит и поля shortDescription с описанием: выведите его, если хотите больше контекста. Ограничения: скрипт ищет по подстроке в названии производителя и продукта, поэтому может давать лишнее (слово «cisco» и «ciscoworks»), а название вашего продукта в каталоге может быть записано иначе. Первые недели просматривайте результат и уточняйте список. Каталог — английский и покрывает не все российские продукты: российские дополняет БДУ.
Ежедневная проверка на пятнадцать минут
Мониторинг, который «делают, когда вспомнят», не работает. Закрепите его за конкретным человеком и временем. Практичная схема для небольшой команды:
- Дежурный по уязвимостям меняется еженедельно; в отпуск уходит с передачей.
- Каждое утро в одно и то же время он смотрит общий ящик с рассылками, вывод скрипта по KEV и страницу БДУ по ключевым продуктам. Это пятнадцать минут.
- По каждому пункту применяет схему решения (ниже) и делает запись в журнал.
- В понедельник коротко рассказывает команде, что было за неделю и что закрыто.
Вопросы схемы построены так, чтобы отсекать шум как можно раньше: сначала «есть ли у нас этот продукт», затем «доступен ли он снаружи», затем «есть ли исправление». На последнем шаге в любом случае появляется запись и ссылка на источник.
Журнал мониторинга
Журнал — это доказательство, что мониторинг идёт. Достаточно таблицы:
| Дата | Источник | Запись | Относится к нам | Действие |
|---|---|---|---|---|
| 05.11 | KEV | CVE по VPN-шлюзу производителя Х | Да, периметр | P1, заявка № 214, срок 08.11 |
| 05.11 | Рассылка Debian | DSA по пакету openssl | Да, внутренние узлы | P3, плановое обновление |
| 06.11 | БДУ | Запись по продукту, которого у нас нет | Нет | Без действий |
Записи «нас не касается» тоже нужны: они показывают, что источник читали, и сокращают повторное изучение.
Связь с остальным процессом
- Каждое «касается» превращается в запись реестра уязвимостей и заявку, источник сохраняется в карточке. Позже вы покажете: уязвимость устранена, и вот откуда мы о ней узнали.
- Если сообщение про периметр и есть признаки эксплуатации, включите плейбук критичной уязвимости. Окно между публикацией и атаками сейчас измеряется часами: разбор о сутках на патч.
- Порядок обработки сообщений из открытых источников закрепите в регламенте: кто дежурит, где журнал, какие сроки.
Какие артефакты хранить
| Что хранить | Что показывает |
|---|---|
| Список источников и подписок с адресом общего ящика | Мониторинг организован по продуктам |
| Журнал мониторинга за последние месяцы | Источники читаются регулярно, а не разово |
| Три записи реестра с указанием источника и результатом устранения | Устранение связано с источником |
| Раздел регламента о порядке обработки сообщений | Порядок утверждён и известен дежурным |
Диагностика
| Симптом | Причина и что делать |
|---|---|
| В ящике сотни писем, никто не читает | Подписок слишком много. Оставьте только продукты из списка и настройте фильтр по ключевым словам |
| Скрипт молчит неделями | Либо повезло, либо список слишком узкий. Проверьте на старой дате: вручную поставьте дату в state.txt на месяц назад и посмотрите вывод |
| Об уязвимости узнали от клиента | Продукта нет в списке. Добавьте его и сверьте список с реестром активов |
| Дежурный пропустил день | Нет замены. Закрепите пару: основной и резервный, и напоминание в календаре |
Где это в модели зрелости
Материал относится к направлению «Управление уязвимостями» (хаб: уязвимости, карта: карта зрелости). Это одно из требований первого уровня: информация об уязвимостях из открытых источников анализируется и устраняется в сроки внутреннего регламента. Дальше эти данные подкрепляются платформой анализа угроз: Wazuh и обогащение KEV.
Как проверить
- Для пяти ключевых продуктов найдите подписку или строку в списке наблюдения.
- Журнал мониторинга содержит записи за каждую рабочую неделю последнего месяца.
- Для последней записи «касается нас» есть заявка с источником и срок.
- Скрипт на тестовой дате в state.txt выводит ожидаемые записи, а при актуальной дате молчит.
Источники
- CISA, каталог известных эксплуатируемых уязвимостей: cisa.gov.
- Банк данных угроз безопасности информации ФСТЭК России: bdu.fstec.ru.
- НКЦКИ: cert.gov.ru.
- NVD, National Vulnerability Database: nvd.nist.gov.
- CIS Control 7: cisecurity.org/controls.


















