Обзор — что делает экран
Наборы правил обнаружения (/security/rulesets) — это эталонная библиотека, которая приводит каждое правило обнаружения, наблюдаемое и оцениваемое InfraGuard, к 44 наборам правил в 11 категориях. Экран решает три задачи в одном месте:
- Обзор — раскладывает карточки наборов правил внутри разделов по категориям и показывает для выбранного временного окна (1h/6h/24h) фактическое количество событий и отметку времени последнего появления для каждого набора.
- Пояснение — описывает каждый набор правил в три шага (что обнаруживает · почему срабатывает · худший случай).
- Воспроизведение — клик по карточке открывает модальное окно с недавними событиями, фактически совпавшими с этим набором правил, в таблице, специфичной для движка.
Ключ архитектуры — разделение структуры классификации и пояснительного текста. Структура (категории, ключи наборов правил, правила совпадения по движкам) находится в независимом от локали статическом SOT App\Support\SecurityRulebook (безопасно для кеша), а пояснительный текст (название, значение, признаки, риск) — в resources/lang/{ko,en}/secrules.php. Фронтенд объединяет их по key+category при отрисовке.
Этот экран строго доступен только для чтения. Он не включает, не отключает, не редактирует и не удаляет наборы правил. Это справочный каталог, отвечающий на вопрос «что сейчас наблюдается в этой организации и что это значит?». Место, где действительно изменяются константы обнаружения (пороги/окна), — Правила и пороги (Администрирование ▸ Правила).
44 набора правил подключены к реальной телеметрии
Наборы правил — не абстрактные правила: каждый связан с реальной таблицей сбора через правило совпадения (match). Все источники находятся на соединении legacy_glory (устаревшая БД, которую наполняет парк коллекторов).
| Движок | Правило совпадения | Таблица-источник | Наборы правил |
|---|---|---|---|
| Suricata IDS | sig: совпадение по подстроке в нижнем регистре с массивом фрагментов сигнатур |
suricata_alert_ct |
33 |
| Web (nginx) | classifyWeb: приоритетная, непересекающаяся классификация запросов is_suspicious по url/ua/status |
nginx_meta_ct |
8 |
| Kitsune ML | source=kitsune: аномальные IP по автокодировщику |
kitsune_detail_log |
1 |
| Эвристика (srct) | source=srct: эвристические прогоны по сканированию/интенсивности |
srct_process_log |
1 |
| Отпечаток JA3 | source=ja3: разнообразие JA3 (ротация) по IP-источнику |
suricata_tls_ct |
1 |
Когда использовать
- Получить контекст перед разбором — встретив незнакомую сигнатуру в разделе Угрозы или Обнаружения · ИИ JA3, уточните, к какому семейству наборов правил она относится и что подразумевает.
- Окинуть взглядом картину наблюдения — сразу видно, какие категории срабатывают за последние 24h и находятся ли веб-атаки на уровне разведки или уже переросли в зондирование RCE.
- Обучение и отчётность — учебный и отчётный материал, объясняющий, «что мы обнаруживаем», в разрезе категорий и движков.
- Воспроизвести события — изучите реальные IP-адреса запросов, URL и коды состояния, недавно совпавшие с конкретным набором правил (например,
web_secret_scan), а затем передайте подозрительных в Репутацию IP или Блок-лист.
Компоновка
Верхние KPI
| KPI | Подпись | Значение |
|---|---|---|
total |
Наборы правил | Всего наборов правил в каталоге (всегда 44) |
active |
Наблюдаемые наборы правил | Наборы правил, у которых в окне сработало хотя бы одно событие (firing) |
events |
События в окне | Сумма счётчиков событий по всем наборам правил |
cats |
Категории | Количество категорий (11) |
Внутренне также вычисляются суммы по движкам (итоги событий kitsune и suricata), чтобы цифры оставались согласованными со ступенью «наборы правил» воронки защиты в разделе «Безопасность».
Элементы управления
- Переключатель окна —
1h(60 мин) ·6h(360 мин) ·24h(1440 мин). По умолчанию24h. - Автообновление (LIVE) — опрашивает
/security/rulesets/liveдля обновления счётчиков (можно приостановить). - Полный экран — скрывает верхнюю навигацию для режима погружённой панели (выход — ESC).
Разделы категорий и карточки наборов правил
11 категорий образуют разделы в порядке отображения, а внутри каждого раздела наборы правил размещаются в сетке карточек minmax(600). На каждой карточке — название набора правил, значок MDI, значок серьёзности (crit/warn/info), количество событий в окне, отметка времени последнего появления и [Open]. При отсутствии событий отображается «тихо / в окне ничего не наблюдалось».
| # | Ключ категории | Подпись | Движок | Наборы правил |
|---|---|---|---|---|
| 1 | tcp_stream |
Целостность TCP-потока | Suricata | 10 |
| 2 | packet_decode |
Декодирование пакетов | Suricata | 4 |
| 3 | protocol_anomaly |
Аномалия протокола | Suricata | 5 |
| 4 | http_anomaly |
Соответствие HTTP | Suricata | 5 |
| 5 | tls_anomaly |
Аномалия TLS | Suricata | 5 |
| 6 | dns_anomaly |
Аномалия DNS | Suricata | 1 |
| 7 | mail_anomaly |
Аномалия почты (SMTP) | Suricata | 3 |
| 8 | web_attack |
Шаблоны веб-атак | nginx | 8 |
| 9 | ml_anomaly |
ML-обнаружение аномалий | Kitsune | 1 |
| 10 | heuristic_scan |
Эвристическое сканирование | srct | 1 |
| 11 | tls_fingerprint |
Отпечаток JA3 | JA3 | 1 |
Как пользоваться
1) Выберите окно → прочитайте общую картину
Сначала выберите интересующее окно (1h/6h/24h). По значению active (наблюдаемые наборы правил) и счётчику событий на каждой карточке видно, что срабатывает сейчас. Учтите, что значок серьёзности отражает подразумеваемую серьёзность: большинство событий движка Suricata имеют sev3 (информационные), но их смысл различается (шум / сканирование / эксплуатация). Значок набора правил отражает именно этот оттенок подразумеваемого, а не исходный sev.
2) Кликните по карточке → модальное окно недавних событий
Клик по карточке вызывает /security/rulesets/events?key=<rulesetKey>&range=<window> и открывает модальное окно, содержащее:
- Трёхшаговое пояснение — что обнаруживает · почему срабатывает · худший случай.
- Агрегаты — количество событий · уникальные источники (различные src IP).
- Чипы совпавших сигнатур (только Suricata) — фактические строки сигнатур, пойманные совпадением по подстроке
sigэтого набора правил, каждая с количеством и минимальным sev (топ-12). - Таблица событий, специфичная для движка (последние 60 строк).
- IP-источник → репутация — кнопка всплывающего окна AbuseIPDB для каждого src IP. Зарегистрированные IP внутренней сети получают значок
internal, а кнопка репутации скрывается (это не даёт принять собственные серверы за атакующих).
Столбцы таблицы событий, специфичной для движка:
| Движок | Столбцы |
|---|---|
| Suricata | время · src · dst · порт · proto · сигнатура · sev |
| nginx | время · src · хост · метод · URL (rawurldecode, 180 символов) · статус |
| Kitsune | время · IP · оценка аномальности · сессии · заблокирован |
| srct | время · просканировано · заблокировано · примечание |
| JA3 | время · IP · разнообразие JA3 · TLS-соединения · разнообразие SNI |
3) Приоритет классификации веб-атак (непересекающийся)
8 веб-наборов правил (nginx) взаимно не пересекаются. Один запрос is_suspicious=1 просматривается в порядке определения в каталоге и относится ровно к одному первому совпавшему набору правил; если не совпал ни один, он попадает в общий перехватчик (web_suspicious_other). Поэтому один и тот же запрос никогда не учитывается дважды в двух веб-наборах правил.
| Приоритет | Ключ набора правил | Признак совпадения (url/ua) | Серьёзность |
|---|---|---|---|
| 1 | web_secret_scan |
.env .git wp-config id_rsa .aws credentials backup.sql .bak |
warn |
| 2 | web_path_traversal |
../ ..%2f %2e%2e etc/passwd boot.ini proc/self |
crit |
| 3 | web_sqli |
union select information_schema sleep( or 1=1 %27or |
crit |
| 4 | web_xss |
<script onerror= javascript: document.cookie |
warn |
| 5 | web_rce_probe |
/bin/sh exec( system( jndi: ${ phpunit |
crit |
| 6 | web_admin_brute |
wp-login xmlrpc.php phpmyadmin /admin/login |
warn |
| 7 | web_bad_bot |
UA: sqlmap nikto masscan nuclei python-requests curl/ |
warn |
| 8 | web_suspicious_other |
(перехватчик — подозрительные запросы, не совпавшие ни с одним из перечисленных выше) | info |
Из соображений производительности веб-классификация агрегирует по выборке из 6,000 самых свежих строк (предел репозитория — 8,000). Во время интенсивных сканирований события за пределами выборки могут не отражаться — читайте цифры как распределение/тенденцию, а не как абсолютные счётчики.
4) Что подразумевает совпадение по подстроке в Suricata
Наборы правил Suricata срабатывают по совпадению подстроки в нижнем регистре со строкой сигнатуры. Например, stream_invalid_ts суммирует каждое событие, в сигнатуре которого есть invalid timestamp. Один набор правил может объединять несколько фактических сигнатур (они видны как чипы «совпавшие сигнатуры» в модальном окне), а ключевые слова sig разных наборов правил спроектированы так, чтобы не пересекаться.
5) Измеренный пример (для справки)
Иллюстративный снимок за 24h: срабатывают 37 из 44 наборов правил, stream_invalid_ts 10,243, web_secret_scan 3,304 (в основном 404 из семейства .env), srct_heuristic 126,252, ja3_rotation 300 (разнообразие 307/307). Значения зависят от организации и момента времени.
Источники данных
Все источники — это соединение legacy_glory (только чтение), доступное исключительно через config('database.connections.legacy_glory') — без жёстко зашитых учётных данных.
| Семейство наборов правил | Таблица | Методы репозитория (выдержка) |
|---|---|---|
| Suricata (33) | suricata_alert_ct |
signatureHistogram() · recentAlertsBySignatures() · distinctIpsBySignatures() |
| Web (8) | nginx_meta_ct (is_suspicious=1) |
suspiciousRows($since, 6000) |
| Kitsune ML (1) | kitsune_detail_log |
kitsuneCount() · kitsuneRecentInWindow() |
| Эвристика (1) | srct_process_log |
srctBlockedSum() · srctRunsInWindow() |
| JA3 (1) | suricata_tls_ct |
topJa3Ips($since, N, excludePrefixes) |
Производительность и кеширование
- Обзор карточек (
build) кешируется на 30 секунд (infr:sec:rulebook:<range>). Suricata извлекает гистограмму сигнатур один раз и суммирует совпадения по подстроке сразу по всем 44 наборам правил, чтобы избежать N+1. - JA3 исключает собственную сеть (зарегистрированные IP инстансов /24) через NOT LIKE в
SecurityScope::excludePrefixes()и засчитывает как нарушителей только IP-источники сja3_variety >= 2. - События в модальном окне ограничены 60 строками на окно. Каждый запрос репозитория использует узкое временное окно + LIMIT + привязку параметров.
Доступ
- Только чтение. Проверка в контроллере —
level≥1для чтения, а сам вход в ролевую область «Безопасность» защищён параметром карты сайтаmin_req=2(эксплуатация безопасности) — на практике сюда попадают staff (=5), admin (=10) или пользователи с областью видимости безопасности. - Поскольку пути записи нет, здесь отсутствуют повторное подтверждение с повышением прав и журнал аудита.
/rulesets,/rulesets/liveи/rulesets/events— все они являются чистым чтением. - Параметр
keyконечной точкиeventsдопускается только из белого списка каталога. Ключи вне списка возвращают404 unknown_ruleset(произвольные обращения к таблицам невозможны).
Соглашение об уровнях: demo=1 · staff=5 · admin=10. Некоторые области дополнительно защищены middleware
infr.level:N. Полную схему градаций см. в разделе Уровни RBAC.
Устранение неполадок и FAQ
Все карточки показывают «тихо»
Либо в выбранном окне (по умолчанию 24h) нет совпавших событий, либо соединение legacy_glory недоступно. Служба аккуратно поглощает ошибки источника и показывает пустые счётчики (0) — карточки не исчезают. Расширьте окно или проверьте соединение.
Счётчики веб-наборов правил расходятся с [Угрозами] / [Обнаружениями]
Веб-классификация — это агрегат распределения по выборке из 6,000 самых свежих строк (а не абсолютный счётчик). Она к тому же непересекающаяся, поэтому запрос относится ровно к одному набору правил. Авторитетный источник событий определяется собственным запросом каждого экрана.
Конкретная сигнатура не попадает ни в один набор правил
Сопоставление в Suricata выполняется по подстроке ключевого слова. Новые или пользовательские сигнатуры, не охваченные каталогом, не суммируются в счётчик ни одного набора правил. Чтобы классифицировать и пояснить их, добавьте ключевое слово сигнатуры в массив sig в SecurityRulebook — это изменение кода, а не настройка времени выполнения.
Нарушителей JA3 ноль, хотя TLS-трафика много
Набор правил JA3 засчитывает как нарушителей только IP-источники с ja3_variety >= 2 (ротация отпечатка). Без ротации источник считается нормальным и не учитывается. IP собственной сети также исключаются.
У IP в модальном окне событий отображается значок internal
Это зарегистрированный IP внутренней сети, определённый через SecurityScope::internalMatchers(). Он не даёт принять за атакующих наши собственные серверы, которые направленность Suricata может пометить как «источник», и скрывает кнопку репутации. Определение внутренней сети задаётся в параметре internal_networks в разделе Операционная политика.
См. также
- Обнаружения · ИИ-анализ последовательностей JA3 — родительский экран (Обнаружения); детерминированная эвристика выводит новые наборы правил из последовательностей JA3.
- Угрозы — разбор сущностей угроз IDS и толкование сигнатур.
- Обзор безопасности — согласован со ступенью «наборы правил» воронки защиты.
- Репутация IP — проверьте IP-источник из модального окна в AbuseIPDB.
- Блок-лист — переведите подозрительный источник в блокировку.
- Правила и пороги (Администрирование ▸ Правила) — реально настройте константы коллекторов обнаружения (пороги/окна).
