ishmeeeeet04/threat-detection-system

GitHub: ishmeeeeet04/threat-detection-system

基于 Isolation Forest 与规则引擎混合的机器学习威胁检测系统,解析身份验证日志并对异常登录行为进行威胁评分和实时告警。

Stars: 0 | Forks: 0

# 🛡️ AI 驱动的威胁检测与日志分析系统 ![Python](https://img.shields.io/badge/Python-3.11+-blue?style=flat-square) ![Flask](https://img.shields.io/badge/Flask-3.0-green?style=flat-square) ![ML](https://img.shields.io/badge/ML-Isolation%20Forest-orange?style=flat-square) ![Tests](https://img.shields.io/badge/Tests-12%20Passing-brightgreen?style=flat-square) ![License](https://img.shields.io/badge/License-MIT-purple?style=flat-square) 一个全栈网络安全应用程序,它利用机器学习来分析系统身份验证日志,检测异常情况,分配威胁分数,并在交互式仪表板上显示实时安全警报。 ## 🌐 在线演示 **在线 API:** https://threat-detection-system-g6nm.onrender.com **在本地查看仪表板:** 1. 克隆此代码库 2. 按照下面的设置步骤操作 3. 使用本地服务器运行前端文件夹(请勿直接双击 HTML 文件——原因请参阅下文的第 8 步) ## 🎯 本项目的作用 本项目的工作方式类似于一个小型安全运营中心(SOC)。它读取系统登录日志,利用机器学习模型寻找可疑模式,为每个事件提供一个 0 到 100 的威胁分数,并在带有图表和警报的实时仪表板上显示所有内容。 **它可以检测到的真实威胁:** - 暴力破解攻击(同一 IP 发起的大量失败登录尝试) - 非工作时间登录(凌晨 2 点、3 点的可疑活动) - 针对特权账户(针对 root 和 admin 的攻击) - 异常 IP 活动(出现数百次的 IP) - SSH 端口扫描和利用尝试 ## 📸 截图 **仪表板概览** ![仪表板概览](https://raw.githubusercontent.com/ishmeeeeet04/threat-detection-system/main/docs/screenshots/dashboard-overview.png) **实时警报** ![警报表格](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/2514a8d8af212804.png) **实时威胁分析** ![实时分析](https://raw.githubusercontent.com/ishmeeeeet04/threat-detection-system/main/docs/screenshots/live-analysis.png) **威胁时间线** ![威胁时间线](https://raw.githubusercontent.com/ishmeeeeet04/threat-detection-system/main/docs/screenshots/threat-timeline.png) ## 📸 项目特性 | 特性 | 描述 | |---|---| | 日志解析 | 读取 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, 威胁检测, 安全规则引擎, 安全运营, 异常检测, 扫描框架, 无后门, 机器学习, 逆向工具