Передача событий в SIEM
Control Plane может отправлять rule-, system- и audit-события во внешний приёмник. Поддерживаются syslog по TCP, UDP и TLS, HTTP(S) и Kafka. Доступные форматы — RFC 5424, CEF, LEEF и ECS JSON.
Передача выключена, пока не задана переменная QF_FORWARDER_DSN.
Какие данные передаются
| Поток | Внешний приёмник | PostgreSQL | REST 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
| Параметр | Значения | Значение по умолчанию |
|---|---|---|
| Схема DSN | syslog://, syslog+udp://, syslog+tls://, http://, https://, kafka:// | — |
format | rfc5424, cef, leef, ecs | rfc5424 для syslog; ecs для HTTP и Kafka |
facility | kern…local7; только для RFC 5424 | local0 |
insecure=true | отключает проверку сертификата для syslog+tls и https | false |
QF_FORWARDER_MODE | tee, exclusive | tee |
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 МиБ и не заменяет постоянное хранилище событий.