Интеграция с SIEM

Руководство для SOC-команд и инженеров мониторинга


Содержание

Обзор

CodeGraph умеет отправлять события безопасности в SIEM-системы в реальном времени. Поддерживаются три формата: Syslog (RFC 5424), CEF (ArcSight) и LEEF (QRadar).

Ключевые возможности

  • 3 формата вывода: Syslog RFC 5424, CEF, LEEF
  • 17 типов событий: LLM, DLP, Auth, Vault, Rate Limiting, Security (path violation, IDOR, webhook replay, MCP auth)
  • 3 протокола транспорта: UDP, TCP, TLS
  • Буферизация: до 10 000 событий в очереди
  • Повторная отправка: автоматическая повторная попытка при сбоях
  • Плавная деградация: продолжение работы при недоступности SIEM

Архитектура

Компоненты системы

┌─────────────────────────────────────────────────────────────────────┐
│                         ПРИЛОЖЕНИЕ                                   │
│                                                                     │
│  [LLM Provider] ──┐                                                 │
│                   │                                                 │
│  [DLP Scanner] ───┼──► [SecurityEvent] ──► [SIEMDispatcher]        │
│                   │                              │                  │
│  [Auth Module] ───┘                              │                  │
│                                                  │                  │
│                                           ┌──────▼──────┐           │
│                                           │ SIEMBuffer  │           │
│                                           │ (10K queue) │           │
│                                           └──────┬──────┘           │
│                                                  │                  │
│                    ┌─────────────────────────────┼─────────────────┐│
│                    │                             │                 ││
│                    ▼                             ▼                 ▼│
│           ┌──────────────┐            ┌──────────────┐    ┌──────────────┐│
│           │SysLogHandler │            │  CEFHandler  │    │ LEEFHandler  ││
│           │  (RFC 5424)  │            │  (ArcSight)  │    │  (QRadar)    ││
│           └──────┬───────┘            └──────┬───────┘    └──────┬───────┘│
└──────────────────┼───────────────────────────┼───────────────────┼────────┘
                   │                           │                   │
                   ▼                           ▼                   ▼
            ┌────────────┐              ┌────────────┐      ┌────────────┐
            │  Splunk    │              │  ArcSight  │      │  QRadar    │
            │  Graylog   │              │  Splunk    │      │            │
            │  rsyslog   │              │            │      │            │
            └────────────┘              └────────────┘      └────────────┘

Типы событий

SecurityEventType

Все 17 типов событий определены в src/security/siem/base_handler.py. Строковые значения используют формат с точками в нижнем регистре:

Тип события Строковое значение Описание Уровень
LLM_REQUEST llm.request Запрос к поставщику LLM INFO (6)
LLM_RESPONSE llm.response Ответ от LLM INFO (6)
LLM_ERROR llm.error Ошибка LLM-взаимодействия ERROR (3)
DLP_BLOCK dlp.block Запрос заблокирован DLP CRITICAL (2)
DLP_MASK dlp.mask Данные маскированы WARNING (4)
DLP_WARN dlp.warn Предупреждение DLP WARNING (4)
DLP_LOG dlp.log DLP логирование INFO (6)
AUTH_SUCCESS auth.success Успешная аутентификация INFO (6)
AUTH_FAILURE auth.failure Неудачная аутентификация WARNING (4)
VAULT_ACCESS vault.access Доступ к секретам Vault INFO (6)
VAULT_ROTATE vault.rotate Ротация секретов NOTICE (5)
RATE_LIMIT rate.limit Превышение ограничения WARNING (4)
SECURITY_ALERT security.alert Критическое событие ИБ ALERT (1)
PATH_VIOLATION security.path_violation Попытка обхода пути WARNING (4)
IDOR_ATTEMPT security.idor_attempt Попытка IDOR-доступа WARNING (4)
WEBHOOK_REPLAY security.webhook.replay Атака повторного воспроизведения WARNING (4)
MCP_AUTH_FAILURE security.mcp.auth_failure Ошибка аутентификации MCP WARNING (4)

Уровни серьёзности (RFC 5424)

Код Уровень Описание
0 EMERGENCY Система неработоспособна
1 ALERT Требуется немедленное действие
2 CRITICAL Критическое состояние
3 ERROR Ошибка
4 WARNING Предупреждение
5 NOTICE Важное уведомление
6 INFO Информационное сообщение
7 DEBUG Отладочное сообщение

Датакласс SecurityEvent

Поля

Все 19 полей датакласса SecurityEvent (base_handler.py):

Поле Тип По умолчанию Описание
event_type SecurityEventType обязательное Тип события безопасности
timestamp str обязательное Метка времени ISO 8601
request_id str обязательное Уникальный идентификатор запроса
message str обязательное Описание события
severity int 6 (INFO) Критичность RFC 5424 (0–7)
user_id Optional[str] None Идентификатор пользователя
session_id Optional[str] None Идентификатор сессии
ip_address Optional[str] None IP-адрес клиента
user_agent Optional[str] None Заголовок User-Agent
provider Optional[str] None Поставщик LLM
model Optional[str] None Модель LLM
action Optional[str] None Выполненное действие
dlp_category Optional[str] None Категория DLP
dlp_pattern Optional[str] None Имя паттерна DLP
tokens_used Optional[int] None Количество токенов
latency_ms Optional[float] None Задержка в миллисекундах
project_id Optional[str] None ID проекта (мультитенантность)
group_id Optional[str] None ID группы (мультитенантность)
details Dict[str, Any] {} Дополнительные данные

Фабричный метод

# SecurityEvent.create() автоматически генерирует метку времени ISO
event = SecurityEvent.create(
    event_type=SecurityEventType.DLP_BLOCK,
    message="AWS access key detected",
    request_id="req-12345",
    severity=2,  # CRITICAL
    user_id="user_123",
    ip_address="10.0.0.50",
    dlp_category="credentials",
    dlp_pattern="aws_access_key",
    action="BLOCK"
)

# Преобразование в словарь (поля с None опускаются)
event_dict = event.to_dict()

Формат Syslog (RFC 5424)

Структура сообщения

<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID [STRUCTURED-DATA] MSG

Пример сообщения

<134>1 2026-02-26T10:30:00.000Z codegraph-server codegraph 12345 DLP001
[meta@47450 category="credentials" pattern="aws_access_key" action="BLOCK"]
DLP blocked request: AWS access key detected in user prompt

Конфигурация

security:
  siem:
    enabled: true
    syslog:
      enabled: true
      protocol: udp      # udp, tcp, tls
      host: "siem.company.com"
      port: 514
      facility: 16       # LOCAL0 (16-23)
      app_name: "codegraph"
      hostname: null     # Авто-определение
      tls:               # Только для protocol: tls
        ca_cert: "/path/to/ca.crt"
        client_cert: "/path/to/client.crt"
        client_key: "/path/to/client.key"
        verify: true

Splunk интеграция

# inputs.conf
[udp://514]
sourcetype = syslog
index = security

# props.conf
[syslog]
TIME_FORMAT = %Y-%m-%dT%H:%M:%S.%3N%Z
SHOULD_LINEMERGE = false

Формат CEF (ArcSight)

Структура сообщения CEF

CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|Name|Severity|Extension

Mapping Signature ID

Полный маппинг из SIGNATURE_MAP (cef_handler.py) и EVENT_ID_MAP (leef_handler.py):

Event Type Signature ID Name
llm.request LLM001 LLM Request
llm.response LLM002 LLM Response
llm.error LLM003 LLM Error
dlp.block DLP001 DLP Block
dlp.mask DLP002 DLP Mask
dlp.warn DLP003 DLP Warning
dlp.log DLP004 DLP Log
vault.access VLT001 Vault Access
vault.rotate VLT002 Vault Rotate
auth.success AUTH01 Auth Success
auth.failure AUTH02 Auth Failure
rate.limit RATE01 Rate Limit
security.alert SEC001 Security Alert

Типы событий, отсутствующие в маппинге (security.path_violation, security.idor_attempt, security.webhook.replay, security.mcp.auth_failure), используют резервный ID GEN001.

Пример сообщения CEF

CEF:0|CodeGraph|CodeAnalysis|1.0|DLP001|DLP Block|8|
src=10.0.0.50 suser=analyst@company.com externalId=req-12345
msg=AWS access key detected rt=2026-02-26T10:30:00.000Z
cs1=GigaChat cs1Label=LLM Provider
cs4=credentials cs4Label=DLP Category
cs5=aws_access_key cs5Label=DLP Pattern
cn2=125 cn2Label=Latency MS

Extension Fields

Поле CEF Key Описание
IP адрес src IP источника
User ID suser Идентификатор пользователя
Request ID externalId ID запроса
Message msg Текст сообщения
Timestamp rt Время события
LLM Provider cs1 Поставщик LLM
LLM Model cs2 Модель LLM
Action cs3 Выполненное действие
DLP Category cs4 Категория DLP
DLP Pattern cs5 Паттерн DLP
Tokens Used cn1 Использовано токенов
Latency MS cn2 Задержка в мс

Конфигурация CEF

security:
  siem:
    cef:
      enabled: true
      host: "arcsight.company.com"
      port: 514
      protocol: tcp
      device_vendor: "CodeGraph"
      device_product: "CodeAnalysis"
      device_version: "1.0"

ArcSight FlexConnector

<!-- connector.parser.xml -->
<parser>
  <name>CodeGraph CEF Parser</name>
  <pattern>CEF:0|CodeGraph|CodeAnalysis|.*</pattern>
</parser>

Формат LEEF (QRadar)

Структура сообщения LEEF

LEEF:Version|Vendor|Product|Version|EventID|Extension

Пример сообщения LEEF

LEEF:2.0|CodeGraph|CodeAnalysis|1.0|DLP001|
cat=DLP sev=8   src=10.0.0.50   usrName=analyst
msg=AWS access key detected devTime=2026-02-26T10:30:00.000Z

Конфигурация LEEF

security:
  siem:
    leef:
      enabled: true
      host: "qradar.company.com"
      port: 514
      protocol: udp
      product_vendor: "CodeGraph"
      product_name: "CodeAnalysis"
      product_version: "1.0"

QRadar Log Source

  1. Admin → Log Sources → Add
  2. Vendor: CodeGraph
  3. Log Source Type: Universal LEEF
  4. Protocol: Syslog
  5. Port: 514

Буферизация и надёжность

Конфигурация буфера

security:
  siem:
    buffer:
      max_size: 10000           # Максимум событий в очереди
      flush_interval_seconds: 5  # Интервал сброса
      retry_attempts: 3          # Количество повторов
      retry_backoff_seconds: 2.0 # Задержка между повторами

Поведение при сбоях

  1. Первая попытка — отправка при сбросе буфера
  2. Сбой — событие перемещается в буфер повтора, повтор при следующем цикле сброса
  3. Повторные сбои — повторная постановка до retry_attempts раз
  4. После исчерпания попыток — событие удаляется, учитывается как failed
  5. Переполнение буфера — самые старые события автоматически удаляются (циклический буфер), учитываются как dropped

Статистика буфера

dispatcher = get_siem_dispatcher()
stats = dispatcher.stats

print(f"В очереди: {stats['enqueued']}")
print(f"Отправлено: {stats['sent']}")
print(f"Сбоев: {stats['failed']}")
print(f"Удалено (переполнение): {stats['dropped']}")
print(f"Повторов: {stats['retried']}")

Справочник API

Создание событий

from src.security.siem.base_handler import SecurityEvent, SecurityEventType
from src.security.siem.dispatcher import dispatch_security_event

# Создание события
event = SecurityEvent.create(
    event_type=SecurityEventType.DLP_BLOCK,
    message="AWS access key detected in user prompt",
    request_id="req-12345",
    severity=2,  # CRITICAL
    user_id="user_123",
    ip_address="10.0.0.50",
    dlp_category="credentials",
    dlp_pattern="aws_access_key",
    action="BLOCK"
)

# Отправка в SIEM
success = dispatch_security_event(event)

SIEMDispatcher API

from src.security.siem.dispatcher import SIEMDispatcher, init_siem_dispatcher
from src.security.config import get_security_config

# Инициализация
config = get_security_config()
dispatcher = init_siem_dispatcher(config.siem)

# Асинхронная отправка (через буфер)
dispatcher.dispatch(event)

# Синхронная отправка (минуя буфер, для критических)
dispatcher.dispatch_sync(event)

# Сброс буфера
sent_count = dispatcher.flush()

# Статистика
print(dispatcher.stats)
print(f"Handlers: {dispatcher.handler_count}")
print(f"Enabled: {dispatcher.is_enabled}")

# Закрытие
dispatcher.close()

Примеры событий

DLP Block Event

{
  "event_type": "dlp.block",
  "timestamp": "2026-02-26T10:30:00.000Z",
  "request_id": "req-12345",
  "severity": 2,
  "message": "DLP blocked request: AWS access key detected",
  "user_id": "analyst@company.com",
  "ip_address": "10.0.0.50",
  "dlp_category": "credentials",
  "dlp_pattern": "aws_access_key",
  "action": "BLOCK"
}

LLM Request Event

{
  "event_type": "llm.request",
  "timestamp": "2026-02-26T10:30:00.000Z",
  "request_id": "req-67890",
  "severity": 6,
  "message": "LLM request to GigaChat",
  "user_id": "analyst@company.com",
  "provider": "GigaChat",
  "model": "GigaChat-2-Pro",
  "tokens_used": 150,
  "latency_ms": 1250.5
}

Auth Failure Event

{
  "event_type": "auth.failure",
  "timestamp": "2026-02-26T10:30:00.000Z",
  "request_id": "req-11111",
  "severity": 4,
  "message": "Authentication failed: invalid credentials",
  "user_id": "unknown",
  "ip_address": "10.0.0.99",
  "details": {
    "reason": "invalid_password",
    "attempts": 3
  }
}

Security Alert Event

{
  "event_type": "security.path_violation",
  "timestamp": "2026-02-26T10:31:00.000Z",
  "request_id": "req-44444",
  "severity": 4,
  "message": "Path traversal attempt: ../../etc/passwd",
  "user_id": "unknown",
  "ip_address": "10.0.0.90",
  "details": {
    "attempted_path": "../../etc/passwd",
    "normalized_path": "/etc/passwd"
  }
}

Мониторинг

Доставка в SIEM отслеживается через API статистики диспетчера. Отдельных SIEM-счётчиков Prometheus нет — используйте статистику буфера и журналы приложения.

Для мониторинга активности SIEM:

  1. Статистика буфераdispatcher.stats возвращает счётчики enqueued, sent, failed, dropped, retried
  2. Статус обработчиковdispatcher.is_enabled и dispatcher.handler_count
  3. Журналы приложения — включите уровень DEBUG для пространства имён src.security.siem
  4. CLIpython -m src.cli siem status для статуса диспетчера

Устранение неполадок

Проверка подключения

# Тест UDP
echo "<134>1 test message" | nc -u siem.company.com 514

# Тест TCP
echo "<134>1 test message" | nc siem.company.com 514

# Тест TLS
openssl s_client -connect siem.company.com:6514

Диагностика

# Проверка статуса диспетчера
from src.security.siem.dispatcher import get_siem_dispatcher

dispatcher = get_siem_dispatcher()
if dispatcher:
    print(f"Enabled: {dispatcher.is_enabled}")
    print(f"Handlers: {dispatcher.handler_count}")
    print(f"Stats: {dispatcher.stats}")
else:
    print("SIEM dispatcher not initialized")

Логирование

# logging.yaml
loggers:
  src.security.siem:
    level: DEBUG
    handlers: [console, file]

Связанные документы


Версия: 1.2 | Март 2026