Обнаружение вторжений на основе ML: захватываем сетевые потоки, классифицируем их моделью, обученной на CICIDS-2017, поднимаем алерты, отдаём API и живой дашборд.
⚠️ Этика / закон: запускай живой захват только в сетях, которыми владеешь или на мониторинг которых у тебя есть явное разрешение. Это защитный / образовательный проект.
flowchart LR
P[Пакеты] --> S[capture/sniffer.py]
S --> EX[features/extractor.py<br/>потоки → признаки]
EX --> PR[model/predict.py]
SCH[features/schema.py<br/>единый контракт признаков] -.-> EX
SCH -.-> PR
TR[model/train.py<br/>CICIDS-2017] --> PR
PR --> AL[alerts/engine.py]
AL --> J[(data/alerts.jsonl)]
J --> DASH[dashboard/app.py<br/>Streamlit]
PR --> API[api/main.py<br/>FastAPI]
AL --> TG[Telegram-алерты]
Весь пайплайн использует один контракт признаков (features/schema.py). Это исключает классический баг NIDS, когда модель обучена на N признаках, а обслуживает M.
cd nids-project
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# 1. Обучение на встроенной синтетике (мгновенно). Бинарно: атака / норма.
python -m model.train
# 2. Какие признаки влияют на решение модели
python -m model.explain
# 3. Поднять API
uvicorn api.main:app
# проверить:
curl -s localhost:8000/predict -H 'content-type: application/json' \
-d '{"total_fwd_packets":200,"syn_flag_count":150,"flow_duration":0.1,"fwd_pkt_len_mean":60}'
# 4. Дашборд (читает data/alerts.jsonl)
streamlit run dashboard/app.pypython -m model.train --multiclass # классы: BENIGN / PortScan / DoS ...Скачай CSV с сайта Канадского института кибербезопасности, положи в data/, затем:
python -m model.train --data data/ --multiclasstrain.py чистит кривые имена колонок, исправляет рассинхрон единиц
(микросекунды → секунды у временных признаков) и маппит колонки датасета на
единый контракт.
python -m model.explain # важности признаков (в консоль)
python -m model.explain --shap # SHAP-график -> reports/shap_summary.pngОбучение также автоматически сохраняет reports/confusion_matrix.png и (только
для бинарной) reports/roc_curve.png. Отключить — флагом --no-plots.
Терминал 1 — запустить дашборд:
streamlit run dashboard/app.pyТерминал 2 — стримить синтетические потоки через реальную модель + движок алертов:
python -m tools.simulate # Ctrl-C чтобы остановитьДашборд (Живой режим включён) обновляется раз в пару секунд: статус-баннер, KPI-карточки, таймлайн атак, разбивка по типам и топ source IP оживают по мере прихода алертов. Сначала обучи мультикласс-модель, чтобы видеть типы атак:
python -m model.train --multiclass# macOS
sudo python -m capture.sniffer --iface en0
# Linux
sudo python -m capture.sniffer --iface eth0Потоки завершаются после 15с простоя, оцениваются моделью, и атаки выше порога
уверенности пишутся в data/alerts.jsonl (и в Telegram, если настроен).
export TELEGRAM_BOT_TOKEN=... # от @BotFather
export TELEGRAM_CHAT_ID=...
export ALERT_MIN_CONFIDENCE=0.85docker compose up # api + dashboard
docker compose --profile capture up # ещё и сниффер (на Linux-хосте)| Путь | Роль |
|---|---|
features/schema.py |
единый источник правды о наборе признаков |
features/extractor.py |
пакеты → двунаправленные потоки → векторы признаков |
capture/sniffer.py |
цикл живого захвата на scapy |
model/train.py |
обучение (синтетика или CICIDS), бинарно или мультикласс |
model/predict.py |
обёртка инференса |
model/explain.py |
важности признаков + SHAP |
tools/simulate.py |
симулятор трафика для демо живых алертов |
alerts/engine.py |
порог → консоль / JSONL / Telegram |
api/main.py |
FastAPI /predict, /health |
dashboard/app.py |
живой дашборд на Streamlit |