Initial commit
This commit is contained in:
@@ -0,0 +1,249 @@
|
||||
# DIP-IDS — Система обнаружения вторжений на основе анализа сетевого трафика
|
||||
|
||||
Дипломная практическая работа. Сетевая IDS с веб-панелью управления и генерацией PDF-отчётов.
|
||||
|
||||
---
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
### Требования
|
||||
|
||||
| Компонент | Версия |
|
||||
|-----------|--------|
|
||||
| Go | ≥ 1.22 |
|
||||
| Bun | ≥ 1.1 |
|
||||
| libpcap | любая |
|
||||
| Linux | — |
|
||||
|
||||
```bash
|
||||
# Debian/Ubuntu
|
||||
sudo apt install libpcap-dev gcc
|
||||
|
||||
# Arch
|
||||
sudo pacman -S libpcap gcc
|
||||
```
|
||||
|
||||
### Бэкенд
|
||||
|
||||
```bash
|
||||
cd /path/to/dip-ids
|
||||
go mod tidy
|
||||
go build -o nids ./cmd/ids
|
||||
sudo ./nids # sudo нужен для live-захвата
|
||||
```
|
||||
|
||||
По умолчанию API поднимается на `http://0.0.0.0:8080`.
|
||||
|
||||
### Фронтенд (dev)
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
bun install
|
||||
bun run dev # http://localhost:3000
|
||||
```
|
||||
|
||||
Nuxt автоматически проксирует `/api/*` → `localhost:8080`.
|
||||
|
||||
### Сборка для продакшена
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
bun run generate # статические файлы в frontend/.output/public/
|
||||
```
|
||||
|
||||
Готовые файлы можно раздавать любым статическим сервером или встроить в Go-бинарник через `//go:embed`.
|
||||
|
||||
---
|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ Nuxt 3 Frontend │
|
||||
│ Dashboard · Alerts · Capture · Stats │
|
||||
│ Nuxt UI · Chart.js · vue-chartjs │
|
||||
└─────────────────────────┬────────────────────────────────────┘
|
||||
│ HTTP / REST API
|
||||
┌─────────────────────────▼────────────────────────────────────┐
|
||||
│ Go Backend │
|
||||
│ │
|
||||
│ ┌──────────┐ ┌──────────────┐ ┌──────────────────────┐ │
|
||||
│ │ Capture │──▶│ Engine │──▶│ Storage │ │
|
||||
│ │ │ │ │ │ SQLite (GORM) │ │
|
||||
│ │ Live │ │ PortScan │ └──────────────────────┘ │
|
||||
│ │ PCAP │ │ BruteForce │ │
|
||||
│ └──────────┘ │ DoS │ ┌──────────────────────┐ │
|
||||
│ │ ARPSpoof │──▶│ PDF Report │ │
|
||||
│ │ DNSAnomaly │ │ (maroto v2) │ │
|
||||
│ └──────────────┘ └──────────────────────┘ │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## REST API
|
||||
|
||||
### Алерты
|
||||
|
||||
| Метод | Путь | Описание |
|
||||
|----------|--------------------|-------------------------------------|
|
||||
| `GET` | `/api/alerts` | Список алертов (фильтрация, пагинация) |
|
||||
| `DELETE` | `/api/alerts` | Удалить все алерты |
|
||||
| `DELETE` | `/api/alerts/:id` | Удалить алерт по ID |
|
||||
|
||||
**Параметры GET `/api/alerts`:**
|
||||
|
||||
| Параметр | Тип | Описание |
|
||||
|-------------|--------|---------------------------------------|
|
||||
| `type` | string | Тип атаки (port_scan, brute_force...) |
|
||||
| `severity` | string | Уровень (critical, high, medium, low) |
|
||||
| `src_ip` | string | IP-адрес источника |
|
||||
| `page` | int | Номер страницы (по умолч. 1) |
|
||||
| `page_size` | int | Размер страницы (по умолч. 50) |
|
||||
|
||||
### Статистика
|
||||
|
||||
| Метод | Путь | Описание |
|
||||
|-------|-------------------------|----------------------------------|
|
||||
| `GET` | `/api/stats/summary` | Сводка: total, by_severity, by_type |
|
||||
| `GET` | `/api/stats/timeline` | Алерты по часам (`?hours=24`) |
|
||||
| `GET` | `/api/stats/top-ips` | Топ источников (`?limit=10`) |
|
||||
|
||||
### Захват
|
||||
|
||||
| Метод | Путь | Описание |
|
||||
|--------|----------------------------|---------------------------------|
|
||||
| `GET` | `/api/capture/interfaces` | Список сетевых интерфейсов |
|
||||
| `GET` | `/api/capture/status` | Статус текущей сессии |
|
||||
| `GET` | `/api/capture/sessions` | История сессий |
|
||||
| `POST` | `/api/capture/start` | Начать live-захват |
|
||||
| `POST` | `/api/capture/stop` | Остановить захват |
|
||||
| `POST` | `/api/capture/upload` | Загрузить и анализировать PCAP |
|
||||
|
||||
**POST `/api/capture/start` body:**
|
||||
```json
|
||||
{ "interface": "eth0" }
|
||||
```
|
||||
|
||||
### Отчёты
|
||||
|
||||
| Метод | Путь | Описание |
|
||||
|-------|-------------------------|---------------------|
|
||||
| `GET` | `/api/reports/generate` | Скачать PDF-отчёт |
|
||||
|
||||
---
|
||||
|
||||
## Конфигурация
|
||||
|
||||
Файл `configs/config.yaml`:
|
||||
|
||||
```yaml
|
||||
server:
|
||||
host: "0.0.0.0"
|
||||
port: 8080
|
||||
|
||||
database:
|
||||
path: "nids.db" # путь к SQLite файлу
|
||||
|
||||
capture:
|
||||
default_interface: "eth0"
|
||||
snaplen: 65535
|
||||
promiscuous: true
|
||||
|
||||
detectors:
|
||||
port_scan:
|
||||
enabled: true
|
||||
threshold: 15 # уникальных портов за window_seconds
|
||||
window_seconds: 10
|
||||
severity: "high"
|
||||
|
||||
brute_force:
|
||||
enabled: true
|
||||
threshold: 10 # попыток подключения за window_seconds
|
||||
window_seconds: 30
|
||||
severity: "critical"
|
||||
ports: [22, 21, 23, 3389, 5900, 25, 110, 143]
|
||||
|
||||
dos:
|
||||
enabled: true
|
||||
pps_threshold: 1000 # пакетов в секунду
|
||||
window_seconds: 1
|
||||
severity: "critical"
|
||||
|
||||
arp_spoof:
|
||||
enabled: true
|
||||
severity: "critical"
|
||||
|
||||
dns_anomaly:
|
||||
enabled: true
|
||||
max_label_length: 50 # макс. длина DNS-метки
|
||||
query_threshold: 200 # запросов за window_seconds
|
||||
window_seconds: 60
|
||||
severity: "medium"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Алгоритмы обнаружения
|
||||
|
||||
### Port Scan (Сканирование портов)
|
||||
|
||||
Детектор ведёт таблицу `srcIP → {dstPort → []timestamp}`. Для каждого входящего TCP SYN-пакета регистрируется новое обращение к порту назначения. Устаревшие записи (старше `window_seconds`) удаляются (sliding window). Если количество уникальных портов назначения превышает `threshold` — генерируется алерт.
|
||||
|
||||
### Brute Force (Перебор паролей)
|
||||
|
||||
Мониторятся только соединения к портам из списка `ports` (SSH, FTP, RDP и др.). Счётчик SYN-пакетов от одного источника к одному порту назначения ведётся в скользящем окне. Превышение `threshold` за `window_seconds` — алерт.
|
||||
|
||||
### DoS/DDoS
|
||||
|
||||
Считается общий поток пакетов от каждого источника в окне `window_seconds`. При превышении `pps_threshold` пакетов в секунду генерируется алерт категории `critical`.
|
||||
|
||||
### ARP Spoofing
|
||||
|
||||
Ведётся таблица соответствия `IP → MAC`. При получении ARP Reply проверяется, не изменился ли MAC для уже известного IP-адреса. Изменение MAC — признак подмены ARP-записей (Man-in-the-Middle).
|
||||
|
||||
### DNS Anomaly
|
||||
|
||||
Два сценария:
|
||||
1. **DNS-туннелирование** — проверяется длина каждой метки в имени запроса. Метка длиннее `max_label_length` символов — подозрение на туннелирование данных через DNS.
|
||||
2. **Высокая частота** — если один хост генерирует более `query_threshold` DNS-запросов за `window_seconds` — алерт.
|
||||
|
||||
---
|
||||
|
||||
## Структура проекта
|
||||
|
||||
```
|
||||
dip-ids/
|
||||
├── cmd/ids/main.go # точка входа
|
||||
├── internal/
|
||||
│ ├── config/config.go # загрузка конфигурации
|
||||
│ ├── storage/
|
||||
│ │ ├── models.go # GORM модели
|
||||
│ │ └── db.go # CRUD операции
|
||||
│ ├── capture/capture.go # live и pcap захват
|
||||
│ ├── analyzer/
|
||||
│ │ ├── engine.go # основной движок
|
||||
│ │ ├── detector.go # интерфейс детектора
|
||||
│ │ ├── portscan.go
|
||||
│ │ ├── bruteforce.go
|
||||
│ │ ├── dos.go
|
||||
│ │ ├── arp.go
|
||||
│ │ └── dns.go
|
||||
│ ├── api/
|
||||
│ │ ├── server.go # Gin HTTP сервер
|
||||
│ │ └── handlers/ # обработчики маршрутов
|
||||
│ └── report/pdf.go # генерация PDF (maroto v2)
|
||||
├── frontend/ # Nuxt 3 + Nuxt UI
|
||||
│ ├── pages/
|
||||
│ │ ├── index.vue # дашборд
|
||||
│ │ ├── alerts.vue # журнал алертов
|
||||
│ │ ├── capture.vue # управление захватом
|
||||
│ │ └── stats.vue # статистика
|
||||
│ ├── components/
|
||||
│ ├── composables/
|
||||
│ ├── layouts/default.vue
|
||||
│ ├── nuxt.config.ts
|
||||
│ └── package.json
|
||||
├── configs/config.yaml
|
||||
└── README.md
|
||||
```
|
||||
Reference in New Issue
Block a user