ishmeeeeet04/threat-detection-system
GitHub: ishmeeeeet04/threat-detection-system
基于 Isolation Forest 与规则引擎混合的机器学习威胁检测系统,解析身份验证日志并对异常登录行为进行威胁评分和实时告警。
Stars: 0 | Forks: 0
# 🛡️ AI 驱动的威胁检测与日志分析系统





一个全栈网络安全应用程序,它利用机器学习来分析系统身份验证日志,检测异常情况,分配威胁分数,并在交互式仪表板上显示实时安全警报。
## 🌐 在线演示
**在线 API:** https://threat-detection-system-g6nm.onrender.com
**在本地查看仪表板:**
1. 克隆此代码库
2. 按照下面的设置步骤操作
3. 使用本地服务器运行前端文件夹(请勿直接双击
HTML 文件——原因请参阅下文的第 8 步)
## 🎯 本项目的作用
本项目的工作方式类似于一个小型安全运营中心(SOC)。它读取系统登录日志,利用机器学习模型寻找可疑模式,为每个事件提供一个 0 到 100 的威胁分数,并在带有图表和警报的实时仪表板上显示所有内容。
**它可以检测到的真实威胁:**
- 暴力破解攻击(同一 IP 发起的大量失败登录尝试)
- 非工作时间登录(凌晨 2 点、3 点的可疑活动)
- 针对特权账户(针对 root 和 admin 的攻击)
- 异常 IP 活动(出现数百次的 IP)
- SSH 端口扫描和利用尝试
## 📸 截图
**仪表板概览**

**实时警报**

**实时威胁分析**

**威胁时间线**

## 📸 项目特性
| 特性 | 描述 |
|---|---|
| 日志解析 | 读取 Linux auth.log 和 CSV 日志文件 |
| 异常检测 | 基于 1000 条日志条目训练的 Isolation Forest ML 模型 |
| 威胁评分 | 为每个事件打分,范围从 0 到 100 |
| 严重级别 | LOW, MEDIUM, HIGH, CRITICAL |
| REST API | 包含 8 个 endpoint,提供所有仪表板数据 |
| 交互式仪表板 | 包含图表、警报表格、IP 分析和实时威胁推送 |
| 实时分析 | 使用表单即时分析任何日志条目 |
| 自动化测试 | 12 个 pytest 测试,覆盖所有 endpoint |
## 🛠️ 技术栈
| 层级 | 技术 | 选择原因 |
|---|---|---|
| Backend | Python + Flask | Python 拥有最好的 ML 库支持。Flask 轻量级且易于学习 |
| 机器学习 | Scikit-learn Isolation Forest | 无需标记的训练数据即可检测异常 |
| 数据库 | SQLite | 无需设置,单文件,非常适合作品集 |
| Frontend | HTML + CSS + JavaScript | 无需框架,保持简单快速 |
| 图表 | Chart.js | 交互式、轻量级,从 CDN 加载 |
| 部署 | Render | 提供 GitHub 集成的免费云托管 |
## 🧠 机器学习的工作原理
本项目的核心是一个 **Isolation Forest** 模型。以下是它具体的工作步骤:
步骤 1 — 原始日志文件
↓
步骤 2 — 日志解析器
提取内容:IP 地址、时间戳、用户名、登录状态、端口号
↓
步骤 3 — 特征工程
将所有内容转换为模型可以理解的 10 个数值特征
↓
步骤 4 — Isolation Forest 模型
在 1000 条日志条目(750 条正常,250 条可疑)上进行训练
学习正常活动的模式
将任何看起来不同的内容标记为异常
↓
步骤 5 — 威胁评分器
将原始 ML 输出转换为 0 到 100 的人类可读分数
为危险行为添加额外加分
↓
步骤 6 — 警报生成器
为分数超过 50 的任何事件创建警报
↓
步骤 7 — 仪表板
显示图表、表格和实时警报
**模型使用的 10 个特征:**
| 特征 | 捕获内容 |
|---|---|
| failed_attempts | 失败登录尝试次数 |
| hour | 登录发生的小时(0 到 23) |
| is_night_hour | 如果登录发生在午夜到凌晨 5 点之间则为 1 |
| is_root_attempt | 如果目标账户是 root 或 admin 则为 1 |
| ip_attempt_count | 此 IP 在日志中出现的次数 |
| status_numeric | 如果登录失败则为 1,如果被接受则为 0 |
| port | 连接使用的端口号 |
| is_ssh_port | 如果使用了端口 22(标准 SSH 攻击端口)则为 1 |
| fail_rate | 失败尝试次数除以 IP 总出现次数 |
| combo_score | 同时触发了多少个危险信号 |
**为什么选择 Isolation Forest?**
与其他 ML 算法不同,Isolation Forest 不需要标记数据。你不需要告诉它哪些日志是攻击,哪些是正常的。它会自动学习正常模式并标记任何异常情况。这使其非常适合现实世界的网络安全场景,因为在现实中你很少有完美标记的攻击数据。
**测量性能**
由于合成数据生成器将每个条目标记为正常或
可疑,我仅将该标签用于评估(从不用于训练,
因为 Isolation Forest 是无监督的)。在生成的数据集上测量:
- Precision:0.87(87% 的标记警报是真实攻击)
- Recall:1.00(100% 的真实攻击被捕获)
- F1 score:0.93
- False positive rate:4.9%
## **已知限制:** 模型的 contamination 参数设置为 0.25,
与此生成器的已知攻击比例相匹配。在真实部署中,你
事先不会知道这个数字,因此该数字是一个受控的
基准,而非对现实世界准确性的声明。评分是 ML 模型的异常信号与基于规则的启发式算法
(失败尝试阈值、非工作时间登录、针对 root)的 50/50 混合,
并且 API 会单独公开这两个组件,以便分析师可以了解
为什么某些内容被标记,而不仅仅是知道它被标记了。
## 📁 项目结构
threat-detection-system/
│
├── backend/ # Flask API 服务器
│ ├── app.py # 应用工厂
│ ├── models/ # 已保存的 ML 模型文件 (.pkl)
│ ├── routes/
│ │ └── api.py # 所有 8 个 API endpoint
│ └── utils/
│ ├── database.py # SQLite 数据库辅助工具
│ ├── features.py # 特征工程函数
│ └── log_parser.py # 解析 auth.log 和 CSV 文件
│
├── ml/ # 机器学习 pipeline
│ ├── train_model.py # 完整训练 pipeline 脚本
│ ├── detector.py # 实时检测类
│ └── threat_scorer.py # 0 到 100 威胁分数计算器
│
├── data/ # 数据文件
│ ├── generate_logs.py # 生成 1000 条真实日志条目
│ ├── sample_logs.csv # 生成的数据集
│ ├── auth.log # Linux auth.log 格式样本
│ └── scored_logs.csv # 添加了 ML 威胁分数的日志
│
├── frontend/ # 仪表板 UI
│ ├── index.html # 主仪表板页面
│ ├── style.css # 暗色网络安全主题
│ └── dashboard.js # Chart.js 图表和 API 调用
│
├── tests/
│ └── test_api.py # 12 个自动化 pytest 测试
│
├── Procfile # 告诉 Render 如何启动应用
├── render.yaml # Render 部署配置
├── startup.py # 在服务器启动前运行设置
├── requirements.txt # 所有 Python 依赖项
## └── README.md # 本文件
## ⚙️ 本地设置和安装
请严格按照以下步骤在你的计算机上运行该项目。
### 前置要求
- Python 3.11 或更高版本
- Git
- VS Code(推荐)
### 分步说明
**1. 克隆代码库**
```
git clone https://github.com/YOUR-USERNAME/threat-detection-system.git
cd threat-detection-system
```
**2. 创建虚拟环境**
```
python -m venv venv
```
**3. 激活虚拟环境**
Windows:
```
venv\Scripts\activate.bat
```
Mac 或 Linux:
```
source venv/bin/activate
```
你将看到终端行首出现 `(venv)`。
**4. 安装所有依赖项**
```
pip install -r requirements.txt
```
**5. 生成样本日志数据**
```
python data/generate_logs.py
```
这将创建 1000 条真实的日志条目,包括正常登录和模拟攻击。
**6. 训练机器学习模型**
```
python ml/train_model.py
```
这将训练 Isolation Forest 模型并将其保存到 `backend/models/`。
**7. 启动 Flask API 服务器**
```
python backend/app.py
```
服务器将在 `http://127.0.0.1:5000` 启动
**8. 运行并打开仪表板**
API 仅接受来自 `http://127.0.0.1:5500` 的浏览器请求(请参阅
`backend/app.py` 中的 CORS 配置)。双击打开 `index.html` 将无效,
因为浏览器加载本地文件时没有
真实的来源,请求会被静默阻止。
相反,打开一个**新终端窗口**(将 Flask 服务器留在另一个窗口中继续运行),
进入 frontend 文件夹,并启动一个小型
本地服务器:
```
cd frontend
python -m http.server 5500
```
现在在浏览器中打开:
```http://127.0.0.1:5500/index.html```
`dashboard.js` 中的仪表板 `API` 变量已经指向
实时部署的后端,因此无论你的本地 Flask
服务器是否运行,它都能正常工作。如果你想让它与你的*本地*后端
通信,请将 `dashboard.js` 顶部的 `API` 常量更改为
`http://127.0.0.1:5000`。
## 🔌 API Endpoint
基础 URL (本地): `http://127.0.0.1:5000`
基础 URL (在线): `https://threat-detection-system-g6nm.onrender.com`
| 方法 | Endpoint | 描述 |
|---|---|---|
| GET | `/` | 健康检查,返回 API 信息 |
| GET | `/api/stats` | 仪表板的汇总统计数据 |
| GET | `/api/logs` | 带有威胁分数的所有日志条目 |
| GET | `/api/alerts` | 仅显示 HIGH 和 CRITICAL 警报 |
| GET | `/api/threats/timeline` | 按小时分组的威胁计数 |
| GET | `/api/threats/top-ips` | 前 10 个最可疑的 IP |
| POST | `/api/analyse` | 分析单个日志条目 |
| POST | `/api/reload` | 无需重启服务器即可重新加载已训练的模型和配置 |
### 查询参数
GET /api/logs?limit=50 返回 50 条条目
GET /api/logs?level=HIGH 仅返回 HIGH 威胁条目
GET /api/logs?limit=20&level=CRITICAL 组合过滤器
### POST 请求示例
```
POST /api/analyse
{
"ip_address" : "45.33.32.156",
"username" : "root",
"status" : "Failed",
"failed_attempts" : 40,
"port" : 22,
"hour" : 3
}
```
### POST 响应示例
```
{
"success": true,
"input": {
"ip_address" : "45.33.32.156",
"username" : "root",
"status" : "Failed",
"failed_attempts" : 40,
"port" : 22,
"hour" : 3
},
"result": {
"threat_score" : 98,
"threat_level" : "CRITICAL",
"threat_color" : "#7c3aed",
"is_anomaly" : 1
}
}
```
### GET /api/stats 响应示例
```
{
"success": true,
"data": {
"total_logs" : 1000,
"total_anomalies" : 252,
"total_alerts" : 300,
"suspicious_ips" : 15,
"avg_threat_score" : 34.2,
"max_threat_score" : 100,
"threat_levels": {
"LOW" : 520,
"MEDIUM" : 180,
"HIGH" : 180,
"CRITICAL" : 120
}
}
}
```
## 🧪 运行测试
```
pytest tests/test_api.py -v
```
**预期输出:**
tests/test_api.py::test_home PASSED
tests/test_api.py::test_stats PASSED
tests/test_api.py::test_get_logs PASSED
tests/test_api.py::test_get_logs_filtered PASSED
tests/test_api.py::test_get_alerts PASSED
tests/test_api.py::test_get_timeline PASSED
tests/test_api.py::test_get_top_ips PASSED
tests/test_api.py::test_analyse_critical PASSED
tests/test_api.py::test_analyse_safe PASSED
tests/test_api.py::test_analyse_missing_fields PASSED
tests/test_api.py::test_threat_scorer PASSED
tests/test_api.py::test_log_parser PASSED
12 passed in 3.45s
**每个测试涵盖的内容:**
| 测试 | 检查内容 |
|---|---|
| test_home | API 正在运行并返回 200 |
| test_stats | 所有统计字段都存在且 total_logs > 0 |
| test_get_logs | 返回非空的日志列表 |
| test_get_logs_filtered | 级别过滤器仅返回该级别 |
| test_alerts | 响应中仅包含 HIGH 和 CRITICAL |
| test_get_timeline | 准确返回 24 个条目 |
| test_get_top_ips | 最多返回 10 个 IP |
| test_analyse_critical | 暴力破解得分 HIGH 或 CRITICAL |
| test_analyse_safe | 正常登录得分低于 50 |
| test_analyse_missing_fields | 对错误输入返回 400 |
| test_threat_scorer | 评分器返回正确的级别 |
| test_log_parser | 解析器正确从 CSV 加载数据 |
## 🔒 检测到的安全威胁
| 攻击类型 | 检测方法 |
|---|---|
| 暴力破解攻击 | 来自同一 IP 地址的高 failed_attempts |
| 非工作时间访问 | 标记午夜到凌晨 5 点之间的登录 |
| 权限提升 | 针对以 root 和 admin 账户为目标的尝试 |
| SSH 利用 | 端口 22 上的活动伴有失败尝试 |
| 异常 IP 行为 | IP 出现频率远高于平均值 |
| 组合攻击模式 | 多个危险信号被同时评分 |
## 🚀 在 Render 上部署
本项目部署在 Render 免费层上。
**部署工作原理:**
1. 代码被推送到 GitHub
2. Render 自动检测推送
3. `startup.py` 运行并生成数据、训练模型、设置数据库
4. `gunicorn` 启动 Flask API 服务器
5. API 在 Render URL 上线
**使用的 Render 设置:**
| 设置 | 值 |
|---|---|
| Runtime | Python 3 |
| 构建命令 | `pip install -r requirements.txt` |
| 启动命令 | `python startup.py && gunicorn backend.app:create_app --bind 0.0.0.0:$PORT` |
## 📄 许可证
MIT 许可证
版权所有 2026 Ishmeet Kaur
特此免费授予任何获得本软件副本的人使用、复制、修改、合并、发布、分发和再许可的权利,前提是上述版权声明出现在所有副本中。
本软件按“原样”提供,不提供任何形式的保证。
## 🙏 致谢
- [Scikit-learn](https://scikit-learn.org/) 提供 Isolation Forest 实现
- [Chart.js](https://www.chartjs.org/) 提供仪表板可视化
- [Flask](https://flask.palletsprojects.com/) 提供轻量级 Web 框架
- [Render](https://render.com/) 提供免费云部署
- [Faker](https://faker.readthedocs.io/) 提供逼真的样本数据生成
## 👤 作者
Ishmeet Kaur
- GitHub: https://github.com/ishmeeeeet04
标签:AMSI绕过, Apex, Flask, Python, 威胁检测, 安全规则引擎, 安全运营, 异常检测, 扫描框架, 无后门, 机器学习, 逆向工具