Перейти к основному содержимому

Аналитика событий фаервола

qf-analytics строит отчёты по событиям фаервола и экспортирует агрегированные данные. Сервис разворачивается отдельно от Control Plane и только читает данные из PostgreSQL или OpenSearch.

Инструкция по развёртыванию — в разделе установки, переменные окружения — в справочнике конфигурации.

Источник данных

Источник выбирается по объёму данных. Сервис выполняет только SQL-запросы SELECT или запросы OpenSearch _search.

МасштабANALYTICS_SOURCEИсточник
МалыйpostgresCP-primary, RO-роль
СреднийpostgresRO-реплика (тот же адаптер, другой DSN)
КрупныйopensearchКопия событий в SIEM

От источника зависят скорость широких временных окон и способ поиска аномалий. Фильтры по имени правила и политики для OpenSearch требуют ANALYTICS_ENRICH_DSN; без него отчёт показывает идентификаторы правил и не строит срез по политикам.

Доступ и SSO

Сервис использует роли Control Plane. Операторский access-токен RS256 проверяется по JWKS без обращения к Control Plane на каждый запрос. ANALYTICS_ROLES задаёт список ролей с доступом; остальным сервис отвечает 403. Для отчётов можно разрешить роль auditor.

При публикации под тем же родительским доменом, что и Control Plane, cookie qf_token передаётся сервису и повторный вход не нужен.

Сервис рассчитан на одну организацию. Access-токен содержит tenant_id, но запросы к источнику данных не ограничивают строки по этому значению. Поэтому один экземпляр qf-analytics нельзя подключать к хранилищу нескольких организаций.

Эндпоинты

ПутьДоступНазначение
GET /healthzоткрытLiveness/readiness.
GET /versionоткрытВерсия.
GET /app/открытИнтерфейс отчётов; сами данные защищены API-аутентификацией.
GET /api/reportроль из allowlistJSON-отчёт.
GET /api/report/exportроль из allowlistСкачивание отчёта файлом.

Параметры /api/report и /api/report/export:

ПараметрЗначенияНазначение
sinceduration (24h, 48h, 336h, 720h, …)Окно отчёта от «сейчас» назад.
from / toRFC3339Явное окно (альтернатива since).
host / rule / policyимяФильтр по имени; применяется ко всем агрегациям окна. Для OpenSearch фильтры rule и policy требуют ANALYTICS_ENRICH_DSN.
redactmask (по умолчанию) | hash | noneРежим обезличивания IP-осей.
format (только export)json | md | csvФормат файла-артефакта.

Состав отчёта и фильтры

Отчёт содержит общий итог за период, первые N значений по каждому измерению и найденные аномалии.

Измерения отчёта: хост, действие, направление, протокол, состояние conntrack, исходный и конечный IP-адреса и порты, правило, политика и время. Срез по правилам охватывает только события, совпавшие с правилом. Политика определяется по правилу. Протокол показывается именем (tcp, udp и другие), пустое значение — как (none).

В UI:

  • Панели сворачиваются и по умолчанию закрыты.
  • Готовые периоды: сутки, двое суток, две недели и месяц. API также принимает произвольные from и to.
  • Фильтры по хосту, правилу и политике применяются по Enter или кнопке Generate report. Новый запрос отменяет предыдущий.

Для фильтров по хосту и правилу в PostgreSQL есть индексы на партициях log_events. Отчёт без фильтра группирует все события периода и на большом объёме может выполняться долго.

Обезличивание IP-адресов

Параметр redact задаёт обработку исходных и конечных IP-адресов:

  • mask (по умолчанию) — IPv4 сворачивается до /24, IPv6 до /64.
  • hash — адрес заменяется стабильным сокращённым SHA-256.
  • none — сырой адрес (для доверенного контура).

Хосты, порты и остальные измерения не меняются. Обезличивание выполняется при построении отчёта, поэтому необработанный IP-адрес не попадает ни в API-ответ, ни в экспорт при режимах mask и hash.

Экспорт

Экспорт содержит агрегированный отчёт, а не исходные события. Доступны JSON, Markdown и CSV. Сервис не отправляет файл во внешние системы: он возвращает его оператору. Пустые срезы в JSON сериализуются как [], а не null. CSV защищает текстовые значения от интерпретации как формул электронных таблиц; JSON и Markdown сохраняют исходный текст.

Детекция аномалий

Способ поиска аномалий зависит от источника:

  • postgres — встроенная эвристика ищет всплески deny относительно медианы и рост conntrack=invalid. Пороги задают переменные ANALYTICS_ANOMALY_*.
  • opensearch — серверные агрегации OpenSearch вычисляют отклонение доли deny и количество invalid по временным интервалам. ML-плагин не требуется.

Эта проверка выполняется при построении отчёта и не заменяет постоянный мониторинг. Для непрерывных уведомлений используется мониторинг на стороне SIEM; пример — в разделе установки.

Производительность и выбор источника

Отчёт без фильтра группирует все события периода. На большой таблице log_events это может привести к полному чтению партиций и тайм-ауту.

  • Для частых запросов используются фильтры host и rule.
  • ANALYTICS_PG_MAX_WINDOW_HOURS ограничивает период для PostgreSQL. Превышение возвращает 422.
  • Для больших объёмов и широких периодов используется OpenSearch.

Границы отчёта

  • Видны только логируемые события: правила silent/log=false в отчёт не попадают.
  • Оси rule/policy покрывают только rule-matched трафик; default-action (без правила) не атрибутируется.