deja666/strigoth
GitHub: deja666/strigoth
基于 Textual 的终端 TUI 日志调查工具,可离线分析 Nginx/Apache 日志并提供安全规则检测与报告导出。
Stars: 0 | Forks: 0
# 🧛♂️ _STRIGOTH_ 🦇
## 🎯 目的
手动阅读原始日志文件既耗时又容易出错。
**Log Investigator TUI** 可以帮助您:
* 🔍 利用现代的 DataTable 高效检查大型日志文件
* 🚨 检测可疑模式(暴力破解、扫描、异常)
* 🎛️ 通过模态对话框交互式地过滤和分析日志
* 💻 完全离线工作,无需重型技术栈 (ELK / SIEM)
## 🎬 演示与展示
### **看看 Strigoth 的实际表现!**

**演示中展示的功能:**
- 📊 带有颜色编码状态码的交互式 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服务器日志, 免杀技术, 安全运维, 密码管理, 开源安全工具, 异常检测, 恶意代码分类, 攻击路径可视化, 无后门, 日志过滤, 暴力破解检测, 离线分析, 端口扫描检测, 红队行动, 逆向工具, 逆向工程平台, 黑客工具