Wavescan - интеллектуальная агентная система для анализа логов в области кибербезопасности, предназначенная для выявления угроз, аномалий и инцидентов в автономном режиме.
Система разворачивается локально в инфраструктуре компании, что обеспечивает полный контроль над данными и соответствует требованиям безопасности. Wavescan интегрируется с существующими источниками логов (SIEM, серверы, приложения, сетевые устройства) через Push API или общий том для логов, не требуя кардинальных изменений в текущей архитектуре.
В основе решения лежит комбинация классических методов анализа (YARA, Sigma правила) и современных технологий искусственного интеллекта. Система не просто обнаруживает подозрительные события, а проводит многоуровневый анализ с использованием LLM, сопоставляет инциденты с базой знаний MITRE ATT&CK и формирует структурированные отчёты с объяснениями, уровнем риска и рекомендациями.
Wavescan выступает как "умный помощник" специалиста по информационной безопасности, снижая нагрузку на команду и ускоряя реакцию на инциденты.
Wavescan — это не просто SIEM, а AI-powered SOC-аналитик, который не только находит угрозы, но и объясняет их, используя многоэтапный анализ и знания MITRE ATT&CK.
| Критерий | Wavescan | Splunk | ELK Stack | Datadog Security Monitoring |
|---|---|---|---|---|
| Тип системы | AI-powered SOC аналитик | Классический SIEM | Log management + SIEM | Cloud SIEM |
| AI-анализ логов | ✅ Глубокий (LLM) | ❌ Нет (в основном rules) | ||
| Контекстное понимание | ✅ Да (explainable AI) | ❌ Нет | ||
| Двухэтапный AI-пайплайн | ✅ Да (LLM → MITRE → LLM) | ❌ Нет | ❌ Нет | ❌ Нет |
| MITRE ATT&CK интеграция | ✅ Автоматическая + в анализе | |||
| Автоматические отчеты | ✅ С объяснениями и рекомендациями | ❌ Нет | ||
| AI-ассистент (чат) | ✅ Да | ❌ Нет | ❌ Нет | ❌ Нет |
| Скорость внедрения | ✅ Быстрая | ❌ Долго | ✅ Быстрая | |
| On-Premise | ✅ Да | ✅ Да | ✅ Да | ❌ Нет (облако) |
| Сложность настройки | ✅ Низкая | ❌ Высокая | ❌ Высокая | |
| Требования к квалификации | ✅ Низкие (за счет AI) | ❌ Высокие | ❌ Высокие | |
| Стоимость внедрения | Низкая | Высокая | Средняя | Высокая |
- Быстрый старт: разворачивается за несколько часов и легко интегрируется в существующую инфраструктуру без сложной настройки.
- Локальная работа: все данные остаются внутри компании — это критически важно для организаций с высокими требованиями к безопасности.
- Глубокий контекстный анализ: LLM не просто фиксирует событие, а объясняет его: что произошло, почему это опасно и какие последствия возможны.
- Интеграция с MITRE ATT&CK: автоматическое сопоставление инцидентов с тактиками и техниками атакующих, что упрощает расследование и реагирование.
- Снижение нагрузки на специалистов: автоматизация анализа логов и генерации отчетов экономит часы ручной работы.
- Масштабируемость: подходит как для небольших команд, так и для крупных инфраструктур с большим потоком логов.
- Удобный пользовательский интерфейс: чат с ИИ, фильтрация инцидентов, история отчетов и push-уведомления делают работу комфортной и быстрой.
- Удобная конфигурация: возможность добавить/редактировать/удалить yara и sigma правила через веб-интерфейс.
- Автономный анализ логов из внешего источника
- Загрузка логов вручную для анализа
- Диалог с ИИ-ассистентом по кибербезопасности
- Формирование подробных отчетов
- Оценка уровня критичности инцидентов
- Ведение статистики
- Хранение истории отчетов
- Система уведомлений
- Настройка yara и sigma правил
Архитектура анализа построена на LangGraph с параллельными ветками обработки:
flowchart TD
A[Входные логи] --> PF[Prefilter]
A --> PL[parse_logs]
PF --> A1[Agent 1 LLM]
A1 --> A2[Agent 2 RAG]
PL --> Y[YARA Scan]
PL --> S[Sigma Scan]
Y --> A3
S --> A3
A2 --> A3[Agent 3 LLM]
A3 --> R[Финальный отчёт]
Этапы обработки:
- Prefilter — фильтрация логов для Agent 1 (удаление "мусора" — heartbeat, health check и т.д.)
- Параллельный анализ:
- Agent 1 (LLM) — первичный анализ отфильтрованных логов, выявление аномалий и паттернов
- parse_logs — парсинг всех логов (без фильтрации)
- Сканирование (после parse_logs, все логи):
- YARA Scan — проверка на malware/exploits по YARA-правилам
- Sigma Scan — проверка SIEM-детекций по Sigma-правилам
- Agent 2 (RAG) — поиск MITRE ATT&CK техник для каждого события (если найдены события)
- Agent 3 (LLM) — финальная суммаризация: объединение AI-анализа, YARA, Sigma и MITRE в единый отчёт
- Сохранение — отчёт и метаданные сохраняются в PostgreSQL
- Уведомление — пользователи получают оповещение о новом инциденте
- Docker
- Ollama с LLM (любая модель, например llama3.2:latest)
- 8+ GB RAM
-
Находим последний релиз по ссылке и скачиваем архив с файлами из Assets
-
Распаковываем архив и переходим в папку
-
Переименовываем
.env.exampleв.env
Обязательно отредактируйте следующие переменные:
OLLAMA_URLиOLLAMA_MODEL- ваша локальная модель OllamaPOSTGRES_PASSWORD- пароль для базы данныхPASSWORD_SALT- соль для хэширования паролейCLI_TZ_OFFSET_HOURS- ваш часовой пояс
Остальное редактировать необязательно
- Запускаем Docker
docker compose up -dОбразы сами подтянутся с Docker Hub
- Переходим на сайт (порт указывается в
.env, по умолчанию -3000)
http://localhost:{FRONTEND_PORT}/Готово!
Для выключения:
docker compose down- Для подключения к консоли пишем (название контейнера указывается в
.env, команду нужно писать в корневой папке, по умолчанию -cyberlog-backend)
docker exec -it {BACKEND_CONTAINER_NAME} python app.py interactive- Регистрируем нового пользователя
register- Управление правами администратора и просмотр пользователей
users
set_admin <login> on
set_admin <login> offРаздел «Конфиг» в веб-интерфейсе доступен только пользователям с is_admin = true.
Wavescan принимает внешние логи через общий Docker-том (файлы .log/.txt) или через Push API. Для потоковых источников проще всего писать в общий том — Vector автоматически подхватит файлы из него.
- В
.envпроверьте параметры общего тома и пути:
PIPELINE_EXTERNAL_LOGS_VOLUME_NAME=cyberlog_external_logs
PIPELINE_EXTERNAL_LOGS_DIR=/app/shared/external
PIPELINE_EXTERNAL_APPEND_FILE=/app/shared/external/external_stream.log- В своей программе:
- смонтируйте тот же Docker-том (например, в
/var/log/goldenили/data/external) - пишите логи в
.logили.txt(append-only), чтобы Vector прочитал их из общего тома
Альтернатива: отправляйте логи через Push API: POST /api/pipeline/logs/upload или POST /api/pipeline/logs/text. Подробности: log_ai_agent/pipeline/README_INGEST_API.md.
Для просмотра графа выполнения в реальном времени:
# Генерация ASCII + Mermaid диаграммы
uv run -m log_ai_agent.ai_agent_v2.visual_graph.render_graphРезультат:
- ASCII-граф выводится в консоль
- Mermaid-диаграмма сохраняется в
log_ai_agent/ai_agent_v2/visual_graph/pipeline_graph.mmd - Для рендера Mermaid: mermaid.live или VS Code расширение
Скриншоты интерфейса (находятся в log_ai_agent/src/):
AI-CyberLogAgent/
├── download_embedding_model.bat # Скрипт загрузки модели эмбедингов
├── pyproject.toml # Конфигурация Python-зависимостей
├── uv.lock # Зафиксированные зависимости
├── .dockerignore # Исключения для Docker
├── .gitignore # Исключения для Git
├── FUNCTIONAL_SPECIFICATION.md # Функциональные требования
├── README.md # Документация
│
└── log_ai_agent/ # Основной проект
├── config/ # Конфигурация CLI
│ ├── cfg.py # Настройки
│ └── commands.py # Команды CLI
├── src/ # Скриншоты интерфейса
│ ├── page1.png # Страница авторизации
│ ├── page2_1.png # Чат с ассистентом
│ ├── page2_2.png # Чат с ассистентом
│ ├── page3.png # История отчетов
│ ├── page4.png # Статистика инцидентов
│ └── page5.png # Конфигурация правил
│
├── ai_agent_v2/ # AI-агент (LangGraph pipeline)
│ ├── chains/ # Цепочки обработки (Agent 1/2/3, RAG)
│ │ ├── agent1.py # Первичный анализ логов
│ │ ├── agent2.py # Детальный AI-отчёт
│ │ ├── agent3.py # Финальная суммаризация
│ │ ├── graph_nodes.py # LangGraph узлы
│ │ ├── rag_chain.py # RAG MITRE ATT&CK
│ │ ├── llm.py # LLM провайдер
│ │ ├── prefilter.py # Предобработка логов
│ │ └── providers/ # LLM провайдеры
│ │ ├── base.py # Базовый класс
│ │ ├── ollama.py # Ollama провайдер
│ │ └── gigachat.py # GigaChat провайдер
│ ├── engines/ # Сигнатурные движки
│ │ ├── yara_engine.py # YARA сканер
│ │ └── sigma_engine.py # Sigma сканер
│ ├── knowledge_base/ # MITRE ATT&CK данные
│ │ ├── manager.py # ChromaDB менеджер
│ │ └── mitre_loader.py # Загрузчик MITRE
│ ├── models/ # Типы данных
│ │ └── models_types.py # Pydantic схемы
│ ├── parsers/ # Парсеры логов
│ │ └── apache_parser.py # Apache парсер
│ ├── pipeline/ # LangGraph pipeline
│ │ ├── langgraph_pipeline.py # Основной граф
│ │ └── __init__.py
│ ├── prompts/ # Промты для LLM
│ │ ├── system.py # Системный промпт
│ │ └── log_analysis.py # Промпт анализа логов
│ ├── rules/ # Правила обнаружения
│ │ ├── yara/ # YARA правила
│ │ └── sigma/ # Sigma правила
│ ├── embedding/ # Эмбединговая модель
│ │ ├── manager.py # Загрузчик модели
│ │ └── models/ # Модель (не в Git)
│ ├── visual_graph/ # Визуализация графа
│ │ └── render_graph.py # Рендер графа
│ ├── chroma_db/ # Векторная БД (не в Git)
│ ├── mitre_data/ # MITRE STIX JSON (скачивается, не в Git)
│ ├── pipeline_tests/ # Тесты пайплайна
│ ├── app_integration.py # Интеграция с FastAPI
│ ├── callbacks.py # Колбэки
│ ├── chat_integration.py # Чат с ИИ
│ ├── config.py # Конфигурация агента
│ ├── init_mitre.py # Инициализация MITRE
│ ├── models_types.py # Типы моделей
│ ├── run.py # Точка входа
│ └── README.md # Документация модуля
│
├── pipeline/ # Приём и обработка логов
│ ├── kafka_consumer.py # Потребитель Kafka
│ ├── log_ingest_api.py # API загрузки логов
│ └── README_INGEST_API.md # Документация API
│
├── vector/ # Vector (сбор логов)
│ ├── vector.toml # Конфигурация Vector
│ └── lua/ # Lua-скрипты
│
├── site/ # Vue.js фронтенд
├── .env # Конфигурация (не в Git)
├── .env.example # Пример конфигурации
├── app.py # FastAPI приложение
├── docker-compose.yml # Оркестрация контейнеров
├── Dockerfile # Сборка backend
├── docker-entrypoint.sh # Скрипт запуска
└── init-db.sql # Инициализация БД
- user_id: integer (Уникальный идентификатор пользователя, автоинкремент)
- login: text (Логин пользователя)
- password_hash: text (Хэш пароля)
- is_admin: bool (Наличие прав админа)
- message_id: integer (Уникальный идентификатор сообщения, автоинкремент)
- user_id: integer (Внешний ключ на Users, идентификатор пользователя)
- role: text (Роль отправителя сообщения)
- content: text (Содержимое сообщения)
- created_at: timestamp with time zone (Дата и время создания сообщения)
- action_type_id: integer (Уникальный идентификатор типа действия, автоинкремент)
- name: text (Название типа действия)
- agent_log_id: integer (Уникальный идентификатор лога агента, автоинкремент)
- action_type_id: integer (Внешний ключ на ActionTypes, тип действия)
- description: text (Описание действия агента)
- date: timestamp with time zone (Дата и время выполнения действия)
- user_log_id: integer (Уникальный идентификатор лога пользователя, автоинкремент)
- user_id: integer (Внешний ключ на Users, пользователь, выполнивший действие)
- action_type_id: integer (Внешний ключ на ActionTypes, тип действия)
- description: text (Описание действия агента)
- date: timestamp with time zone (Дата и время выполнения действия)
- log_id: integer (Уникальный идентификатор лога, автоинкремент)
- file_content: text (Содержимое файла лога)
- date: timestamp with time zone (Дата и время создания лога)
- report_id: integer (Уникальный идентификатор отчета, автоинкремент)
- description: text (Описание инцидента)
- log_id: integer (Внешний ключ на Logs, связанный лог)
- threat_type_id: integer (Внешний ключ на ThreatTypes, тип угрозы)
- created_at: timestamp with time zone (Дата и время создания отчета)
- severity_level_id (Внешний ключ на SeverityLevels, уровень серьезности)
- threat_type_id: integer (Уникальный идентификатор типа угрозы, автоинкремент)
- name: text (Название типа угрозы)
- severity_level_id (Уникальный идентификатор уровня серьезности, автоинкремент)
- name: text (Название уровня серьезности)





