Portainer Plus - Подсистема мониторинга событий для обнаружения бесфайловых атак
Дипломный проект: Разработка подсистемы мониторинга событий в контейнеризированных средах для обнаружения бесфайловых атак на уровне ядра операционной системы.
Описание проекта
Portainer Plus - это расширенная версия Portainer с интегрированной подсистемой мониторинга безопасности, которая:
- Собирает события на уровне ядра ОС через eBPF (extended Berkeley Packet Filter)
- Обнаруживает бесфайловые атаки в контейнерах с использованием 720+ паттернов детектирования
- Интегрируется с Wazuh для централизованного мониторинга и анализа
- Сопоставляет события с техниками MITRE ATT&CK - все обнаруженные события автоматически маппятся на соответствующие техники и подтехники
- Предоставляет современный UI для визуализации событий безопасности с фильтрацией и группировкой
- Мониторит системные вызовы в реальном времени: execve, memfd_create, ptrace, process_vm_writev, process_vm_readv, mprotect, mmap, open, openat
- Обнаруживает подозрительные операции с памятью и файловой системой (/dev/mem, /dev/kmem, /proc/*/mem)
Структура проекта
portainer_plus/
├── portainer/ # Исходный код Portainer (из GitHub)
├── monitoring-subsystem/ # Подсистема мониторинга
│ ├── collector/ # Модуль сбора событий
│ ├── analyzer/ # Модуль анализа
│ ├── mitre/ # Модуль MITRE ATT&CK
│ ├── wazuh/ # Модуль интеграции с Wazuh
│ ├── api/ # API для Portainer
│ └── cmd/ # Точка входа
├── frontend/ # UI компоненты
├── docker-compose.yml # Конфигурация Docker Compose
├── Dockerfile.portainer # Кастомный образ Portainer
└── .env # Переменные окружения
Требования
- Docker 20.10+
- Docker Compose 2.0+
- Linux с ядром 5.8+ (для поддержки eBPF)
- Минимум 4GB RAM
- 10GB свободного места на диске
Быстрый старт
- Клонирование и настройка:
cd portainer_plus
cp .env.example .env # Настройте переменные окружения при необходимости
- Запуск всех сервисов:
docker-compose up -d
- Доступ к сервисам:
- Portainer UI (HTTP): http://localhost:9000
- Portainer UI (HTTPS): https://localhost:9443
- События безопасности: https://localhost:9443/#!/monitoring/security-events
- Wazuh Manager API: http://localhost:55000
- Wazuh Dashboard: http://localhost:5601
- Wazuh Agent: localhost:1514
- Monitoring Subsystem API: http://localhost:8080
Сборка кастомных образов
Сборка Portainer Plus:
docker-compose build portainer
Сборка подсистемы мониторинга:
docker-compose build monitoring-subsystem
Сборка всех образов:
docker-compose build
Разработка
Запуск в режиме разработки:
# Запуск только инфраструктуры (Wazuh)
docker-compose up -d wazuh-manager wazuh-agent
# Разработка подсистемы мониторинга локально
cd monitoring-subsystem
go run cmd/main.go
Структура модулей:
- collector/: Сбор событий через eBPF и auditd
- analyzer/: Анализ и детектирование бесфайловых атак
- mitre/: Сопоставление с техниками MITRE ATT&CK
- wazuh/: Интеграция с Wazuh API
- api/: REST API для интеграции с Portainer
Конфигурация
Основные настройки находятся в файле .env и docker-compose.yml:
Переменные окружения для Monitoring Subsystem:
WAZUH_API_USER/WAZUH_API_PASSWORD: Учетные данные для Wazuh APILOG_LEVEL: Уровень логирования (debug, info, warn, error)API_ADDR: Адрес и порт для API (по умолчанию :8080)MITRE_DATA_DIR: Путь к данным MITRE ATT&CKGENERATE_TEST_EVENTS: Генерация тестовых событий (true/false)PATTERNS_CONFIG_PATH: Путь к файлу с пользовательскими паттернами
Переменные окружения для Portainer:
PORTAINER_ENABLE_MONITORING: Включить интеграцию с мониторингом (true/false)MONITORING_SUBSYSTEM_URL: URL подсистемы мониторинга (http://monitoring-subsystem:8080)WAZUH_MANAGER_URL: URL Wazuh Manager APIWAZUH_AGENT_URL: URL Wazuh Agent
Пользовательские паттерны
Вы можете добавить собственные паттерны обнаружения, создав файл monitoring-subsystem/patterns.json:
{
"patterns": [
{
"name": "custom_pattern",
"description": "Описание паттерна",
"indicators": [
{
"type": "syscall",
"value": "execve",
"condition": "equals",
"required": true
}
],
"mitreTechniques": ["T1059"],
"severity": "warning"
}
]
}
Архитектура
┌─────────────────────────────────────────────────────────┐
│ Portainer UI │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Security Events View (React/TypeScript) │ │
│ │ - Фильтрация по контейнерам │ │
│ │ - Статистика и детальный просмотр │ │
│ │ - Отображение MITRE техник │ │
│ └──────────────────────────────────────────────────┘ │
└────────────────────┬────────────────────────────────────┘
│ HTTP REST API
┌────────────────────▼────────────────────────────────────┐
│ Monitoring Subsystem (Go) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Collector │ │ Analyzer │ │ MITRE │ │
│ │ (eBPF) │→ │ (720+ │→ │ Mapper │ │
│ │ │ │ patterns) │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ API Server │ │
│ │ (REST) │ │
│ └────────┬────────┘ │
└────────────────────────────┼────────────────────────────┘
│
┌─────────┴─────────┐
│ │
┌──────────▼──────────┐ ┌───▼──────────┐
│ Wazuh Manager │ │ Database │
│ (Centralized Logs) │ │ (Events) │
└─────────────────────┘ └──────────────┘
Компоненты системы
- eBPF Collector - сбор системных вызовов на уровне ядра
- Analyzer - анализ событий по 720+ паттернам бесфайловых атак
- MITRE Mapper - сопоставление событий с техниками MITRE ATT&CK
- API Server - REST API для интеграции с Portainer
- Wazuh Integration - отправка событий в Wazuh для централизованного анализа
- UI Components - React компоненты для отображения событий
Основные возможности
Мониторинг системных вызовов
Подсистема отслеживает следующие системные вызовы через eBPF:
- execve - выполнение программ
- memfd_create - создание бесфайловых файлов в памяти
- ptrace - отладка и инъекция в процессы
- process_vm_writev/readv - чтение/запись памяти процессов
- mprotect - изменение прав доступа к памяти
- mmap - отображение файлов/устройств в память
- open/openat - открытие файлов (с фильтрацией подозрительных путей)
Обнаружение бесфайловых атак
Система использует 720+ паттернов для обнаружения различных типов бесфайловых атак:
- Инъекция в процессы (Process Injection) - через ptrace, process_vm_writev
- Манипуляции с памятью - memfd_create, mprotect, mmap с подозрительными флагами
- Доступ к физической памяти - /dev/mem, /dev/kmem, /proc/*/mem
- Злоупотребление переменными окружения - LD_PRELOAD, LD_LIBRARY_PATH
- Операции с /dev/shm - создание исполняемых файлов в shared memory
- Манипуляции с /proc - чтение/запись памяти через /proc/self/mem
- Namespace операции - unshare, setns для изоляции
- IPC манипуляции - использование shared memory, semaphores для передачи кода
- И многие другие - полный список паттернов в
monitoring-subsystem/analyzer/patterns/patterns.go
Интеграция с MITRE ATT&CK
Все обнаруженные события автоматически сопоставляются с техниками и подтехниками MITRE ATT&CK Framework:
- T1055 - Process Injection (T1055.001, T1055.002, T1055.003, T1055.004, T1055.008, T1055.009, T1055.011, T1055.012, T1055.013, T1055.014, T1055.015)
- T1027 - Obfuscated Files or Information (T1027.001, T1027.002, T1027.003, T1027.004, T1027.005, T1027.006, T1027.007, T1027.008, T1027.009, T1027.010, T1027.011, T1027.012, T1027.013)
- T1059 - Command and Scripting Interpreter
- T1106 - Native API
- T1078 - Valid Accounts
- T1548 - Abuse Elevation Control Mechanism
- T1134 - Access Token Manipulation
- T1574 - Hijack Execution Flow
- И многие другие техники
UI для событий безопасности
Интерфейс пользователя предоставляет:
- Таблица событий с фильтрацией по уровню, типу, контейнеру
- Фильтрация по контейнерам:
- С контейнерами (по умолчанию)
- Без контейнеров
- Все события
- Статистика - общее количество, распределение по уровням критичности
- Детальный просмотр - модальное окно с полной информацией о событии
- Группировка событий - одинаковые события группируются с указанием количества
- Отображение MITRE техник - визуальное представление связанных техник
- Статус eBPF коллектора - индикатор работы системы мониторинга
Логи и отладка
Просмотр логов:
# Все сервисы
docker-compose logs -f
# Конкретный сервис
docker-compose logs -f monitoring-subsystem
docker-compose logs -f portainer
docker-compose logs -f wazuh-manager
Остановка
docker-compose down
# С удалением volumes
docker-compose down -v
Технические детали
eBPF программы
eBPF программы находятся в monitoring-subsystem/collector/ebpf/syscall_monitor.c и отслеживают:
- Tracepoints для системных вызовов
- Фильтрация подозрительных путей в ядре
- Сбор метаданных (PID, UID, GID, cgroup_id)
- Передача событий в userspace через perf_event_array
Паттерны обнаружения
Паттерны определены в monitoring-subsystem/analyzer/patterns/patterns.go и включают:
- Типы индикаторов: syscall, path, env, behavior
- Условия сопоставления: equals, contains, starts_with, ends_with, regex
- Обязательные/опциональные индикаторы
- Уровни критичности: info, warning, error, critical
API Endpoints
Monitoring Subsystem предоставляет следующие REST API:
GET /api/v1/security-events- список событий безопасностиGET /api/v1/security-events/stats- статистика событийGET /api/v1/security-events/{id}- детали событияDELETE /api/v1/security-events- удаление событийPOST /api/v1/security-events/test- создание тестового событияGET /api/v1/collector/status- статус eBPF коллектораGET /api/v1/patterns- список паттерновPOST /api/v1/patterns- добавление пользовательского паттерна
Производительность
- Низкая нагрузка на систему - eBPF работает на уровне ядра без копирования данных
- Масштабируемость - поддержка множества контейнеров одновременно
- Группировка событий - одинаковые события автоматически группируются
- Асинхронная обработка - события обрабатываются в фоновых горутинах
Безопасность
- Привилегированный режим - требуется для работы eBPF (только для monitoring-subsystem)
- Изоляция контейнеров - события привязаны к конкретным контейнерам через cgroup_id
- Аудит событий - все события логируются и сохраняются
- Интеграция с Wazuh - централизованное хранение и анализ
Лицензия
Portainer Plus использует код Portainer (Apache 2.0) и добавляет собственные компоненты.
Разработка
Структура кода
- Go - backend (monitoring-subsystem)
- React/TypeScript - frontend (portainer/app/react/monitoring)
- C - eBPF программы
- Docker Compose - оркестрация сервисов
Добавление новых паттернов
Паттерны добавляются в monitoring-subsystem/analyzer/patterns/patterns.go в функцию GetPatterns(). Каждый паттерн должен включать:
- Уникальное имя
- Описание
- Индикаторы (минимум один обязательный)
- MITRE техники
- Уровень критичности
Контакты и поддержка
Для вопросов и предложений создавайте Issues в репозитории проекта.