filipemorasca/log-anomaly-detector

GitHub: filipemorasca/log-anomaly-detector

一个基于pandas的轻量级日志异常检测器,用于快速识别SSH和nginx日志中的攻击模式。

Stars: 0 | Forks: 0

# 📊 日志异常检测器 [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/) [![许可证: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) ## 🎯 问题所在 暴露在互联网上的服务器每天都会收到数千次 SSH 尝试和数百次 HTTP 扫描。**大部分都变成了噪音** —— 惯犯 IP、扫描机器人、脚本小子。但在这片噪音之中,如果你只盯着日志尾部,很容易错过**真正的攻击模式**。 专业工具(fail2ban、Wazuh、ELK)能很好地解决这个问题。但是: - **它们消耗内存/CPU**,而小型 VPS 缺乏这些资源 - **配置耗时**,如果你只是想了解正在发生什么 - **分析孤立的旧日志**进行事后排查**很困难 本项目旨在几秒钟内解决**"给我一份日志,告诉我有什么问题"**这一场景。 ## 💡 工作原理 ``` ┌─────────────┐ auth.log ───────▶│ Parser │──┐ access.log ─────▶│ (regex) │ │ └─────────────┘ │ ▼ ┌─────────────┐ │ pandas │ │ DataFrame │ └─────────────┘ │ ▼ ┌────────────────────────┴────────────────────────┐ ▼ ▼ ▼ ▼ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ Brute │ │ HTTP │ │ Suspicious │ │ IP │ │ Force │ │ Scan │ │ User-Agent │ │ Reputation │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ ``` 每个检测器都是一个纯函数,接收 DataFrame 并返回一个发现列表。 ### 内置检测器 | 检测器 | 逻辑 | 目标日志 | |----------|--------|------| | `brute_force_ssh` | 同一 IP 在 M 分钟窗口内 ≥ N 次失败尝试 | `auth.log` | | `http_scan` | 同一 IP 在短窗口内 ≥ N 次 404/403 | `access.log` | | `suspicious_user_agent` | 用户代理字符串匹配已知扫描器 (nmap, nikto, sqlmap, masscan 等) | `access.log` | | `high_volume_ip` | 请求量位列前 1% 的 IP | 任意日志 | 所有阈值均可通过 CLI 配置。 ## 🚀 快速开始 ``` git clone https://github.com/filipemorasca/log-anomaly-detector.git cd log-anomaly-detector pip install -e . # 分析 SSH 日志(含样本) log-anomaly samples/auth.log --type ssh # 分析 HTTP 日志(含样本) log-anomaly samples/access.log --type nginx # 自定义暴力破解阈值(2 分钟内 5 次尝试) log-anomaly samples/auth.log --type ssh --bruteforce-attempts 5 --bruteforce-window 2 # 输出为 CSV 供外部分析 log-anomaly samples/auth.log --type ssh --output findings.csv ``` ### 输出示例 ``` 📊 log-anomaly-detector Arquivo: samples/auth.log Tipo: ssh Linhas analisadas: 1247 Período: 2026-03-15 02:14 → 2026-03-15 18:30 🚨 Findings: [BRUTE_FORCE_SSH] IP 203.0.113.42 → 127 tentativas em 4 minutos para usuário 'root' Primeira: 02:14:18 Última: 02:18:02 [BRUTE_FORCE_SSH] IP 198.51.100.7 → 42 tentativas em 8 minutos para múltiplos usuários Primeira: 14:02:11 Última: 14:10:33 [HIGH_VOLUME_IP] IP 203.0.113.42 → 127 requisições (99.2 percentil) ``` ## 📂 项目结构 ``` log-anomaly-detector/ ├── src/log_anomaly/ │ ├── __init__.py │ ├── cli.py # Entry point │ ├── parsers.py # Regex + pandas DataFrame para cada formato │ └── detectors.py # Lógica de detecção (funções puras) ├── tests/ │ └── test_parsers.py ├── samples/ │ ├── auth.log # Log SSH com padrão de brute-force │ └── access.log # Log nginx com padrão de scan ├── pyproject.toml └── README.md ``` ## 🧪 运行测试 ``` pip install -e ".[dev]" pytest -v ``` ## ⚙️ 如何添加新检测器 1. 编辑 `src/log_anomaly/detectors.py` 2. 添加函数:`def my_detector(df: pd.DataFrame, **kwargs) -> list[Finding]:` 3. 在文件顶部的 `DETECTORS_FOR_TYPE` 中注册 4. 在 `tests/` 中添加测试 检测器是 `(DataFrame, params) → list[Finding]` 的纯函数。没有状态,也没有副作用,使测试变得简单直接。 ## ⚠️ 已知限制 - **不能替代 SIEM。** 对于生产环境,请使用 Wazuh/ELK/Loki + Grafana。 - **仅支持经典格式。** `auth.log`(标准 rsyslog)和 `access.log`(nginx 默认的 combined 格式)。不支持 JSON 格式的日志、二进制的 journald 或自定义格式。 - **不跨源关联。** 每个文件都是独立分析的。要关联认证和 HTTP 日志,需要运行两次并交叉比对发现。 ## 🎓 本项目展示内容 - **使用 Pandas 进行时间序列分析**(滚动窗口、分组聚合) - **针对异构格式的实用正则表达式** - **设计良好的 CLI** (argparse + rich) - **蓝队思维模式**:使用简单、易于解释和审计的启发式规则 - **模块化代码**:检测器是纯函数,易于扩展和测试 ## 🏷️ 建议话题 (在 GitHub 上配置) `security` · `blue-team` · `log-analysis` · `python` · `pandas` · `siem` · `threat-detection` · `incident-response` · `devsecops` · `ssh-bruteforce` · `nginx` ## 📜 许可证 MIT — 详情参见 [LICENSE](LICENSE)。
标签:Nginx日志, pandas库, SSH日志, 异常检测, 攻击模式识别, 服务器日志, 网络安全, 自动化分析, 跨站脚本, 轻量级安全, 逆向工具, 隐私保护