deja666/strigoth

GitHub: deja666/strigoth

基于 Textual 的终端 TUI 日志调查工具,可离线分析 Nginx/Apache 日志并提供安全规则检测与报告导出。

Stars: 0 | Forks: 0

# 🧛‍♂️ _STRIGOTH_ 🦇 ## 🎯 目的 手动阅读原始日志文件既耗时又容易出错。 **Log Investigator TUI** 可以帮助您: * 🔍 利用现代的 DataTable 高效检查大型日志文件 * 🚨 检测可疑模式(暴力破解、扫描、异常) * 🎛️ 通过模态对话框交互式地过滤和分析日志 * 💻 完全离线工作,无需重型技术栈 (ELK / SIEM) ## 🎬 演示与展示 ### **看看 Strigoth 的实际表现!** ![Strigoth 演示](https://raw.githubusercontent.com/deja666/strigoth/main/media/media.gif) **演示中展示的功能:** - 📊 带有颜色编码状态码的交互式 DataTable - 🔍 通过模态对话框进行实时过滤 - 📈 实时统计仪表板 - 🚨 安全警报检测 - ⌨️ 键盘驱动的导航 - 📋 导出报告 (Markdown/JSON) **亲自尝试:** ``` python -m tui.app sample_logs/access.log ``` ## 🚀 快速开始 ### 安装 ``` pip install -r requirements.txt ``` ### 运行应用程序 ``` # 使用 Python module python -m tui.app # 或者使用 run script python run.py # 或者在 Windows 上 run.bat ``` ### 使用示例日志 ``` python -m tui.app sample_logs/access.log ``` ## 🎨 功能 ### 核心功能 * ✅ 加载大型日志文件(基于流) * ✅ **多日志文件支持** - 加载并合并多个日志文件 * ✅ **自动检测日志格式**(Nginx 或 Apache) * ✅ 解析结构化字段(IP、时间戳、方法、路径、状态、user-agent) * ✅ 带排序功能的交互式 DataTable 查看器 * ✅ **颜色编码的状态码**(2xx=绿色,3xx=红色,4xx=黄色,5xx=紫色) * ✅ 多条件过滤(状态、IP、方法、路径、搜索、**来源**) * ✅ 基于规则的异常检测 * ✅ 实时统计仪表板 * ✅ 安全警报面板 * ✅ 导出调查报告(**Markdown 和 JSON**) * ✅ **实时日志模式**(`tail -f` 风格)- 实时监控 * ✅ **时间序列图表** - 带有 sparklines 的流量可视化 * ✅ **请求速率可视化** - 每分钟请求数及峰值检测 * ✅ **自定义 YAML 配置** - 无需编写代码即可自定义规则 * ✅ 纯终端 (TUI) ### 支持的日志 * ✅ Nginx `access.log`(默认格式) * ✅ Apache `access.log`(Combined 和 Common 格式) * ✅ **自动检测** - 无需手动选择格式 ## 🖥️ UI 布局 ``` ┌─────────────────────────────────────────────────────────────────┐ │ STRIGOTH LOG INVESTIGATOR v1.0.0 [Header] │ ├──────────┬──────────────────────────────┬───────────┬───────────┤ │ Filters │ DataTable (Log Viewer) │ Statistics│ Alerts │ │──────────│──────────────────────────────│───────────┼───────────┤ │ No active│ Time IP Method Path │ Total: 82 │ 🔴 HIGH │ │ filters │ 10:15 192... GET / │ Unique: 45│ • Brute │ │ │ 10:15 10... POST /log │ 4xx: 15% │ 🟡 MEDIUM │ │ │ │ 5xx: 5% │ • /admin │ │ │ │ │ │ ├──────────┴──────────────────────────────┴───────────┴───────────┤ │ Showing 82 of 82 entries | Errors: 12 (14.6%) | Alerts: 3 │ │ q:Quit f:Filter c:Clear /:Search s:Stats a:Alerts e:Export│ └─────────────────────────────────────────────────────────────────┘ ``` ## ⌨️ 键盘快捷键 | 按键 | 操作 | | --------- | ------------------------ | | `j` / `k` | 向下 / 向上滚动 | | `g` | 跳到顶部 | | `G` | 跳到底部 | | `f` | 打开过滤面板 | | `c` | 清除过滤器 | | `/` | 快速搜索 | | `s` | 切换统计面板 | | `a` | 切换警报面板 | | `t` | 显示图表视图 | | `l` | 切换实时模式 (tail -f) | | `o` | 打开/重新加载配置 (YAML) | | `r` | 重新加载日志文件 | | `e` | 导出报告 (MD/JSON) | | `?` | 显示帮助 | | `q` | 退出应用程序 | | `Enter` | 选择行 | | `Escape` | 关闭模态窗口 / 取消 | ## 🧠 安全检测规则 规则是**简单、透明且可配置的**。 ### 激活的规则 | 规则 | 严重程度 | 描述 | 阈值 | |------|----------|------|------| | `brute_force` | 🔴 高 | 来自单一 IP 的过多 401 响应 | 10 次尝试/分钟 | | `sensitive_path` | 🟡 中 | 访问敏感路径 | 任意匹配 | | `scanning` | 🟡 中 | 来自同一 IP 的大量唯一路径 | 20 个路径/5分钟 | | `high_rate` | 🟢 低 | 高请求速率 | 100 次请求/分钟 | ### 敏感路径(默认) * `/admin`, `/wp-admin`, `/wp-login.php` * `/phpmyadmin`, `/pma` * `/.env`, `/.git`, `/.htaccess` * `/config`, `/backup` * `/wp-config.php`, `/xmlrpc.php` ## 📁 项目结构 ``` strigoth/ ├── core/ │ ├── __init__.py │ ├── models.py # LogEntry dataclass │ ├── loader.py # Log file loading (stream/batch) │ ├── config.py # Configuration loader for YAML-based rule customization. │ ├── stats.py # Statistics aggregation engine │ └── filter_engine.py # Filter logic and state ├── parser/ │ ├── __init__.py │ └── nginx.py # Nginx log parser with regex │ └── apache.py # Apache log parser with regex │ └── detector.py # Log parser with regex auto-detection ├── rules/ │ ├── __init__.py │ └── security.py # Security rule engine ├── reports/ # Generated Folder For Report File ├── export/ │ ├── __init__.py │ └── report.py # Markdown/JSON export ├── tui/ │ ├── modals/ # Modals Textual TUI │ ├── __init__.py │ ├── app.py # Main Textual TUI application │ └── app.tcss # TUI stylesheets ├── sample_logs/ │ └── access.log # Sample log for testing ├── requirements.txt ├── run.py # Python entry point ├── run.bat # Windows batch script ├── config.yaml # Configure YAML File └── README.md ``` ## 🔎 过滤引擎 ### 支持的过滤器 * **状态码** - 精确匹配(例如 `200`, `401`, `500`) * **IP 地址** - 子字符串匹配(例如 `192.168`) * **HTTP 方法** - 精确匹配(例如 `GET`, `POST`, `PUT`) * **路径** - 子字符串匹配(例如 `/admin`, `/api`) * **来源** - 子字符串匹配(例如 `access`, `server2`)- **v0.8 版本新增!** * **搜索** - 跨整个日志行的全文搜索 ### 过滤模态框 按下 `f` 可打开过滤器模态对话框,其中包含每种过滤器类型的输入字段。 多个过滤器可以同时激活(AND 逻辑)。 ### 多日志过滤示例 加载多个日志文件时: ``` python -m tui.app server1.log server2.log server3.log ``` 1. 按下 `f` 打开过滤器 2. 在 **Source** 字段中输入 `server2` 3. 按下 Enter 或点击 **APPLY** 4. 将仅显示来自 `server2.log` 的日志 通过按下 `f` 并点击 **CLEAR** 来清除过滤器。 ## 📂 多日志支持 通过自动合并和来源跟踪,同时加载和分析多个日志文件。 ### 使用方法 ``` # 加载多个 log 文件 python -m tui.app server1.log server2.log server3.log # 混合来自不同服务器的 access log python -m tui.app /var/log/nginx/server1.log /var/log/nginx/server2.log ``` ### 功能 * **自动合并** - 所有文件中的日志将被合并并按时间戳排序 * **来源列** - 加载超过 1 个文件时自动显示 * **来源跟踪** - 每个条目都知晓其所属文件 * **按来源过滤** - 进行过滤以仅显示来自特定文件的日志 * **按来源统计** - 按已加载文件细分的统计数据 ### DataTable 布局 **单文件**(无来源列): ``` ┌────────────────────────────────────────────────────────┐ │ Time IP Address Method Path Status Size │ ├────────────────────────────────────────────────────────┤ │ 10:15 192.168.1.1 GET / 200 5,432 │ └────────────────────────────────────────────────────────┘ ``` **多文件**(包含来源列): ``` ┌──────────────────────────────────────────────────────────────────┐ │ Time Source IP Address Method Path Status Size │ ├──────────────────────────────────────────────────────────────────┤ │ 10:15 server1 192.168.1.1 GET / 200 5,432 │ │ 10:16 server2 10.0.0.50 POST /login 401 123 │ │ 10:17 server3 172.16.0.1 GET /api 200 8,765 │ └──────────────────────────────────────────────────────────────────┘ ``` ### 示例日志文件 本项目包含用于测试多日志支持的示例日志: * `sample_logs/access.log` - 服务器 1(81 条记录,10:15-10:16) * `sample_logs/server2.log` - 服务器 2(40 条记录,11:00-11:00) * `sample_logs/server3.log` - 服务器 3(40 条记录,12:00-12:00) 使用以下命令测试多日志: ``` python -m tui.app sample_logs/access.log sample_logs/server2.log sample_logs/server3.log ``` ## 📝 导出报告 以 **Markdown** 或 **JSON** 格式生成全面的调查报告。 ### 导出格式 **Markdown (.md):** - 易于阅读的报告 - 使用标题、表格和列表进行格式化 - 非常适合文档记录和分享 **JSON (.json):** - 机器可读格式 - 易于与其他工具集成 - 用于自动化的结构化数据 ### 导出选项 按下 `e` 打开导出对话框并选择: - 📄 **Markdown** - 标准文本报告 - 📋 **JSON** - 结构化数据格式 - **Both** - 同时导出两种格式 ### 报告内容 * 摘要统计信息(总请求数、唯一 IP 数、错误率) * 已分析日志的时间范围 * 按请求数排名的顶级 IP * 按请求数排名的顶级路径 * 应用的过滤器 * 安全警报(按严重程度分组) * 状态码分布 * HTTP 方法细分 * 最近的日志条目(最后 20 条) ### 输出位置 报告保存至 `reports/` 目录,文件名带有时间戳: ``` reports/access_log_report_20260326_143022.md reports/access_log_report_20260326_143022.json ``` ### JSON 输出示例 ``` { "generated_at": "2026-03-26T10:30:00", "version": "v0.7", "summary": { "Total Requests": "1,234", "Unique IPs": "45", "Error Rate": "14.6%" }, "alerts_summary": { "total": 15, "high": 3, "medium": 7, "low": 5 }, "top_ips": [ {"ip": "10.0.0.50", "count": 12}, {"ip": "192.168.1.100", "count": 8} ], "status_codes": { "2xx": 750, "3xx": 50, "4xx": 300, "5xx": 134 } } ``` ## ⚙️ YAML 配置 无需修改代码即可自定义安全规则和检测阈值。 ### 快速开始 1. 在项目根目录中编辑 `config.yaml` 2. 保存更改 3. 在应用中按下 `o` 重新加载配置(或重启) ### 配置选项 ``` rules: # Brute Force Detection brute_force: enabled: true # Enable/disable rule threshold: 10 # Failed attempts to trigger time_window: 60 # Time window (seconds) # Sensitive Path Detection sensitive_path: enabled: true paths: # Custom paths list - /admin - /wp-admin - /.env - /custom-path # Add your own # Scanning Detection scanning: enabled: true threshold: 20 # Unique paths to trigger time_window: 300 # Time window (5 min) # High Request Rate high_rate: enabled: true threshold: 100 # Requests to trigger time_window: 60 # Time window (1 min) ``` ### 示例 **禁用暴力破解检测:** ``` brute_force: enabled: false ``` **添加自定义敏感路径:** ``` sensitive_path: paths: - /admin - /my-secret-path - /internal-api ``` **使扫描检测更严格:** ``` scanning: threshold: 10 # Alert after 10 paths (default: 20) time_window: 60 # Within 1 minute (default: 300) ``` **使暴力破解更敏感:** ``` brute_force: threshold: 5 # Alert after 5 attempts (default: 10) time_window: 120 # Within 2 minutes (default: 60) ``` ### 配置文件位置 ``` strigoth/ ├── config.yaml ← Edit this file ├── tui/ ├── core/ └── ... ``` 在应用中按下 **`o`** 可查看配置文件路径并重新加载。 ## 🧪 使用示例日志进行测试 本项目包含一个示例 `access.log`,其中具有: * ✅ 正常流量模式 * ✅ 暴力破解攻击模拟(来自 10.0.0.50 的 12 次失败登录) * ✅ 敏感路径扫描(172.16.0.200 访问 /admin、/wp-admin 等) * ✅ 高频请求(10.0.0.100 的 25 次快速请求) * ✅ 各种 HTTP 状态码(2xx, 3xx, 4xx, 5xx) ## 状态 ### 已完成 * [x] Nginx 日志解析 * [x] 基于 DataTable 的日志查看器 * [x] 带有模态 UI 的过滤引擎 * [x] 统计仪表板 * [x] 安全规则引擎 * [x] **Markdown 和 JSON 导出** * [x] 键盘驱动的导航 * [x] 颜色编码的状态码 * [x] **实时日志模式**(`tail -f` 风格) * [x] **时间序列图表** - 流量可视化 * [x] **自定义 YAML 配置** * [x] **多日志文件支持** - 加载并合并多个文件 * [x] **Apache 日志解析器** - 自动检测格式 * [x] **请求速率可视化** - 每分钟请求数及峰值检测 * [x] **符合 PEP 8 标准** 的代码,带有全面的类型提示 * [x] **Textual 主题颜色**(无硬编码的十六进制颜色) * [x] **行详情检查器** 允许用户通过选择 DataTable 中的行并按下 `Enter` 打开一个**只读模态视图**,来检查**完整的日志条目详情**。 ### 🔮 未来版本 * [ ] GeoIP 查询 * [ ] .PDF 转换报告 * [ ] 保存的过滤器预设 * [ ] 标记 / 书签可疑条目 * [ ] 调查会话元数据 * [ ] 时间窗口滑块 / 选择器 * [ ] 规则命中热力图(基于文本) * [ ] IP 信誉启发式评估(离线) * [ ] 会话关联(IP + UA + 时间窗口) ## 🛠️ 开发 ### 要求 * Python 3.10+ * textual >= 0.48.0 * textual-dev>=1.0.0 * pyyaml>=6.0 ### 安装依赖 ``` pip install -r requirements.txt ``` ### 运行测试 ``` # Syntax 检查 python -m py_compile tui/app.py # Import 测试 python -c "from tui.app import LogInvestigatorApp; print('OK')" ``` ### 代码风格 整个代码库遵循 PEP 8 指南并带有类型提示。 ## 📌 理念 * **离线优先** - 无外部依赖或 API 调用 * **可解释的规则** - 没有黑盒 AI,透明的检测逻辑 * **键盘驱动的用户体验** - 高效的终端导航 * **可读代码 > 花哨的 UI** - 整洁、可维护的 Python 代码 ## 📄 许可证 MIT 许可证 - 详见 LICENSE 文件。
标签:Apache, Nginx, PB级数据处理, Python, SIEM替代, Textual, TUI, Web服务器日志, 免杀技术, 安全运维, 密码管理, 开源安全工具, 异常检测, 恶意代码分类, 攻击路径可视化, 无后门, 日志过滤, 暴力破解检测, 离线分析, 端口扫描检测, 红队行动, 逆向工具, 逆向工程平台, 黑客工具