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

Передача событий в SIEM

Control Plane может отправлять rule-, system- и audit-события во внешний приёмник. Поддерживаются syslog по TCP, UDP и TLS, HTTP(S) и Kafka. Доступные форматы — RFC 5424, CEF, LEEF и ECS JSON.

Передача выключена, пока не задана переменная QF_FORWARDER_DSN.

Какие данные передаются

ПотокВнешний приёмникPostgreSQLREST API
Rule-события (allow, deny, log)дазависит от режимаGET /hosts/{id}/events
System-события агентадавсегдаGET /hosts/{id}/system-events
Audit-события операторовдавсегдаGET /audit-log — только admin
Flow-событиянетдаGET /hosts/{id}/flows
Счётчики правилнетдаGET /hosts/{id}/counters

QF_FORWARDER_MODE управляет только хранением rule-событий:

  • tee — значение по умолчанию. Rule-события сохраняются в PostgreSQL и отправляются во внешний приёмник.
  • exclusive — rule-события отправляются только во внешний приёмник. История GET /hosts/{id}/events и агрегаты Verdicts остаются пустыми, но поток live-событий через GET /hosts/{id}/events/stream продолжает работать.

System- и audit-события сохраняются в PostgreSQL в обоих режимах.

Настройка Control Plane

Примеры QF_FORWARDER_DSN:

# Syslog по TCP, RFC 5424 и facility local0
QF_FORWARDER_DSN=syslog://collector.example.com:514

# Syslog по UDP
QF_FORWARDER_DSN=syslog+udp://collector.example.com:514

# Syslog по TLS
QF_FORWARDER_DSN=syslog+tls://collector.example.com:6514

# HTTP POST. Формат по умолчанию — ECS JSON
QF_FORWARDER_DSN=https://ingest.example.com/qf

# Kafka: одно сообщение на событие
QF_FORWARDER_DSN=kafka://broker1:9092,broker2:9092/qf-events

# Явный формат и syslog facility
QF_FORWARDER_DSN=syslog://collector.example.com:514?format=cef&facility=local5

QF_FORWARDER_MODE=tee
QF_FORWARDER_SPOOL=/var/lib/qf/forward.spool
ПараметрЗначенияЗначение по умолчанию
Схема DSNsyslog://, syslog+udp://, syslog+tls://, http://, https://, kafka://
formatrfc5424, cef, leef, ecsrfc5424 для syslog; ecs для HTTP и Kafka
facilitykernlocal7; только для RFC 5424local0
insecure=trueотключает проверку сертификата для syslog+tls и httpsfalse
QF_FORWARDER_MODEtee, exclusivetee
QF_FORWARDER_SPOOLпуть к дисковому буферубуфер выключен

insecure=true подходит только для временной диагностики в изолированном контуре: он отключает проверку подлинности приёмника.

Формат обычно выбирается по приёмнику: CEF для ArcSight, LEEF для QRadar, ECS JSON для Elastic и RFC 5424 для универсального syslog-конвейера.

Доставка и потери

Передача не блокирует приём телеметрии от агентов. Control Plane складывает события в очередь на 10 000 записей и отправляет пачки до 500 записей не реже раза в секунду.

  • Для syslog по TCP и TLS соединение проверяется при старте. Ошибка подключения останавливает запуск Control Plane.
  • При ошибке записи по TCP или TLS выполняются переподключение и одна повторная попытка.
  • HTTP создаёт запрос на пачку. Kafka передаёт каждое событие отдельным сообщением.
  • При ошибке приёмника пачка попадает в дисковый буфер, если задан QF_FORWARDER_SPOOL. Размер буфера ограничен 100 МиБ; после восстановления приёмника записи отправляются повторно.
  • Без дискового буфера ошибка приёмника приводит к потере пачки. Переполнение памяти или дискового буфера также приводит к потере новых событий и увеличивает qf_ingester_events_dropped_total{type="forward"}.

Доставка не транзакционная: при сбое на границе повторной отправки возможны дубликаты. Дедупликация при необходимости выполняется в SIEM.

Поля событий

Rule-событие содержит:

  • время, tenant, хост и интерфейс;
  • действие, направление и состояние conntrack;
  • исходный и конечный IP-адреса и порты;
  • числовой протокол qf и его имя;
  • идентификатор и, после обогащения, имя правила и политики.

Числовое поле proto использует перечисление qf, а не номера протоколов IANA: 1=any, 2=tcp, 3=udp, 4=icmp, 5=icmpv6.

Control Plane обновляет кэш имён хостов, правил и политик каждые 30 секунд. Поэтому у только что созданного объекта имя может временно отсутствовать, а его идентификатор остаётся доступен для точного сопоставления.

RFC 5424

В RFC 5424 заголовок содержит имя хоста, если оно известно. Для rule-события PROCID содержит идентификатор правила, MSGID — действие. Поля события находятся в structured data с идентификатором qf@32473:

<134>1 2026-07-01T10:15:30Z web-01 qf 8f04... allow [qf@32473 kind="rule" direction="ingress" src="203.0.113.7" src_port="51000" dst="10.0.0.5" dst_port="22" proto="2" proto_name="tcp" hostname="web-01" rule_id="8f04..." rule_name="allow-ssh" policy_name="web-ingress" tenant_id="7b42..." ct_state="new"] allow src=203.0.113.7:51000 dst=10.0.0.5:22 proto=2

Для deny используется severity 3 (error), для остальных rule-событий — 6 (info). Severity system-событий берётся из самого события.

CEF, LEEF и ECS JSON

  • CEF передаёт адреса и порты в стандартных полях, а имена правила, политики и интерфейса — в дополнительных строковых полях.
  • LEEF передаёт те же данные как tab-separated атрибуты.
  • ECS JSON использует поля ECS, включая host.name, rule.name, rule.ruleset.name и network.transport.

Пример для Logstash

Минимальный конвейер для RFC 5424:

input {
syslog {
port => 5514
codec => "line"
}
}

filter {
grok {
match => { "message" => "\[qf@32473 %{DATA:qf_sd}\]" }
}
kv {
source => "qf_sd"
field_split => " "
value_split => "="
trim_value => "\""
}
mutate {
convert => {
"dst_port" => "integer"
"src_port" => "integer"
"proto" => "integer"
}
}
}

output {
elasticsearch {
hosts => ["es:9200"]
index => "qf-events-%{+YYYY.MM.dd}"
}
}

Для этого конвейера используется QF_FORWARDER_DSN=syslog://logstash.example.com:5514.

Проверка

Тестовый TCP-приёмник:

nc -lk 5514

На Control Plane задаётся QF_FORWARDER_DSN=syslog://collector.example.com:5514, затем процесс перезапускается. Для проверки подходит политика с log: true на тестовом трафике. В приёмнике должны появиться строки RFC 5424.

Если строк нет, проверяются:

  • наличие log: true у правила;
  • статус агента и подтверждённое поколение конфигурации;
  • сетевой доступ от Control Plane к приёмнику;
  • журнал запуска Control Plane и ошибки forwarder: initial connect;
  • метрика потерь qf_ingester_events_dropped_total{type="forward"}.

Ограничения

  • Настраивается один глобальный DSN. Разделение по tenant выполняется в SIEM по полю tenant_id.
  • Flow-события и счётчики правил не передаются во внешний приёмник.
  • Дисковый буфер ограничен 100 МиБ и не заменяет постоянное хранилище событий.