karmakar-rahul/NetworkLogAnalytics-AI
GitHub: karmakar-rahul/NetworkLogAnalytics-AI
基于 Kafka 流式架构和机器学习的企业网络横向移动实时检测与运营分流平台。
Stars: 0 | Forks: 0
# 网络日志分析 AI
**针对企业网络的 AI 驱动横向移动检测。**
这是一个实时分析平台,用于摄取网络身份验证日志、构建行为特征,并应用无监督和有监督机器学习来检测横向移动、内部侦察和权限提升:即攻击者在初次入侵后用于在网络中渗透的技术。
该系统以完整的流式 pipeline 构建:**Kafka → Consumer → MongoDB → FastAPI → React Dashboard**,并配备一个实时更新的运营仪表板以供分流排查。
## 问题描述
横向移动是发生入侵*之后*的行为:攻击者在攻陷单个 endpoint 后,利用内部身份验证路径 —— SMB、RDP、WinRM、Kerberos 票据请求,在主机之间跳转、提升权限,并最终访问高价值目标。边界防御根本无法察觉,因为从定义上讲,这些是已经通过边界的流量。检测横向移动意味着要在数量庞大的正常日常流量中,找出极少数真正异常的身份验证模式。其中大部分流量来自 IT 管理员和服务账户,它们的合法行为表面上看起来可能与攻击者的行为非常相似。
本项目将其同时视为**无监督异常检测问题**(在没有任何标签的真实部署环境中会怎样?),以及在有标签可用时的**有监督分类问题**,并对这两种方法进行了正面比较。
## 架构
### 项目结构
```
NetworkLogAnalyticsAI/
├── producer/
│ ├── event_builder.py # Synthetic user/host/attack-chain event generation
│ ├── network_topology.py # Org structure: departments, hosts, per-user "normal" access baseline
│ └── producer.py # Kafka producer — live event stream
├── consumer/
│ ├── consumer.py # Kafka consumer — feature eng. + ML scoring + Mongo write
│ ├── feature_engineering.py # Online (real-time, wall-clock windowed) feature computation
│ ├── rules_engine.py # Anomaly score → risk level mapping
│ └── mongo_writer.py
├── ml_engine/
│ ├── feature_builder.py # Offline (chronological replay) feature computation
│ ├── train.py # Isolation Forest training + threshold calibration
│ ├── train_supervised.py # XGBoost comparison model, same train/test split
│ ├── evaluate.py # Held-out evaluation + permutation feature importance
│ ├── predict.py # Live inference (loads model.pkl/scaler.pkl/threshold.json)
│ ├── model.pkl / model_supervised.pkl
│ └── threshold.json
├── shared/
│ ├── enums.py # AuthType, LogonType, AttackType, RiskLevel, ...
│ └── schemas.py # NetworkAuthEvent and other shared dataclasses
├── database/
│ ├── collections.py
│ └── indexes.py # Index definitions, applied at API startup
├── api/
│ ├── main.py
│ ├── routes/ # dashboard.py, events.py, analytics.py
│ └── services/ # dashboard_service.py, analytics_service.py, ml_service.py
├── scripts/
│ ├── generate_synthetic_data.py # Batch historical dataset (day-spread traffic)
│ └── export_training_dataset.py # Export + feature-build directly from live Mongo data
├── datasets/
│ ├── synthetic/
│ └── processed/training_dataset.csv
├── outputs/
│ ├── metrics.json
│ └── metrics_supervised.json
└── Frontend/Dashboard/
└── src/
├── routes/ # _app.index, _app.live, _app.threats, _app.ml, _app.users, _app.system
├── components/dashboard/ # layout.tsx, primitives.tsx
└── lib/ # api.ts (typed client), queries.ts (React Query hooks)
```
**实时推理说明:** consumer 的实时评分目前仅加载 Isolation Forest 的产物(`model.pkl`、`scaler.pkl`、`threshold.json`)。XGBoost 模型在相同的留出数据集上进行训练和评估以进行比较,但尚未接入实时预测路径 —— 请参阅[路线图](#roadmap)。
## 核心功能
- **合成的真实流量生成** —— 涵盖约 950 台主机(工作站、文件服务器、应用服务器、域控制器)的 400 个模拟用户(标准/服务/管理员账户),攻击链通过主机跳转的方式进行,与真实的横向移动完全一致。
- 通过 Kafka 进行**流式摄取**,并基于真实的到达时间窗口计算在线特征工程。
- **在相同的留出数据上评估的两种机器学习方法:**
- *无监督* Isolation Forest,仅在假定为正常的流量上进行训练 —— 这是在没有确认的事件标签的真实部署中的现实场景。
- *有监督* XGBoost,基于此合成数据集中可用的真实标签进行训练 —— 这是在拥有标签数据时所能达到性能上限的评估。
- **实时运营仪表板** —— 包含六个页面,涵盖实时监控、威胁调查、模型透明度、按账户划分的风险以及基础设施健康状况,全部通过轮询 MongoDB 实时获取。
- **经过校准的可靠阈值** —— 默认情况下,阈值的选择以最大化 F1 分数为目标(而不是硬编码的精确率目标,因为这会悄无声息地导致召回率下降),并且会保存完整的精确率/召回率扫描结果以供检查。
- **真实的特征重要性** —— 在留出的测试集上计算置换重要性(Isolation Forest)和原生树重要性(XGBoost),而非伪造数据。
## 技术栈
| 层级 | 技术 |
|---|---|
| 流处理 | Apache Kafka |
| 存储 | MongoDB |
| 特征工程与机器学习 | Python, pandas, scikit-learn, XGBoost |
| API | FastAPI |
| 仪表板 | React, TanStack Start/Router, TanStack Query, Tailwind, Recharts |
| 环境 | Conda (`loganalyticsai`) |
## 快速开始
### 前置条件
- Conda
- Docker (Kafka + MongoDB)
- Node.js (用于仪表板)
### 1. 环境
```
conda create -n loganalyticsai python=3.11
conda activate loganalyticsai
pip install -r requirements.txt
```
### 2. 启动基础设施
```
docker compose up -d # Kafka + MongoDB
```
### 3. 启动流式 pipeline
```
python -m producer.producer # terminal 1
python -m consumer.consumer # terminal 2
```
### 4. 启动 API
```
uvicorn api.main:app --reload --port 8000
```
### 5. 启动仪表板
```
cd Frontend/Dashboard
npm install
npm run dev # http://localhost:8080
```
## 训练模型
```
# 从实时采集的 Mongo 数据中导出 feature dataset
python -m scripts.export_training_dataset
# 训练无监督 Isolation Forest
python -m ml_engine.train
# 训练有监督 XGBoost 对比模型(相同的 train/test split)
python -m ml_engine.train_supervised
# 在 held-out test set 上进行评估(Isolation Forest + feature importance)
python -m ml_engine.evaluate
```
这三个训练/评估脚本共享完全相同的 `train/calibration/test` 拆分(固定的 `random_state`),因此 Isolation Forest 和 XGBoost 的结果可以直接比较 —— 它们在相同的留出数据行上进行了评分。
## 仪表板
| 页面 | 用途 |
|---|---|
| **概览** | 实时摘要:事件量、异常率、风险分布、最新事件 |
| **实时监控** | 原始 Kafka 尾部数据 —— 包含实时异常分数和风险等级的每个事件 |
| **威胁分析** | 按技术划分的攻击分类、主要受攻击主机、最高风险事件 |
| **机器学习分析** | 模型性能、精确率/召回率权衡、特征重要性,以及实时的 Isolation Forest 与 XGBoost 对比 —— 自动展示当前在 F1 分数上表现更好的模型 |
| **用户行为** | 按账户划分的异常排名 |
| **系统状态** | Pipeline 健康状况 —— Kafka、MongoDB、producer、consumer、模型状态 |
## API 参考
| Endpoint | 描述 |
|---|---|
| `GET /api/summary` | 汇总计数:总事件、异常、横向移动、严重事件 |
| `GET /api/events` | 按时间戳排序的最近 N 条事件 |
| `GET /api/events/live` | 同上,针对快速轮询进行了优化 |
| `GET /api/traffic-timeline` | 过去 24 小时的每小时事件量 |
| `GET /api/risk-distribution` | 按风险等级统计的事件计数 |
| `GET /api/attack-breakdown` | 按攻击技术统计的事件计数 |
| `GET /api/top-risk-entities` | 按异常计数排名的顶级用户和主机 |
| `GET /api/ml` | Isolation Forest 评估指标 |
| `GET /api/ml/supervised` | XGBoost 评估指标(如果尚未训练则为 null) |
| `GET /api/system` | 基础设施健康状况 |
## 路线图
- [ ] 将实时推理接入并使用当前性能最佳的模型(`predict.py` + `rules_engine.py`),而不是在不管机器学习分析比较结果如何的情况下,始终使用 Isolation Forest 进行评分
- [ ] 相对特征/基于用户基线的特征(偏离用户自身的历史常态,而不仅仅是群体范围的计数),以提高在现实流量密度下的精确率
- [ ] 将 Local Outlier Factor / 自编码器作为第三种检测方法
- [ ] 真实的推理延迟遥测(系统状态目前显示的是说明性占位符)
- [ ] 用于横向移动路径的主机到主机访问图谱可视化
## 作者
* Rahul Karmakar
* (阿萨姆大学物理学硕士 | PGCP - BDA, C-DAC Chennai)
标签:Modbus, PE 加载器, 大数据, 异常检测, 插件系统, 横向移动检测, 流式处理, 目录扫描, 网络安全, 自动化攻击, 请求拦截, 软件成分分析, 逆向工具, 隐私保护