Архітектура та потік даних
Огляд
Архітектура SOC — пошаровий потік: збір з ендпоінтів → кореляція у Wazuh Manager → зберігання у Wazuh Indexer → автоматична диспетчеризація у TheHive/CrowdSec/Teams → triage людиною → розслідування у Case → опціонально форензика через Velociraptor.
Поточний стан (2026-04-15) має 2 ключові відмінності від цільового роадмапу:
- Оркестрація йде не через Shuffle (SOAR), а через прості custom-скрипти на Wazuh Manager. Shuffle розгорнутий, але playbook'и не написані — він зараз idle.
- Tier 3 компоненти не розгорнуті: Suricata (NIDS) блокована відсутністю SPAN port, Grafana не розгорнута, Sigma community rules не імпортовані.
Потік даних (крок за кроком)
Крок 1. Збір
- Wazuh agents (35 Active) на CT/хостах Академії — збирають login events, File Integrity Monitoring (FIM), процеси, USB-події, vulnerability scans.
- FortiGate шле syslog у Wazuh Manager (порт 514/udp).
Крок 2. Прийом і кореляція
- Wazuh Manager (CT702) приймає події через порт 1514 (agent protocol, TCP+UDP).
- Застосовує декодери + правила:
- Builtin Wazuh ruleset (thousands of rules)
- Локальні
/var/ossec/etc/rules/local_rules.xml(в т.ч. RFC 5737 suppressions — див. Daily Routine Tier 1)
- Генерує alert'и з level 0-15 (0 = suppressed, 15 = critical).
Крок 3. Зберігання
- Усі події індексуються у Wazuh Indexer (3-node OpenSearch cluster):
- CT701 primary на siem-px1
- CT704 replica 1 на siem-px3
- CT705 replica 2 на siem-px5
- Дані індексуються з replicas 2 (кожен документ на 2 нодах) — втрата 1 ноди не втрачає дані.
Крок 4. Автоматична диспетчеризація (level ≥ 10)
⚠️ Відхилення від плану: замість єдиного Shuffle (SOAR) зараз працюють 3 незалежні custom-скрипти на Wazuh Manager (тимчасове рішення, міграція у Shuffle — TASK-114):
| Скрипт | Куди шле | Мета |
|---|---|---|
custom-thehive.py |
TheHive (CT710) → POST /api/v1/alert |
Створити Alert у TheHive (НЕ Case!) |
custom-crowdsec-block.py |
CrowdSec (CT707) → POST /v1/alerts |
Забанити IP (з whitelist фільтром + TTL) |
custom-teams.sh |
Microsoft Teams webhook | Adaptive Card у SIEM-Alerts канал |
Ці три роботи виконуються паралельно у Wazuh Manager.
Крок 5. Triage (Tier 1 аналітик, людина)
Аналітик відкриває TheHive Alerts queue. Для кожного Alert:
- 📄 Preview and Import (іконка у рядку alert'а) → модальне вікно з description, tags, observables.
- На основі тексту (rule, agent, srcip, full_log) аналітик приймає рішення:
- Підозрілий → "Yes, Import" → alert стає Case
- FP (шум) → Cancel, "Mark as read"
- Cortex аналізатори (VirusTotal, AbuseIPDB, MISP) запускаються тільки в Case (не в Alert) — кнопка "Run analyzers" доступна на observable у Case → Observables tab.
Alert vs Case — фундаментальна різниця:
| Alert | Case | |
|---|---|---|
| Як створюється | Автоматично (Wazuh→TheHive) | Вручну (з Alert через "Yes, Import") |
| Що означає | Сира тривога, ще не triage | Підтверджений інцидент на розслідування |
| Скільки їх | Багато (~100-1000/день), 70% FP | Мало (~5-20/день), всі значущі |
| Cortex аналізатори | ❌ недоступні | ✅ кнопка "Run analyzers" на кожному observable |
| Де у TheHive UI | Alerts tab | Cases tab |
Без проміжного етапу "Alert → triage → Case" TheHive забився б шумом за кілька днів.
Крок 6. Розслідування (Tier 2+)
Аналітик працює у TheHive Case: - Додає tasks (що перевірити) - Додає observables (знайдені IoCs) - Для кожного observable — Cortex enrichment (VT/AbuseIPDB/MISP повторно) - Шукає у MISP — "чи цей IoC хтось уже бачив? коли? в якому event?" - За потреби — Velociraptor hunt на host'і: "покажи процеси / файли / registry"
Крок 7. Реагування на WAN атаки
Це паралельний flow, не залежить від TheHive:
- CrowdSec зберігає decisions локально (SQLite)
- blocklist-mirror на CT707 експортує активні decisions як HTTP feed (http://10.250.0.16/security/blocklist)
- FortiGate підтягує feed кожну хвилину як external-resource
- FortiGate Policy 137 DROP'ить трафік з IP у feed
Тобто ban відбувається через 1-2 хвилини після Wazuh alert — атакуючий IP перестає досягати навіть публічних сервісів Академії.
Діаграма (поточний реальний flow)
Зовнішні threat feeds ┌────────────────────────┐
(CERT-UA, MISP feeds)──────hourly feed────────▶│ MISP (CT706) │
│ 570+ events │
└───────┬─────────┬──────┘
│ │
(analyzer query│ │ hourly sync
from Cortex) │ ▼
│ ┌───────────────┐
│ │ TheHive Alerts │
│ │ queue (CT710) │
│ └───────┬───────┘
│ │ Import as Case
│ │ (human click)
▼ ▼
┌──────────────────────┐
│ Cortex (CT711) │
│ ↑ enrichment │
│ VT+AbuseIPDB+MISP │
└──────────┬───────────┘
│
┌───────────────┐ │
35 Wazuh agents ─────│ │ custom-thehive.py │
FortiGate syslog ────│ Wazuh Manager ├──────────────────────▶│
│ (CT702) │ custom-crowdsec... │
│ │─────────▶ CrowdSec (CT707) ──feed──▶ FortiGate Policy 137 DROP
│ │ custom-teams.sh
│ │─────────▶ MS Teams SIEM-Alerts
└───────┬────────┘
│ all events indexed
▼
┌─────────────────────────────────┐
│ Wazuh Indexer (OpenSearch 3-node)│
│ Primary: CT701 @ siem-px1 │
│ Replica1: CT704 @ siem-px3 │
│ Replica2: CT705 @ siem-px5 │
└──────────┬──────────────────────┘
│ queries
▼
┌──────────────────────┐
│ Wazuh Dashboard (CT703)│
└──────────────────────┘
┌───────────────────────────┐
│ Velociraptor (CT713) │
│ — сервер розгорнутий │
│ — клієнти ще НЕ розгорнуті │ ⟵ subtask 26
└───────────────────────────┘
🟡 НЕ У FLOW зараз:
Shuffle (idle — playbooks не написані, subtask 22)
Suricata (не розгорнуто — блокер SPAN port)
Grafana (не розгорнуто, Tier 3)
Sigma rules (не імпортовано, Tier 3)
Інтеграційні точки (активні)
| Звідки | Куди | Метод | Статус |
|---|---|---|---|
| Wazuh Agent | Wazuh Manager | Agent protocol (1514 TCP+UDP) | 🟢 35 agents active |
| FortiGate | Wazuh Manager | Syslog (514 UDP) | 🟢 |
| Wazuh Manager | Wazuh Indexer | REST API (9200 TCP) | 🟢 3-node cluster |
| Wazuh Manager | TheHive | custom-thehive.py → HTTPS POST /api/v1/alert |
🟢 (level ≥ 10) |
| Wazuh Manager | CrowdSec | custom-crowdsec-block.py → HTTP POST /v1/alerts |
🟢 (level ≥ 10, з whitelist) |
| Wazuh Manager | MS Teams | custom-teams.sh → HTTPS Power Automate webhook |
🟢 (level ≥ 10) |
| Wazuh Dashboard | Wazuh Indexer | REST API (9200) | 🟢 |
| TheHive | Cortex | REST API з application.conf (Bearer auth) |
🟢 |
| TheHive | MISP | REST API з application.conf (key auth, hourly sync) |
🟢 570+ events imported |
| Cortex | VirusTotal | REST API (HTTPS outbound) | 🟢 500 lookups/day free |
| Cortex | AbuseIPDB | REST API (HTTPS outbound) | 🟢 1000 lookups/day free |
| Cortex | MISP (local) | REST API | 🟢 |
| CrowdSec | FortiGate | External-resource HTTP feed (pull кожну хв) | 🟢 Policy 137 DROP |
Плановані інтеграції (НЕ активні)
| Інтеграція | Мета | Де у BACKLOG |
|---|---|---|
| Wazuh Manager → Shuffle | SOAR оркестрація замість custom scripts | TASK-092d subtask 22 |
| Shuffle → TheHive / Cortex / Teams / CrowdSec | Playbooks для automation flows | subtask 22 |
| MISP → Wazuh CDB lists | IoC matching у Wazuh rules (99906-99920) | subtask 28 |
| Suricata → Wazuh Manager | Network-level detection | TASK-092e |
| Sigma rules → Wazuh rules | 100+ community detection rules | TASK-092e |
| Wazuh Indexer → Grafana | Executive dashboards для Manager/CISO | TASK-092e |
| Teams Adaptive Card → action buttons | One-click "Open in TheHive" / "Wazuh Discover" | subtask 29 |
| Velociraptor agents → Velociraptor server | Endpoint forensics working реально | subtask 26 (Phase 1-3) |
Чому саме такий flow (історичний контекст)
Первинний план (Tier 2 deployment plan 2026-04-14) передбачав Shuffle як центральний orchestration layer. Під час реального deployment ми вирішили:
- Швидко вивести MVP у прод — Wazuh→TheHive flow критичний, не чекати написання playbooks
- Написати прості custom-скрипти Python/bash (99 рядків у сумі) для тривіальних flows
- Shuffle залишити розгорнутим, але idle — поки не буде потреби у складніших workflow (
if → else → parallelгілки)
Це зробило MVP живим за 1 день замість тижнів. Ціна — код у 3 місцях замість одного Shuffle UI.
⚠️ TASK-114: Міграція custom scripts → Shuffle (обов'язкова)
Принцип: якщо можливо щось НЕ мати на Wazuh Manager як custom script, а в Shuffle — то це має бути в Shuffle. Wazuh Manager = detection + correlation. Shuffle SOAR = orchestration + response + notification.
Всі 3 custom scripts (custom-thehive.py, custom-crowdsec-block.py, custom-teams.sh) мають бути замінені Shuffle playbooks. Міграція поетапна (по одному скрипту з паралельним тестуванням). Трекається у BACKLOG як TASK-114.
Останнє оновлення: 2026-04-16.