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, 云计算, 告警系统, 恶意代码分类, 插件系统, 无后门, 测试用例, 规则引擎, 逆向工具