Руководство для SOC-команд и инженеров мониторинга
Содержание¶
- Обзор
- Ключевые возможности
- Архитектура
- Компоненты системы
- Типы событий
- SecurityEventType
- Уровни серьёзности (RFC 5424)
- Датакласс SecurityEvent
- Поля
- Фабричный метод
- Формат Syslog (RFC 5424)
- Структура сообщения
- Пример сообщения
- Конфигурация
- Splunk интеграция
- Формат CEF (ArcSight)
- Структура сообщения CEF
- Mapping Signature ID
- Пример сообщения CEF
- Extension Fields
- Конфигурация CEF
- ArcSight FlexConnector
- Формат LEEF (QRadar)
- Структура сообщения LEEF
- Пример сообщения LEEF
- Конфигурация LEEF
- QRadar Log Source
- Буферизация и надёжность
- Конфигурация буфера
- Поведение при сбоях
- Статистика буфера
- Справочник API
- Создание событий
- SIEMDispatcher API
- Примеры событий
- Событие блокировки DLP
- Событие запроса к LLM
- Событие ошибки аутентификации
- Событие тревоги безопасности
- Мониторинг
- Устранение неполадок
- Проверка подключения
- Диагностика
- Логирование
- Связанные документы
Обзор¶
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¶
- Admin → Log Sources → Add
- Vendor:
CodeGraph - Log Source Type:
Universal LEEF - Protocol: Syslog
- Port: 514
Буферизация и надёжность¶
Конфигурация буфера¶
security:
siem:
buffer:
max_size: 10000 # Максимум событий в очереди
flush_interval_seconds: 5 # Интервал сброса
retry_attempts: 3 # Количество повторов
retry_backoff_seconds: 2.0 # Задержка между повторами
Поведение при сбоях¶
- Первая попытка — отправка при сбросе буфера
- Сбой — событие перемещается в буфер повтора, повтор при следующем цикле сброса
- Повторные сбои — повторная постановка до
retry_attemptsраз - После исчерпания попыток — событие удаляется, учитывается как
failed - Переполнение буфера — самые старые события автоматически удаляются (циклический буфер), учитываются как
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:
- Статистика буфера —
dispatcher.statsвозвращает счётчикиenqueued,sent,failed,dropped,retried - Статус обработчиков —
dispatcher.is_enabledиdispatcher.handler_count - Журналы приложения — включите уровень DEBUG для пространства имён
src.security.siem - CLI —
python -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]
Связанные документы¶
- Enterprise Security Brief — Обзор безопасности
- DLP Security — DLP интеграция
- LLM Security — Безопасность LLM
Версия: 1.2 | Март 2026