mahadidn/log-vulnerabilites-detection
GitHub: mahadidn/log-vulnerabilites-detection
一个基于正则表达式的轻量级日志安全监控系统,用于从多种应用日志中自动检测攻击行为并发送邮件告警。
Stars: 0 | Forks: 0
# 日志漏洞监控器
一个**基于规则的日志安全监控系统**,可自动从应用程序日志中检测攻击,将检测结果存储在数据库中,并通过 HTML 电子邮件发送警报。
## 快速开始
```
# 1. 设置
pip install pyyaml psycopg2-binary
createdb logwatcher
psql -d logwatcher -f db/schema.sql
# 2. 配置
# 编辑 config.yaml:路径、数据库凭据、邮件设置、时区
# 3. 运行
python main.py # Once
python main.py --now "2026-07-10 15:55:00" --window 20 # Simulate time
python scheduler.py # Loop every N minutes
```
## 功能
### 检测 26 种以上的攻击类型
SQL Injection、XSS、RCE、Path Traversal、Log4Shell、SSTI、XXE、NoSQL Injection、SSRF、CRLF、Deserialization、LDAP Injection、Brute Force、Web Scanning、Privilege Escalation、Destructive Actions、Scanner Detection、Reconnaissance。
### 多数据源
- **文件**:nginx、HAProxy、PostgreSQL、CodeIgniter 日志
- **数据库**:audit_trail、login_log 表
### 智能检测
- **19 条单事件规则**:针对单个事件进行模式匹配
- **2 条关联规则**:Brute Force(120 秒内同一 IP 失败 6 次)、Web Scanning(60 秒内同一 IP 进行 8 次侦察)
- **抗编码干扰**:检测 URL 编码、HTML 编码、双重编码的 payload
- **零误报**:已通过 26 种攻击和 8 种良性模式验证
### 警报路由
- **严重/高危**:立即发送紧急电子邮件(红色)
- **中危**:发送摘要电子邮件(橙色)
- **低危**:仅记录到数据库
### 数据库持久化
所有事件均存储在 `incidents` 表中,包含时间戳、来源、IP、类别、严重性、证据和原始日志。
## 系统架构
```
Log Sources → Collector → Parsers → Normalized Events
↓
┌───────────────┴────────────────┐
↓ ↓
Single-Event Rules Correlation Rules
(19 rules, detect (frequency/timeframe
patterns on 1 event) across events)
↓ ↓
└───────────────┬────────────────┘
↓
Severity Classification
↓
Alert Manager
↓
┌───────────────┼────────────────┐
↓ ↓ ↓
Database Email HTML Notifier (SMTP)
(PostgreSQL) (urgent+digest)
```
## 安装说明
### 前置条件
- Python
- PostgreSQL
- pip
### 设置步骤
```
# 1. 解压并进入目录
unzip log-watcher-fase2.zip
cd log-watcher
# 2. 安装 Python 包
pip install pyyaml psycopg2-binary
# 3. 创建数据库和 schema
createdb logwatcher
psql -d logwatcher -f db/schema.sql
# 4. (可选)加载样本数据
psql -d logwatcher -f db/seed_data.sql
```
## 配置说明 (config.yaml)
### 日志文件来源
将路径更新为您的实际日志位置:
```
sources:
- name: nginx
type: nginx
path: /var/log/nginx/access.log
- name: haproxy
type: haproxy
path: /var/log/haproxy.log
- name: sql
type: postgres
path: /var/log/postgresql/postgresql.log
- name: app
type: codeigniter
path: /var/www/html/storage/logs/app.log
```
### 数据库连接
**关键:将 `timezone` 设置为与您的日志服务器时区一致。**
```
database:
host: localhost
port: 5432
dbname: logwatcher
user: postgres
password: "YOUR-PASSWORD"
timezone: "Asia/Jakarta" # Change to your timezone!
```
示例:`"America/New_York"`、`"Europe/London"`、`"Australia/Sydney"`、`"UTC"`
### 扫描间隔
```
scan:
interval_minutes: 10 # Scan every 10 minutes
```
### 电子邮件 (SMTP)
```
email:
dry_run: false # Set to false to send real emails
host: smtp.gmail.com
port: 587
username: "your-email@gmail.com"
password: "YOUR-APP-PASSWORD" # Gmail: use 16-char App Password (not main password)
from: "your-email@gmail.com"
to: "devops@company.com"
```
## 运行系统
### 选项 1:手动扫描(测试)
```
# 使用当前实时时间扫描一次
python main.py
# 使用模拟时间扫描一次(对于测试旧日志数据很有用)
python main.py --now "2026-07-04 10:55:00" --window 1440
```
参数:
- `--now`:将此时间戳模拟为“当前时间”
- `--window`:时间窗口,以分钟为单位(1440 = 24 小时)
### 选项 2:连续循环
```
python scheduler.py # Runs every N minutes indefinitely
```
按 Ctrl+C 停止。
### 选项 3:操作系统调度程序(推荐用于生产环境)
**Linux / macOS (cron)**:
```
crontab -e
# 添加:
*/10 * * * * cd /path/to/log-watcher && python main.py >> /var/log/logwatcher.log 2>&1
```
**Windows (Task Scheduler)**:
1. 创建一个每 10 分钟运行一次 `python main.py` 的任务
2. 将工作目录设置为您的项目文件夹
3. 保存并启用
## 检测规则 (rules/rules.yaml)
### 规则类别
**19 条单事件规则**(每次对一个事件进行模式匹配):
- SQLi:堆叠查询、UNION、CHR()/CHAR()、基于时间的盲注、schema 探测
- XSS:Script 标签、事件处理器、javascript:/data:/vbscript:
- RCE:命令注入、LOLBins
- 文件攻击:Path traversal、LFI、PHP wrappers、空字节
- Recon:敏感路径(.env、.git、/wp-admin、/phpmyadmin)
- Scanner:User-Agent(sqlmap、Burp、nikto、hydra 等)
- Log4Shell:${jndi:...} JNDI 注入
- SSTI:模板注入
- XXE:XML 外部实体
- NoSQL:MongoDB 操作符
- SSRF:内部 IP / metadata
- CRLF:HTTP 响应拆分
- Deserialization:PHP/Java/.NET 对象
- LDAP:LDAP 过滤器注入
- Auth Failure 3:登录失败尝试
- 破坏性数据库操作:DELETE/TRUNCATE/DROP
- Privilege Escalation:GRANT/CREATE USER
**2 条关联规则**(跨事件聚合):
- Brute Force (id 100710):120 秒内同一 IP 失败登录 6 次以上
- Web Scanning (id 100610):60 秒内同一 IP 进行 8 次以上的侦察尝试
### 测试规则
测试单行日志:
```
python logtest.py nginx '1.2.3.4 - - [04/Jul/2026:10:00:00 +0700] "GET /login?id=1 UNION SELECT password FROM users HTTP/1.1" 200 100 "-" "Mozilla"'
```
预期输出:
```
>> MATCHES rule 100101 [sqli] level 12 (High)
evidence: UNION SELECT
```
验证所有规则(必须检测到 26 种攻击,8 种良性日志必须保持干净):
```
python test_rules.py
# 输出:检测到攻击 : 26/26
# 正常流量 : 8/8
```
## 数据库 Schema
### incidents 表
所有检测到的攻击都存储在此处:
```
SELECT event_time, source, source_ip, category, severity, evidence
FROM incidents
ORDER BY event_time DESC
LIMIT 10;
```
列:
- `detected_at`:扫描发现它的时间
- `event_time`:攻击发生的时间(来自日志时间戳)
- `source`:日志来源(nginx、postgres 等)
- `source_ip`:攻击者 IP
- `category`:攻击类型(sqli、xss、rce 等)
- `severity`:Critical / High / Medium / Low
- `level`:数字级别 (0-16)
- `evidence`:匹配的子字符串(最多 300 个字符)
- `raw_log`:完整的原始日志行
查询示例:
```
# 所有 Critical 事件
psql -d logwatcher -c "SELECT event_time, source_ip, category, evidence FROM incidents WHERE severity='Critical' ORDER BY event_time DESC LIMIT 10;"
# 按类别统计
psql -d logwatcher -c "SELECT category, count(*) FROM incidents GROUP BY category ORDER BY count DESC;"
# 来自特定 IP 的事件
psql -d logwatcher -c "SELECT * FROM incidents WHERE source_ip='203.0.113.9';"
```
## 电子邮件警报
### 格式
包含以下列的 HTML 表格:
- **严重性**(颜色标签:红色/橙色/灰色)
- **类别**(sqli、xss、rce 等)
- **来源**(nginx、postgres 等)
- **IP**(攻击者 IP)
- **事件时间**(来自日志的时间戳)
- **证据**(匹配的 payload,已截断)
- **原始日志**(完整的原始行,已截断)
### 路由
- **严重/高危**:立即发送紧急电子邮件(红色标题)
- **中危**:带摘要的摘要电子邮件(橙色标题)
- **低危**:仅记录到数据库
### 去重
相同的规则 + 相同的 IP = 每个扫描周期发送一封电子邮件(防止垃圾邮件)。
## 故障排除
### “检测到 0 个事件”
**原因**:日志时间戳不在时间窗口内。
**修复**:
1. 检查日志时间戳:`tail sample_logs/nginx.log`
2. 使用 `--now` 和 `--window` 来匹配您的日志日期:
python main.py --now "2026-07-04 10:55:00" --window 20
### “无法连接到数据库”
```
# 检查 PostgreSQL 是否正在运行
psql -h localhost -U postgres -c "SELECT 1;"
# 如果失败:
# - 启动:sudo systemctl start postgresql (Linux)
# - 在 config.yaml 中检查凭据
# - 验证数据库是否存在:psql -l | grep logwatcher
```
### “未发送电子邮件”
1. 验证 config 中的 `email.dry_run: false`
2. Gmail 用户:使用 16 字符的 **App Password**,而不是主 Gmail 密码
3. 检查 SMTP 凭据是否正确
### “规则不匹配”
```
# 测试确切的日志行
python logtest.py nginx 'YOUR-LOG-LINE-HERE'
# 如果未匹配到:
# - 针对该类别查看 rules/rules.yaml
# - 确保 regex 正确(所有均不区分大小写)
```
### 时区问题
将 `database.timezone` 设置为与您的日志服务器匹配:
```
# 检查服务器时区
date
timedatectl
```
```
database:
timezone: "Asia/Jakarta" # Update to your zone
```
## 生产环境部署检查清单
- [ ] PostgreSQL 并使用强密码(非默认密码)
- [ ] config.yaml 中的文件路径指向真实日志
- [ ] `database.timezone` 与您的服务器匹配
- [ ] 已生成并配置 Gmail App Password
- [ ] `email.dry_run: false`
- [ ] 已设置 OS scheduler(cron / Task Scheduler)
- [ ] 测试:`python main.py` 检测到您日志中的事件
- [ ] 测试:电子邮件确实到达收件箱
- [ ] 监控 `incidents` 表;如果需要,设置数据保留策略
## 进阶:添加自定义规则
1. 编辑 `rules/rules.yaml`:
```
single_rules:
- id: 101000
category: my_attack
level: 11
field: message
description: "My custom detection"
regex:
- "pattern1"
- "pattern2"
```
2. 测试:
```
python logtest.py nginx 'PAYLOAD-WITH-PATTERN1-HERE'
```
## 支持
- 报告问题:包含 config(隐藏凭据)和 `test_rules.py` 的输出
- 建议规则:首先使用 `test_rules.py` 进行测试,并提交规则定义
标签:CISA项目, Python, 云计算, 告警系统, 恶意代码分类, 插件系统, 无后门, 测试用例, 规则引擎, 逆向工具