aliloumak26/Python-SIEM
GitHub: aliloumak26/Python-SIEM
这是一个基于 Python 的轻量级实时 SIEM 系统,集成了 RegEx 签名与机器学习混合检测、日志加密及可视化仪表板,用于网络安全监控与威胁分析。
Stars: 10 | Forks: 1
# Python SIEM -- 实时入侵检测系统
一个用 Python 构建的安全信息和事件管理 (SIEM) 系统。本项目提供实时网络流量监控、多引擎威胁检测(RegEx 签名 + 人工智能)、全日志加密,以及带有全球威胁地图的现代化图形仪表板。
## 目录
1. [总体架构](#general-architecture)
2. [核心功能](#key-features)
3. [项目结构](#project-structure)
4. [前置条件与安装](#prerequisites-and-installation)
5. [配置](#configuration)
6. [使用方法](#usage)
7. [检测引擎](#detection-engines)
8. [机器学习](#machine-learning)
9. [日志加密](#log-encryption)
10. [地理位置](#geolocation)
11. [数据库](#database)
12. [攻击生成器](#attack-generator)
13. [技术栈](#technology-stack)
## 总体架构
```
Network Logs (encrypted)
|
v
+---------------------+
| Decryption | utils/dechiffrer.py (Fernet AES-128-CBC)
+---------------------+
|
v
+---------------------+ +---------------------+
| 11 RegEx Detectors | ----> | Alert Manager |
| (detectors/) | | (core/) |
+---------------------+ +---------------------+
| |
v v
+---------------------+ +---------------------+
| ML Model | | Database |
| Isolation Forest | | SQLite (siem.db) |
+---------------------+ +---------------------+
| |
+---------------+---------------+
|
v
+---------------------+
| Dashboard GUI |
| PySide6 + Folium |
+---------------------+
```
## 核心功能
- **混合检测**:结合 11 个基于签名的检测器 (RegEx) 和一个机器学习模型 (Isolation Forest),以识别已知和未知威胁。
- **全加密**:所有日志在写入磁盘之前,均通过 Fernet (cryptography 库) 使用 AES 进行加密。分析期间会即时执行解密。
- **地理位置**:使用 MaxMind GeoLite2-City 数据库(国家、城市、GPS 坐标)定位源 IP 地址,并通过 AbuseIPDB API 进行信誉检查。
- **现代 GUI**:实时仪表板,包含统计卡片、警报表、Top 5 国家图表、Top 10 IP 列表以及交互式世界地图 (Folium + CartoDB dark_matter)。
- **持久化**:所有警报均存储在 SQLite 数据库中,包含严重性级别、ML 分数、地理位置数据和时间戳。
- **内置攻击生成器**:模拟恶意流量(基于签名和行为),用于演示和测试。
## 项目结构
```
Python-SIEM/
|
|-- dashboard_gui.py # Main entry point (Graphical Interface)
|-- attacks_generator.py # Malicious traffic generator for testing
|-- geo_finder.py # Geolocation module (GeoLite2-City)
|-- requirements.txt # Python dependencies
|-- .env # Environment variables (keys, paths)
|-- chiffred.enc # Encrypted log file (generated at runtime)
|-- siem.db # SQLite database (generated at runtime)
|
|-- config/
| |-- settings.py # Configuration loader (.env)
|
|-- core/
| |-- alert_manager.py # Alert manager (severity, geo, DB)
| |-- database.py # SQLite data access layer
|
|-- detectors/ # 11 signature-based detection engines
| |-- sqli.py # SQL Injection
| |-- xss.py # Cross-Site Scripting (XSS)
| |-- bruteforce.py # Brute Force
| |-- csrf.py # Cross-Site Request Forgery (CSRF)
| |-- crlf.py # CRLF Injection
| |-- nosql.py # NoSQL Injection
| |-- os_injection.py # OS Command Injection
| |-- traversal.py # Path Traversal
| |-- file_upload.py # Malicious File Upload
| |-- HTTP.py # HTTP Scanner Detection
| |-- ip.py # IP Reputation (AbuseIPDB)
|
|-- ml/ # Machine Learning module (see ml/README.md)
| |-- anomaly_detector.py # Anomaly detector (Isolation Forest)
| |-- train.py # Training script
| |-- anomaly_model.pkl # Serialized model (pre-trained)
| |-- scaler.pkl # Serialized scaler (StandardScaler)
|
|-- utils/
| |-- chiffrer.py # Fernet encryption (AES)
| |-- dechiffrer.py # Fernet decryption
| |-- normalize.py # Log normalization
|
|-- data/
| |-- GeoLite2-City.mmdb # MaxMind geolocation database
|
|-- logs/
|-- alerts.log # Alert log file (plain text)
```
## 前置条件与安装
### 前置条件
- Python 3.10 或更高版本
- pip (Python 包管理器)
- GeoLite2-City 数据库(放置在 `data/` 目录下的 `.mmdb` 文件)
### 安装
```
# Clone the repository
git clone
cd Python-SIEM
# Create a virtual environment (recommended)
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # Linux / macOS
# Install dependencies
pip install -r requirements.txt
# Configure environment variables
# Edit the .env file (see Configuration section)
# Launch the dashboard
python dashboard_gui.py
```
ML 模型随附 **预训练** 文件 (`ml/anomaly_model.pkl`)。仪表板会在启动时自动加载它。如果您希望使用新数据重新训练模型,请手动运行 `python ml/train.py`。
## 配置
项目根目录下的 `.env` 文件包含以下变量:
| 变量 | 描述 | 必填 |
|------------------|----------------------------------------|:------:|
| `FERNET_KEY` | Fernet 加密密钥 (base64, 32 字节) | 是 |
| `CHIFFRED_PATH` | 加密日志文件的路径 | 否 |
| `API_KEY` | 用于 IP 信誉查询的 AbuseIPDB API 密钥 | 是 |
生成 Fernet 密钥:
```
from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())
```
## 使用方法
### 启动仪表板
```
python dashboard_gui.py
```
界面启动后会自动监控 `chiffred.enc` 文件。每条新的加密行都会被解密,由所有 11 个检测器和 ML 模型进行分析,然后实时显示。
### 启动攻击生成器
在仪表板中,点击控制栏中的 **Start** 按钮。生成器会模拟各种攻击(SQL 注入、XSS、暴力破解、CSRF、行为异常等),并将加密日志写入 `chiffred.enc`。
### 筛选警报
**Filter** 下拉菜单允许选择特定的攻击类型,以仅显示匹配的警报。
## 检测引擎
`detectors/` 目录包含 11 个独立的检测引擎,每个引擎专用于特定类型的威胁:
| 检测器 | 文件 | 检测方法 |
|-------------------|---------------------|-----------------------------------------------------------------------|
| SQL 注入 | `sqli.py` | 40+ RegEx 模式 (UNION, DROP, 堆叠查询等) |
| XSS | `xss.py` | HTML/JavaScript 模式 (script, onerror, onload 等) |
| 暴力破解 | `bruteforce.py` | 失败登录尝试的频率分析 |
| CSRF | `csrf.py` | 缺失 CSRF token 或检测可疑 referer |
| CRLF 注入 | `crlf.py` | 头部中的 %0d%0a 序列和回车符 |
| NoSQL 注入 | `nosql.py` | MongoDB 运算符 ($gt, $ne, $where, $regex) |
| OS 命令注入 | `os_injection.py` | 系统命令 (whoami, cat, ls, 管道, 反引号) |
| 路径遍历 | `traversal.py` | ../ 序列和敏感文件访问 |
| 文件上传 | `file_upload.py` | 危险扩展名 (.php, .exe, .jsp, 双重扩展名) |
| HTTP 扫描器 | `HTTP.py` | 扫描工具 User-Agents (sqlmap, Nikto, Nmap, DirBuster) |
| IP 信誉 | `ip.py` | 带缓存的 AbuseIPDB API(可配置的置信度阈值) |
每个检测器都公开一个 `detect(line)` 函数,该函数返回一个元组 `(found: bool, patterns: list, attack_type: str)`。
## 机器学习
`ml/` 模块集成了一个基于 scikit-learn 中 **Isolation Forest** 算法的异常检测器。这个补充引擎能够检测绕过 RegEx 签名的未知或混淆攻击。
该模型从每个 HTTP 请求中提取 13 个特征(长度、Shannon 熵、特殊字符比率、已知模式匹配等),并分配一个 0 到 1 之间的异常分数。
模型 **经过预训练并随项目提供**。仪表板在启动时会自动加载它——无需手动训练步骤。
有关 ML 架构、训练流程和性能指标的更多详细信息,请参阅专用文档:[ml/README.md](ml/README.md)。
## 日志加密
所有日志均使用 `cryptography` 库中的 **Fernet** 算法 (AES-128-CBC + HMAC-SHA256) 进行加密。
- **加密** (`utils/chiffrer.py`):每条日志行都被单独加密并追加到 `chiffred.enc` 文件中。
- **解密** (`utils/dechiffrer.py`):仪表板会即时解密每一行,以便进行分析和显示。
- **密钥**:存储在 `.env` 文件的 `FERNET_KEY` 变量中。
此机制确保了存储在磁盘上的日志的机密性,即使在文件系统受损的情况下也是如此。
## 地理位置
源 IP 地理位置依赖两个组件:
1. **GeoLite2-City** (MaxMind):本地数据库 (`data/GeoLite2-City.mmdb`),为每个 IP 提供国家、城市和 GPS 坐标。会对坐标应用轻微抖动,以防止在地图上出现视觉重叠。

2. **AbuseIPDB** (API):外部 IP 信誉服务。置信度分数 (0-100%) 会与可配置的阈值(默认:50%)进行比较。一小时的本地缓存可防止重复的 API 调用。
## 数据库
`siem.db` 文件 (SQLite) 会在首次启动时自动生成。它包含:
- **alerts 表**:时间戳、攻击类型、检测到的模式、源 IP、严重性 (critical/high/medium/low)、ML 分数、地理位置数据(国家、城市、坐标)、原始日志行。
- **honeypot_logs 表**:服务、源 IP、端口、尝试的凭据、执行的命令。
`Database` 类 (`core/database.py`) 提供插入、查询(最近警报、顶级攻击者、时间线、地理位置数据)和维护(清除超过 30 天的数据)的方法。
## 攻击生成器
`attacks_generator.py` 文件模拟真实的网络流量,包括:
- **基于签名的攻击**:可被 RegEx 检测到的 Payload(SQL 注入、XSS、CSRF、CRLF、路径遍历、NoSQL 注入、OS 命令注入、HTTP 扫描器、文件上传)。
- **行为攻击**:旨在绕过 RegEx 且仅能被 ML 模型检测到的混淆 Payload(高熵、非标准编码、大量 Payload、原型污染)。
- **正常流量**:合法的 HTTP 请求,以保持现实的比例。
这三种类别的分布是平衡的(各占 33%)。
## 技术栈
| 组件 | 技术 |
|----------------------|---------------------------------------|
| 语言 | Python 3.10+ |
| 图形界面 | PySide6 (Qt6) |
| 地图 | Folium + CartoDB dark_matter |
| 机器学习 | scikit-learn (Isolation Forest) |
| 加密 | cryptography (Fernet / AES) |
| 地理位置 | geoip2 (MaxMind GeoLite2-City) |
| IP 信誉 | AbuseIPDB (REST API) |
| 数据库 | SQLite3 |
| 配置 | python-dotenv |
## 许可证
学术项目。保留所有权利。
标签:AbuseIPDB, AES加密, AMSI绕过, Apex, GUI, IP地理位置, Isolation Forest, PySide6, Python, SQLite, WSL, 仪表盘, 入侵检测系统, 威胁地图, 威胁情报, 威胁检测, 孤立森林, 安全数据湖, 开发者工具, 开源安全工具, 异常检测, 无后门, 日志加密, 机器学习, 混合检测, 网络安全, 网络安全运营, 网络流量分析, 逆向工具, 逆向工程平台, 隐私保护