Обзор — что делает экран
Security ▸ Detections (/security/detections) — флагманский экран обнаружения в InfraGuard. Он объединяет три вещи на одной странице:
- Рассказ об алгоритмах обнаружения — обучающие всплывающие подсказки объясняют, как каждый движок ловит угрозы (Kitsune ML · эвристики srct · nginx
is_suspicious· JA3). - Рассказ после обнаружения — показывает на реальных данных аномальные IP · подозрительные веб-запросы · историю запусков, которые каждый движок поймал в недавнем окне.
- ★ Наборы правил по последовательностям JA3 — детерминированная эвристика читает хронологическую последовательность отпечатков JA3 одного IP-источника и перечисляет его «непрерывное аномальное поведение» в виде профессиональных наборов правил, сохраняемых в
infr_sec_ruleset.
Сбор и автоматическая блокировка уже работают на бэкенде (старый интерфейс stats-design показывал лишь таблицы межсетевого экрана и чёрного списка) — задача этого экрана в том, чтобы вывести эту скрытую телеметрию в виде достоверного рассказа.
Этот экран преимущественно на чтение + анализ по запросу. Сами детекторы (kts_tx · srct_tx · eve_ingest) — это коллекторы на Node, работающие под pm2 на целевых хостах; приложение лишь читает заполняемые ими таблицы. Само оно никогда не перехватывает трафик.
Путь повествования через LLM удалён 2026-09-04. Раньше анализ отправлял сводку последовательности в ИИ-адаптер и сохранял его свободный текст. Этому положили конец три измеренные проблемы: вывод LLM («ротация JA3») совпадал с тем, что уже давал расчёт отношения в три строки, при затратах около 9 100 токенов за прогон; свободный текст замораживал язык автора, из-за чего англоязычные сессии читали корейские карточки; а запись проставляла
provider/modelиз адаптера даже на резервном пути, поэтому 10 из 13 сохранённых строк заявлялиmodel=kimi-k2.6, будучи на деле выводом шаблона. Теперь анализ только эвристический — без внешних вызовов и без затрат на токены — аprovider/modelфиксируют то, что действительно выполнялось.
Когда использовать
- Чтобы по картине ротации JA3 понять, является ли IP ботнетом или автоматизированным сканером.
- Чтобы одним взглядом охватить, что именно сейчас ловят движки IDS / ML / nginx (точка входа для разбора).
- Чтобы развернуть коллекторы обнаружения на новом хосте (скопировать команду pm2 / исходный код).
- Чтобы превратить главных нарушителей по JA3 в наборы правил с рекомендацией блокировки или жалобы.
- При переходе из Overview / Threats по прямой ссылке, чтобы сразу проанализировать конкретный IP (предвыбор
?ip=).
Состав экрана
Полоса KPI
| KPI | Значение | Источник |
|---|---|---|
| Аномалии ИИ | Число аномалий Kitsune в выбранном окне | подсчёт по kitsune_detail_log |
| Блокировки ИИ | Из них с is_blocked=1 (порог + вето выполнены) |
kitsune_detail_log where is_blocked |
| Подозрительный веб-трафик | Запросы nginx с is_suspicious=1 в окне |
подсчёт по nginx_meta_ct |
| Наборы правил | Действующие наборы правил (status=active) |
infr_sec_ruleset |
Первые два KPI названы «ИИ», потому что Kitsune действительно является автокодировщиком машинного обучения — эта подпись точна и сохраняется.
Панель алгоритмов обнаружения (обучающие подсказки)
Карточка каждого движка открывает обучающую подсказку с разделами принцип · за чем следит · советы. Текст хранится в статическом языковом пакете security.det.edu.*.
- Kitsune — обнаружение аномалий ансамблем автокодировщиков
- srct — эвристический автоблокировщик Suricata (5 категорий)
- nginx is_suspicious — маркер веб-атаки после терминации TLS
- Анализ последовательностей JA3 — главный элемент этого экрана
Руководство по развёртыванию pm2
Даёт команду и исходный код для развёртывания 5 коллекторов обнаружения в виде pm2-cron на целевом хосте (см. Источники данных · таблица pm2).
Журнал обнаружений и история запусков
- Аномальные IP (топ Kitsune) — первые 50 по
anomaly_score: IP · оценка · число сессий · признак блокировки · run_ts. - Подозрительный веб-трафик (топ nginx) — первые 12 совпадений
is_suspicious: src_ip · попадания · последняя метка времени. - История запусков — 30 последних строк из
kitsune_process_log·srct_process_log(счётчики просканировано/заблокировано · сообщение).
Нарушители JA3 и наборы правил
- Список нарушителей — 12 главных нарушителей по JA3 за фиксированное 6-часовое окно:
ja3_variety·tls_conns·sni_variety· last_ts · страна (geo). Собственная сеть (IP /24 зарегистрированных экземпляров) исключается. - Таблица наборов правил — сохранённые наборы (последние 60): сущность · поведение · категория · серьёзность · рекомендация · уверенность · происхождение. По строке — Активировать / Отложить / Удалить.
Как пользоваться
1) Осмотреть состояние обнаружения
Верхний переключатель диапазона (1h / 6h / 24h) меняет окно наблюдения (по умолчанию 24h). KPI и журналы обнаружений пересчитываются для этого окна. Страница опрашивает сервер примерно раз в 30 с, сервис кеширует на 30 с.
Только список нарушителей всегда охватывает последние 6 часов, независимо от диапазона. Ротация JA3 накапливается за несколько часов, поэтому в коротком окне закономерность не проявится (согласовано с 360-минутным окном JA3 у автоблокировки).
2) Запустить анализ последовательности JA3 (★)
- Выберите IP из списка нарушителей (или придите по прямой ссылке из Overview/Threats) и нажмите [Анализ].
- Сервер извлекает последовательность TLS JA3 этого IP из
suricata_tls_ctв хронологическом порядке (окно = операционная политикаsec_ai_window_min, по умолчанию 60 мин · до 200 строк). - Если длина последовательности меньше минимума (
sec_ai_min_seq, по умолчанию 5), она пропускается сinsufficient_sequence. - Эвристика раскладывает последовательность на находки (см. таблицу правил ниже).
- Результат сохраняется как наборы правил, а список и воронка Overview обновляются немедленно.
Пример ответа:
{
"ok": true,
"provider": "heuristic",
"model": null,
"saved": 1,
"seq_len": 37,
"findings": [
{ "key": "ja3_rotation",
"params": { "conns": 37, "variety": 34 },
"category": "tls_anomaly",
"severity": "crit", "action": "block", "confidence": 91 }
]
}
Анализ детерминирован и бесплатен: одна и та же последовательность всегда даёт одинаковые наборы правил, он никогда не обращается к внешнему сервису и работает без доступа к сети. Запуск ничего не стоит, поэтому смело анализируйте заново, когда показатели нарушителя меняются.
Эвристические правила
Находки строятся из статистики последовательности (rotation = ja3_variety / seq_len).
| Условие | Набор правил | Категория | Серьёзность | Рекомендация | Уверенность |
|---|---|---|---|---|---|
| variety ≥ 3 И rotation ≥ 0,5 | Ротация JA3 (автоматизированный сканер/ботнет) | tls_anomaly | rotation≥0,9 → crit, иначе warn | block | 50 + round(rotation×45), максимум 95 |
| Замечены чувствительные URL (.env·.git·wp-config…) | Зондирование учётных данных/файлов конфигурации | credential_access | crit | block | 88 |
| variety = 1 И conns ≥ 10 И sni_variety ≥ 4 | Многоцелевое сканирование с единым JA3 | scan | warn | observe | 72 |
| Ничего из перечисленного | Базовая активность TLS | other | info | observe | 40 |
Чувствительные URL определяются регулярным выражением .env .git wp-config .aws /actuator phpunit /.. shell.php wp-login xmlrpc (по контексту nginx is_suspicious + suricata_http).
Категории, серьёзность и рекомендации проверяются по enum столбцов перед вставкой (recon · credential_access · exfil · bruteforce · c2 · tls_anomaly · scan · other / info · warn · crit / observe · block · isolate · report).
Формулировки наборов правил и языки
Находка сохраняется как идентификатор, а не как фраза. heuristicFindings() выдаёт {key, params}; строка хранит rule_key + params (миграция 000783), а формулировка применяется при чтении строки — на языке читателя.
- Текст живёт в
resources/lang/<locale>/security.phpпо путиdet.rule.<key>.{name,behavior}и переведён на все 8 языков консоли. - Столбцы
name/behaviorпо-прежнему хранят английский вариант как запасной, чтобы выгрузки, аудит и строки, записанные до 000783, оставались читаемыми. Еслиrule_keyотсутствует или в языке нет ключа, используется сохранённый текст — сырой ключ никогда не показывается. - Кеш Detections разделён по языкам (
infr:sec:det:<locale>:<range>). Без этого корейская сессия, прогревшая 30-секундный кеш, передала бы свою формулировку следующему англоязычному читателю — именно так и происходило.
Строки, созданные до 000783, сохраняют исходный текст. Миграция восстанавливает
rule_keyтолько там, где собственные данные строки воспроизводят прежний шаблон точно (никаких догадок); строки со свободным текстом, написанные старым путём через LLM, остаются замороженными, пока этот IP не будет проанализирован повторно и они не будут заменены.
3) Управление наборами правил
| Действие | Эффект |
|---|---|
| Активировать | status=active (отражается в воронке Overview / рассказе о блокировках) |
| Отложить | status=dismissed |
| Удалить | Убирает строку |
Повторный анализ заменяет только машинно выведенные наборы правил для этого IP (удаляет entity_type=ip, entity_key=ip, source=ai и создаёт заново) — написанные вручную наборы сохраняются.
Поле
actionв наборе правил — это рекомендация, а не команда. По нему ничего не срабатывает: автоблокировка вычисляет ротацию JA3 напрямую изsuricata_tls_ctи никогда не читаетinfr_sec_ruleset. Набор правил сaction=blockничего не блокирует — блокировка выполняется из Blocklist или планировщиком автоблокировки.
4) Накопление по расписанию (по желанию)
Команда infr:sec-analyze обходит главных нарушителей по JA3 и накапливает наборы правил. Это однократная команда, завершающаяся после выполнения, поэтому её безопасно ставить в расписание (это не демон).
# Обойти переключатель и выполнить один раз (отладка)
php artisan infr:sec-analyze --force
# Проанализировать один IP (переключатель не учитывается)
php artisan infr:sec-analyze --ip=203.0.113.10
- Переключатель: операционная политика
sec_ai_schedule_on(по умолчанию0= выключено). В выключенном состоянии команда ничего не делает — включите её на вкладке безопасности в Операционной политике. - Запуск по расписанию анализирует первых
sec_ai_top_n(по умолчанию 10) нарушителей. - Расписание срабатывает каждые 30 минут и, поскольку анализ эвристический, не расходует токены и не делает внешних вызовов. По умолчанию оно выключено лишь потому, что наборы правил носят информационный характер.
5) Скопировать команды развёртывания pm2
Карточка pm2 предлагает [Скопировать команду] (строка запуска pm2), [Скопировать исходный код] (тело сниппета) и [Подставить значения экземпляра и скопировать] (замена токенов HOSTNAME/IP). Исходный код берётся из засеянного сниппета в Inventory ▸ Tools (infr_snippet).
Источники данных
Читаемые устаревшие таблицы (не изменять)
| Таблица | Назначение | Питающий коллектор |
|---|---|---|
kitsune_detail_log |
аномальный IP · anomaly_score · is_blocked | kts_tx |
kitsune_process_log |
история запусков Kitsune | kts_tx |
srct_process_log |
история запусков srct | srct_tx |
nginx_meta_ct |
подозрительные веб-запросы (is_suspicious) |
nginx_shipper/aggregator |
suricata_tls_ct |
последовательность JA3 (ja3_hash · sni · version) | eve_ingest |
suricata_http_ct |
HTTP-контекст для анализа | eve_ingest |
blacklist_info |
результаты автоблокировки (справочно) | kts_tx · srct_tx |
ip_info_loop |
обогащение geo/ASN | — |
Новые таблицы, принадлежащие приложению
infr_sec_ruleset(миграции 000730 · 000783) — наборы правил. Столбцы:entity_type·entity_key·name·behavior·rule_key·params(json) ·category·severity·action·confidence·ja3·sequence(json) ·evidence(json) ·source(ai=выведено машиной | manual) ·provider·model·status(draft|active|dismissed). ЗаполняетсяSecurityAiService::persist().infr_snippet— тела исходного кода для pm2.infr_audit_log— аудитsec.ai_analyze·sec.ruleset_save·sec.ruleset_delete. Первая строка действия оставлена без изменений, чтобы не разрывать надвое существующий след аудита.
Коллекторы, разворачиваемые через pm2
| key | Питает | Команда развёртывания (cron-restart) |
|---|---|---|
| eve_ingest | suricata_*_ct |
pm2 start infr_eve_ingest.cjs --name infr-eve --cron-restart="0 0 * * 6" |
| kts_tx | kitsune_*_log · blacklist_info |
pm2 start infr_kts_tx.cjs --name infr-kitsune --cron-restart="0 0 * * 2" |
| srct_tx | srct_process_log · blacklist_info |
pm2 start infr_srct_tx.cjs --name infr-srct --cron-restart="0 0 * * 4" |
| sync_black | ipset · iptables |
pm2 start infr_sync_black.mjs --name infr-syncblack --cron-restart="*/5 * * * *" |
| sync_firewall | firewall_status |
pm2 start infr_sync_firewall.cjs --name infr-firewall --cron-restart="0 0 * * 0" |
Сервисы и маршруты
- DetectionService — строит KPI, журналы обнаружений, нарушителей и наборы правил (кеш 30 с на язык, только чтение через
SecurityRepository);phrase()подставляет формулировку при чтении. - SecurityAiService — последовательность JA3 → эвристические находки → upsert набора правил. Не содержит вызовов LLM.
- SecurityScope::excludePrefixes() — исключение собственной сети (IP /24 зарегистрированных экземпляров + операционная политика; без жёстко прописанных значений).
| Метод | Маршрут |
|---|---|
| GET | /security/detections (index) |
| GET | /security/detections/live (опрос) |
| POST | /security/detections/analyze (анализ) |
| POST | /security/detections/ruleset/save |
| POST | /security/detections/ruleset/delete |
Доступ
| Операция | Условие |
|---|---|
| Просмотр экрана | Доступ к ролевой области Security (min_req 2) — demo (1) вообще не видит область безопасности; staff (5) · admin (10) могут просматривать |
| Анализ / сохранение·удаление набора правил | user_level ≥ 2 (canWrite) + аудит в infr_audit_log |
- Ограничение на запись применяется в
canWrite()контроллера (сессияinfr_user_level ≥ 2) — уровень demo не может ни анализировать, ни редактировать наборы правил. - Введённый IP проверяется через
filter_var(FILTER_VALIDATE_IP)(недопустимый IP → 422). - Каждая разрушающая операция записывается в журнал аудита → Аудит.
Устранение неполадок и FAQ
Анализ пропущен с
insufficient_sequence— последовательность этого IP вsuricata_tls_ctкорочеsec_ai_min_seq(по умолчанию 5). Расширьте окно (sec_ai_window_min, по умолчанию 60 мин) или выберите более активный IP из 6-часового окна списка нарушителей.
- Старый набор правил показан не на том языке — он записан до 000783 и несёт замороженный текст. Проанализируйте этот IP заново: новая строка сохранит
rule_keyи будет следовать языку читателя. Строки по IP, которые больше не появляются, можно удалить из таблицы. - KPI и наборы правил не меняются — это следствие 30-секундного кеша и частоты опроса. Анализ и сохранение немедленно сбрасывают кеш (
flush, по всем языковым вариантам), поэтому обновление страницы их покажет. - Список нарушителей пуст — за последние 6 часов в
suricata_tls_ctнет активности JA3, либо всё исключено как собственная сеть. Проверьте, работает ли коллекторeve_ingest. - Расписание ничего не делает —
sec_ai_schedule_on=0(по умолчанию). Включите его на вкладке безопасности в Операционной политике или выполните один раз с--force. - Все журналы обнаружений нулевые — соответствующий процесс pm2 мог завершиться. Перезапустите его командой развёртывания с карточки pm2 и проверьте историю запусков.
Связанное
- Обзор безопасности — воронка защиты
- Угрозы — разбор угроз IDS
- Наборы правил — каталог правил обнаружения
- Автоблокировка
- Список блокировок и репутация
- Операционная политика
