Экспорт событий (SIEM)¶
В этом разделе описано, как настроить отправку событий безопасности из AppSec.AIGate во внешние системы: SIEM, SOAR, мессенджеры, аналитические платформы. Концептуальное описание — см. Основные понятия.
Что такое экспортер?¶
Экспортер — конфигурация отправки событий безопасности во внешнюю систему. Event Exporter Service потребляет события из внутренней очереди (Redis Streams) и доставляет их в настроенные destination'ы.
Зачем нужен экспорт: события безопасности хранятся внутри AppSec.AIGate и доступны через Dashboard. Однако в большинстве организаций уже есть централизованная система мониторинга, и экспорт позволяет:
- Коррелировать события AppSec.AIGate с другими источниками (WAF, IDS, Endpoint) в едином SOC.
- Использовать существующие дашборды и playbooks SOAR для автоматической реакции.
- Хранить события в SIEM с собственными retention-политиками (независимо от AIGate).
- Отправлять оповещения в мессенджеры (Slack, Telegram) через webhook.
Сколько экспортеров можно создать: без ограничений. Типичная конфигурация — 2–3 экспортера для разных целей: Syslog в SOC (только критичные), Kafka в аналитику (все события), Webhook в Slack (только блокировки).
Типы экспорта¶
Syslog (RFC 5424 / 3164)¶
Отправка событий на syslog-сервер через UDP, TCP или TCP+TLS. Наиболее распространённый способ интеграции с корпоративными SIEM (QRadar, ArcSight, KUMA, Splunk).
| Параметр | Обяз. | По умолчанию | Описание | Подробности |
|---|---|---|---|---|
address |
Да | — | Адрес сервера | Формат host:port. Пример: syslog.company.com:514. Для TLS обычно порт 6514. |
transport |
Да | tcp |
Протокол транспорта | udp — быстро, но ненадёжно (события могут теряться). tcp — надёжная доставка, рекомендуется для production. tcp+tls — шифрованный канал, требуется для передачи по недоверенным сетям. |
format |
Нет | rfc5424 |
Формат syslog-сообщения | rfc5424 — современный стандарт с структурированными данными, рекомендуется. rfc3164 — устаревший формат для старых syslog-серверов (rsyslog < 8, syslog-ng < 3). |
facility |
Нет | 16 (LOCAL0) |
Syslog facility | Число 0–23. LOCAL0–LOCAL7 (16–23) — для пользовательских приложений. Определяет, в какую категорию попадут события на syslog-сервере. |
app_name |
Нет | LLMFirewall |
Имя приложения в syslog | Произвольная строка. Используется для фильтрации на стороне syslog-сервера. |
tls_insecure |
Нет | false |
Отключить проверку TLS-сертификата | Только для tcp+tls. Установите true для self-signed сертификатов. Не рекомендуется для production. |
CEF (ArcSight, MaxPatrol, QRadar)¶
Common Event Format (CEF) — стандартизированный формат Micro Focus для SIEM-интеграции. Используется ArcSight, MaxPatrol SIEM, QRadar, LogRhythm. AIGate автоматически маппит поля события в CEF-атрибуты и формирует CEF-строку.
| Параметр | Обяз. | По умолчанию | Описание | Подробности |
|---|---|---|---|---|
protocol |
Да | tcp |
Протокол транспорта | udp или tcp. CEF обычно передаётся поверх syslog. |
host |
Да | — | Адрес SIEM-сервера | Hostname или IP. Пример: maxpatrol.company.com. |
port |
Да | — | Порт SIEM-сервера | Типичные: 514 (plain), 1514 (CEF over syslog). |
device_vendor |
Нет | AppSec |
Вендор в CEF-заголовке | Идентифицирует производителя в SIEM. |
device_product |
Нет | AIGate |
Продукт в CEF-заголовке | Идентифицирует продукт в SIEM. |
device_version |
Нет | текущая версия | Версия продукта | Используется для корреляции правил в SIEM. |
Webhook (HTTP POST)¶
Отправка событий через HTTP POST в формате JSON. Самый универсальный тип — позволяет отправлять события в любую систему с HTTP API: свой backend, Slack (Incoming Webhook), PagerDuty, Opsgenie, Telegram (через bot API), SOAR-платформы.
| Параметр | Обяз. | По умолчанию | Описание | Подробности |
|---|---|---|---|---|
url |
Да | — | URL назначения | Полный URL. Пример: https://hooks.company.com/security. Должен быть доступен из сети AIGate. |
method |
Нет | POST |
HTTP-метод | Обычно POST. Некоторые системы требуют PUT. |
headers |
Нет | {} |
Кастомные HTTP-заголовки | JSON-объект. Используйте для авторизации: {"Authorization": "Bearer token123"}. Значения хранятся в зашифрованном виде. |
batch_mode |
Нет | false |
Режим отправки | false — каждое событие отправляется отдельным HTTP POST (проще для обработки на стороне получателя). true — события накапливаются и отправляются массивом (экономит HTTP-вызовы при high-traffic). |
timeout_sec |
Нет | 10 |
Таймаут HTTP-запроса (сек) | 1–60. Если получатель не ответил за это время — попытка считается неуспешной. |
max_retries |
Нет | 3 |
Макс. повторов при ошибке | 0–10. При ошибке (5xx, timeout) экспортер повторит отправку с exponential backoff (1s, 2s, 4s...). |
Kafka (SASL + TLS)¶
Публикация событий в Apache Kafka. Оптимально для высоконагруженных инсталляций и потоковой аналитики — Kafka обеспечивает гарантированную доставку и горизонтальное масштабирование.
| Параметр | Обяз. | По умолчанию | Описание | Подробности |
|---|---|---|---|---|
brokers |
Да | — | Массив адресов брокеров | Формат: ["host1:9092", "host2:9092"]. Укажите несколько брокеров для отказоустойчивости. |
topic |
Да | — | Имя Kafka-топика | Пример: llm-security-events. Топик должен существовать или быть создан автоматически (зависит от настроек Kafka). |
compression |
Нет | snappy |
Алгоритм сжатия | snappy — баланс скорости и размера (рекомендуется). gzip — лучшее сжатие, медленнее. lz4 — максимальная скорость. zstd — лучшее сжатие с хорошей скоростью. none — без сжатия. |
batch_size |
Нет | 100 |
Макс. сообщений в пакете | 1–10000. Сообщения накапливаются в буфере и отправляются пакетом. Большие пакеты = выше throughput, выше задержка. |
flush_interval |
Нет | 1s |
Интервал принудительной отправки | Даже если batch не заполнен — отправить через этот интервал. Формат: 500ms, 1s, 5s. |
sasl_mechanism |
Нет | — | Механизм аутентификации SASL | PLAIN, SCRAM-SHA-256, SCRAM-SHA-512. Если не указан — подключение без аутентификации. |
sasl_username |
Нет | — | Имя пользователя SASL | Обязательно при указанном sasl_mechanism. |
sasl_password |
Нет | — | Пароль SASL | Хранится в зашифрованном виде. |
tls_enabled |
Нет | false |
Включить TLS-шифрование | Рекомендуется для передачи по недоверенным сетям. |
tls_ca_file |
Нет | — | Путь к CA-сертификату | Для проверки серверного сертификата. Если не указан — используется системное хранилище CA. |
File (JSON Lines)¶
Запись событий в локальный файл в формате JSON Lines (одно JSON-событие на строку). Подходит для отладки, разработки, air-gapped сред без внешних систем, а также как backup-экспортер на случай недоступности основного SIEM.
| Параметр | Обяз. | По умолчанию | Описание | Подробности |
|---|---|---|---|---|
path |
Да | — | Путь к файлу | Полный путь на файловой системе контейнера. Пример: /data/logs/llm-events.jsonl. Директория должна существовать и быть доступна для записи. |
rotate |
Нет | true |
Включить ротацию файлов | При true — когда файл достигает max_size_mb, он переименовывается (с timestamp в суффиксе) и создаётся новый. При false — файл растёт бесконечно (следите за диском). |
max_size_mb |
Нет | 100 |
Макс. размер файла для ротации (MB) | 1–10000. При достижении этого размера файл ротируется. Для high-traffic: 500–1000 MB. Для отладки: 10–50 MB. |
Создание экспортера¶
Перейдите на страницу Exporters (/exporters) и нажмите Create Exporter.
Шаг 1: Основная информация
| Поле | Обяз. | Описание |
|---|---|---|
| Название | Да | Осмысленное имя: prod-syslog-soc, analytics-kafka, slack-alerts. |
| Описание | Нет | Комментарий: назначение, ответственный, целевая система. |
| Тип | Да | Выберите один из 5 типов: syslog, cef, webhook, kafka, file. Нельзя изменить после создания. |
Шаг 2: Конфигурация — набор полей зависит от выбранного типа (см. Типы экспорта). Заполните обязательные параметры подключения.
Шаг 3: Фильтры (опционально) — определите, какие события попадут в экспортер. Если не указать фильтры — экспортируются все события. Подробнее — см. Фильтрация.
Шаг 4: Маппинг (опционально) — выберите формат маппинга полей: generic (без преобразования), ecs (Elastic), custom. Подробнее — см. Маппинг форматов.
Шаг 5: Создание и тест — нажмите Create. Экспортер создаётся в состоянии enabled: true и начинает работать немедленно. Обязательно выполните тест (кнопка Test или API — см. Тестирование) для проверки связности.
Рекомендация
Создавайте экспортер с узкими фильтрами (например, только CRITICAL) и постепенно расширяйте, чтобы не перегрузить целевую систему на старте.
Полные примеры конфигурации¶
Syslog — отправка в rsyslog/syslog-ng¶
{
"name": "Production Syslog",
"type": "syslog",
"enabled": true,
"config": {
"address": "syslog.company.com:514",
"transport": "tcp",
"format": "rfc5424",
"facility": 16,
"app_name": "LLMFirewall"
},
"filters": {
"severities": ["CRITICAL", "HIGH"],
"event_types": ["REQUEST_BLOCKED", "THREAT_DETECTED", "FAIL_SAFE_TRIGGERED"]
}
}
facility: 16= LOCAL0 (стандарт для пользовательских приложений, диапазон 16-23).transport: "tcp"— надёжнее UDP (гарантированная доставка); для шифрования:"tcp+tls".format: "rfc5424"— современный стандарт, рекомендуется;"rfc3164"— для старых систем.
CEF — отправка в MaxPatrol SIEM / ArcSight¶
{
"name": "MaxPatrol SIEM",
"type": "cef",
"enabled": true,
"config": {
"protocol": "tcp",
"host": "maxpatrol.company.com",
"port": 1514,
"device_vendor": "AppSec",
"device_product": "AIGate",
"device_version": "2.8"
},
"filters": {
"severities": ["CRITICAL", "HIGH", "MEDIUM"]
}
}
CEF-формат автоматически маппит severity в CEF severity (0-10) и формирует CEF-строку.
Webhook — отправка в Slack / Telegram / свой backend¶
{
"name": "Security Alerts Webhook",
"type": "webhook",
"enabled": true,
"config": {
"url": "https://hooks.company.com/security-events",
"headers": {
"Authorization": "Bearer your-webhook-token",
"X-Source": "llm-firewall"
},
"batch_mode": false,
"timeout_sec": 10,
"max_retries": 3
},
"filters": {
"severities": ["CRITICAL", "HIGH"],
"event_types": ["REQUEST_BLOCKED", "THREAT_DETECTED", "CUSTOM_POLICY_BLOCK"]
}
}
batch_mode: false— каждое событие отправляется отдельным HTTP POST.batch_mode: true— события накапливаются и отправляются массивом (экономит HTTP-вызовы).headers— сюда можно добавить любые заголовки для аутентификации.
Kafka — потоковая доставка в аналитическую платформу¶
{
"name": "Analytics Kafka",
"type": "kafka",
"enabled": true,
"config": {
"brokers": ["kafka-1.company.com:9092", "kafka-2.company.com:9092"],
"topic": "llm-security-events",
"compression": "snappy",
"sasl_mechanism": "SCRAM-SHA-256",
"sasl_username": "llm-firewall",
"sasl_password": "your-kafka-password",
"tls_enabled": true
}
}
compression: "snappy"— баланс скорости и сжатия; для максимального сжатия:"zstd".- Без фильтров — все события попадают в Kafka для аналитической обработки.
File — локальный файл (для разработки / offline)¶
{
"name": "Local File Log",
"type": "file",
"enabled": true,
"config": {
"path": "/data/logs/llm-events.jsonl",
"rotate": true,
"max_size_mb": 100
}
}
- Формат: JSON Lines (одно JSON-событие на строку).
- При достижении
max_size_mbфайл ротируется (переименовывается, создаётся новый). - Полезно для разработки, отладки и offline-развёртываний без SIEM.
Фильтрация¶
Каждый экспортер может иметь независимые фильтры. Фильтры определяют, какие события попадут в этот экспортер.
| Фильтр | Описание | Логика |
|---|---|---|
severities |
Уровни критичности | OR (CRITICAL или HIGH) |
event_types |
Типы событий | OR (REQUEST_BLOCKED или THREAT_DETECTED) |
tenant_ids |
ID тенантов | OR (production или staging) |
Между фильтрами — AND-логика: событие должно соответствовать всем указанным фильтрам.
Примеры:
| Фильтры | Какие события попадут |
|---|---|
severities: ["CRITICAL", "HIGH"] |
Все CRITICAL и HIGH, любой тип, любой тенант |
event_types: ["THREAT_DETECTED"] |
Только THREAT_DETECTED, любой severity, любой тенант |
severities: ["CRITICAL"], event_types: ["THREAT_DETECTED"] |
Только THREAT_DETECTED с severity CRITICAL (AND) |
severities: ["CRITICAL", "HIGH"], tenant_ids: ["production"] |
CRITICAL или HIGH и тенант production |
| (без фильтров) | Все события — ничего не фильтруется |
Типичные конфигурации фильтров:
| Сценарий | Фильтры |
|---|---|
| Только критичные инциденты для SOC | severities: ["CRITICAL", "HIGH"] |
| Все блокировки для анализа | event_types: ["REQUEST_BLOCKED", "RESPONSE_BLOCKED", "CUSTOM_POLICY_BLOCK"] |
| Monitoring-only события | event_types: ["MONITOR_ALERT", "RESPONSE_MONITOR_ALERT"] |
| Все события production-тенанта | tenant_ids: ["production"] |
| PII-события для DPO | event_types: ["PII_DETECTED", "RESPONSE_REDACTED"] |
Маппинг форматов¶
Маппинг определяет, как поля события переименовываются перед отправкой.
| Профиль | Описание | Когда использовать |
|---|---|---|
generic |
Без преобразования — поля как есть | Свой backend, File, когда маппинг не нужен |
ecs |
Elastic Common Schema | Elasticsearch / Kibana / Elastic SIEM |
custom |
Пользовательский маппинг полей | Любой SIEM с нестандартной схемой |
Маппинг ECS (Elastic Common Schema):
| Поле события | Поле ECS | Описание |
|---|---|---|
trace_id |
trace.id |
ID трассировки |
event_type |
event.type |
Тип события |
severity |
event.severity_name |
Уровень критичности |
timestamp |
@timestamp |
Время события |
source_ip |
source.ip |
IP клиента |
profile_id |
labels.profile_id |
ID профиля |
Рекомендация
Если вы используете Elasticsearch/Kibana — выбирайте ecs. Это позволит использовать стандартные Kibana-дашборды для анализа событий без дополнительной настройки.
Тестирование¶
После создания экспортера обязательно отправьте тестовое событие для проверки подключения:
Ожидаемые результаты:
| Результат | Что означает | Что делать |
|---|---|---|
HTTP 200 {"status": "ok"} |
Событие успешно доставлено | Всё работает |
| HTTP 500 + connection refused | Destination недоступен | Проверьте адрес/порт, firewall |
| HTTP 500 + authentication error | Неверные credentials | Проверьте username/password/token |
| HTTP 500 + timeout | Destination не отвечает в таймаут | Увеличьте timeout_sec или проверьте сеть |
Управление экспортерами¶
Включение / отключение: переключатель enabled на странице Exporters или через PUT API. Отключённый экспортер перестаёт отправлять события, но конфигурация сохраняется. Полезно для временной паузы (например, при обслуживании SIEM).
Редактирование: все параметры конфигурации можно изменить, кроме типа экспортера. Изменения подхватываются Event Exporter Service автоматически в течение 30 секунд.
Удаление: кнопка Delete (доступна только роли admin). Удаление необратимо — конфигурация не сохраняется.
Несколько экспортеров одновременно: можно создать неограниченное количество экспортеров. Каждый работает независимо со своими фильтрами и destination. Типичная конфигурация:
| Экспортер | Тип | Фильтры | Назначение |
|---|---|---|---|
prod-syslog-soc |
syslog | severity: CRITICAL, HIGH | Корпоративный SOC — только критичные инциденты |
analytics-kafka |
kafka | (без фильтров) | Аналитическая платформа — все события для дашбордов и ML |
slack-critical |
webhook | severity: CRITICAL, types: REQUEST_BLOCKED | Оповещение дежурного в Slack о критичных блокировках |
backup-file |
file | (без фильтров) | Локальный backup на случай недоступности SIEM |
Типичные проблемы и решения¶
| Проблема | Симптом | Решение |
|---|---|---|
| Экспортер не отправляет события | Last Export не обновляется, в логах ошибки | Выполните тест (кнопка Test). Проверьте адрес, порт, firewall. Для webhook — проверьте URL и заголовки авторизации. |
| События приходят в SIEM с задержкой | Задержка > 30 секунд | Для webhook: проверьте timeout_sec и max_retries. Для Kafka: уменьшите flush_interval. Event Exporter опрашивает очередь каждые 5 секунд. |
| В SIEM приходят не все события | Часть событий отсутствует | Проверьте фильтры: настроен severities: ["CRITICAL"], а ожидаете HIGH-события? Фильтры работают по AND-логике между группами. |
| Syslog: события не парсятся в SIEM | Приходят, но отображаются как raw text | Проверьте format: rfc5424 для современных SIEM, rfc3164 для старых. Проверьте facility — SIEM может фильтровать по нему. |
Kafka: LEADER_NOT_AVAILABLE |
В логах ошибки подключения | Проверьте адреса brokers, SASL-credentials, TLS-сертификаты. Убедитесь, что топик существует. |
| Webhook: HTTP 401/403 | Ошибка авторизации | Проверьте заголовок Authorization в headers. Возможно, токен истёк — обновите его в настройках экспортера. |