173 lines
8.5 KiB
Markdown
173 lines
8.5 KiB
Markdown
# Описание модулей DIP-IDS
|
|
|
|
## 1. Модуль захвата трафика (`internal/capture`)
|
|
|
|
### Назначение
|
|
Обеспечивает получение сетевых пакетов из двух источников: живой захват с сетевого интерфейса и чтение ранее записанных PCAP-файлов.
|
|
|
|
### Файлы
|
|
| Файл | Описание |
|
|
|------|----------|
|
|
| `capture.go` | Структура `Capturer`, функции `New`, `Start`, `Stop`, `ListInterfaces` |
|
|
|
|
### Ключевые типы
|
|
|
|
```go
|
|
type Mode string // "live" или "pcap"
|
|
|
|
type Config struct {
|
|
Interface string // имя интерфейса (для live)
|
|
PCAPFile string // путь к файлу (для pcap)
|
|
Mode Mode
|
|
Snaplen int32 // максимальный размер захватываемого пакета
|
|
Promiscuous bool // неразборчивый режим
|
|
}
|
|
```
|
|
|
|
### Принцип работы
|
|
`Start(ctx)` открывает `pcap.Handle` нужного типа (live или offline) и запускает горутину, которая читает пакеты в буферизованный канал `chan gopacket.Packet` ёмкостью 1024. При отмене контекста или достижении конца файла канал закрывается.
|
|
|
|
---
|
|
|
|
## 2. Движок анализа (`internal/analyzer`)
|
|
|
|
### Назначение
|
|
Центральный компонент, который принимает пакеты и распределяет их по детекторам.
|
|
|
|
### Файлы
|
|
| Файл | Описание |
|
|
|------|----------|
|
|
| `engine.go` | Структура `Engine`, методы `Run`, `Reset`, `Stats` |
|
|
| `detector.go` | Интерфейс `Detector`, вспомогательная структура `timeWindow` |
|
|
| `portscan.go` | Детектор сканирования портов |
|
|
| `bruteforce.go` | Детектор перебора паролей |
|
|
| `dos.go` | Детектор DoS/DDoS атак |
|
|
| `arp.go` | Детектор ARP-спуфинга |
|
|
| `dns.go` | Детектор DNS-аномалий |
|
|
|
|
### Интерфейс детектора
|
|
|
|
```go
|
|
type Detector interface {
|
|
Name() string // уникальное имя
|
|
Analyze(pkt gopacket.Packet) []Alert // анализ пакета, возврат алертов
|
|
Reset() // сброс внутреннего состояния
|
|
}
|
|
```
|
|
|
|
### Sliding Window
|
|
Все детекторы используют скользящее временное окно (`timeWindow`) для хранения событий. При каждом обращении устаревшие записи автоматически удаляются:
|
|
|
|
```
|
|
Время: t-10s ... t-5s ... t-3s ... now
|
|
События: [old] [old] [keep] [keep] [keep]
|
|
↑
|
|
cutoff = now - window_size
|
|
```
|
|
|
|
### Дедупликация алертов
|
|
Каждый детектор хранит `alerted map[string]time.Time` — время последнего алерта по ключу (IP, IP:port и т.д.). Повторный алерт генерируется не чаще одного раза в 30–60 секунд на один источник.
|
|
|
|
---
|
|
|
|
## 3. Модуль хранения данных (`internal/storage`)
|
|
|
|
### Назначение
|
|
Персистентное хранение алертов, статистики пакетов и сессий захвата.
|
|
|
|
### Файлы
|
|
| Файл | Описание |
|
|
|------|----------|
|
|
| `models.go` | GORM-модели: `Alert`, `PacketStat`, `CaptureSession` |
|
|
| `db.go` | Структура `DB`, CRUD-методы, агрегирующие запросы |
|
|
|
|
### Модели данных
|
|
|
|
**Alert** — запись об обнаруженной угрозе:
|
|
```
|
|
ID | CreatedAt | Type | Severity | SrcIP | DstIP | SrcPort | DstPort | Protocol | Description | Count
|
|
```
|
|
|
|
**PacketStat** — статистика по пакетам (сохраняется каждый 10-й пакет):
|
|
```
|
|
ID | CreatedAt | Protocol | SrcIP | DstIP | Bytes
|
|
```
|
|
|
|
**CaptureSession** — сессия захвата трафика:
|
|
```
|
|
ID | CreatedAt | EndedAt | Source | Mode | Status | TotalPkts | TotalBytes
|
|
```
|
|
|
|
### Методы агрегации
|
|
| Метод | SQL-эквивалент |
|
|
|-------|---------------|
|
|
| `AlertsBySeverity()` | `SELECT severity, COUNT(*) GROUP BY severity` |
|
|
| `AlertsByType()` | `SELECT type, COUNT(*) GROUP BY type` |
|
|
| `TopSourceIPs(n)` | `SELECT src_ip, COUNT(*) GROUP BY src_ip ORDER BY count DESC LIMIT n` |
|
|
| `AlertsTimeline(h)` | `SELECT strftime('%H:00', created_at), COUNT(*) GROUP BY hour` |
|
|
|
|
---
|
|
|
|
## 4. API сервер (`internal/api`)
|
|
|
|
### Назначение
|
|
HTTP сервер на базе Gin, предоставляет REST API для фронтенда.
|
|
|
|
### Файлы
|
|
| Файл | Описание |
|
|
|------|----------|
|
|
| `server.go` | Инициализация Gin, регистрация маршрутов, CORS middleware |
|
|
| `handlers/alerts.go` | GET /api/alerts, DELETE /api/alerts, DELETE /api/alerts/:id |
|
|
| `handlers/stats.go` | GET /api/stats/summary, /timeline, /top-ips |
|
|
| `handlers/capture.go` | Управление захватом: start, stop, upload, status, sessions |
|
|
| `handlers/reports.go` | GET /api/reports/generate — скачать PDF |
|
|
|
|
### CORS
|
|
Сервер разрешает запросы с любого origin (`*`) для работы Nuxt dev-сервера на порту 3000.
|
|
|
|
### Управление состоянием захвата
|
|
`CaptureHandler` хранит указатель `active *CaptureState`, который содержит `context.CancelFunc` для остановки текущей сессии. Одновременно может быть только одна активная сессия.
|
|
|
|
---
|
|
|
|
## 5. Генератор отчётов (`internal/report`)
|
|
|
|
### Назначение
|
|
Формирование PDF-отчёта по всем накопленным данным.
|
|
|
|
### Файлы
|
|
| Файл | Описание |
|
|
|------|----------|
|
|
| `pdf.go` | Структура `Data`, функция `Generate(data) ([]byte, error)` |
|
|
|
|
### Структура отчёта
|
|
1. **Заголовок** — название системы, дата формирования, версия
|
|
2. **Метаданные сессии** — источник трафика, режим, длительность, объём
|
|
3. **Сводка по критичности** — таблица с цветовой маркировкой (критический / высокий / средний / низкий)
|
|
4. **Типы угроз** — таблица по типам обнаруженных атак
|
|
5. **Топ источников** — 10 наиболее активных IP-адресов
|
|
6. **Журнал инцидентов** — детальная таблица до 200 алертов
|
|
|
|
### Библиотека maroto v2
|
|
Grid-based компоновка: страница делится на 12 колонок, строки (`row`) содержат колонки (`col`), в колонках размещаются компоненты (`text`, `line`).
|
|
|
|
---
|
|
|
|
## 6. Фронтенд (`frontend/`)
|
|
|
|
### Назначение
|
|
Веб-панель управления для мониторинга, управления захватом и просмотра статистики.
|
|
|
|
### Структура
|
|
| Путь | Назначение |
|
|
|------|-----------|
|
|
| `pages/index.vue` | Дашборд: карточки метрик, графики, топ IP, последние алерты |
|
|
| `pages/alerts.vue` | Журнал алертов с фильтрацией и пагинацией |
|
|
| `pages/capture.vue` | Управление захватом (live + PCAP upload), история сессий |
|
|
| `pages/stats.vue` | Статистика: timeline, распределение по типам и критичности |
|
|
| `layouts/default.vue` | Боковое меню, заголовок, индикатор статуса захвата |
|
|
| `composables/useApi.ts` | Базовый HTTP клиент (get, post, del, upload) |
|
|
| `composables/useCaptureStatus.ts` | Глобальный polling статуса захвата (каждые 3 сек) |
|
|
| `components/MetricCard.vue` | Карточка числовой метрики с иконкой |
|
|
| `components/SeverityBadge.vue` | Цветной бейдж уровня критичности |
|