aya-rojdam/log-triage
GitHub: aya-rojdam/log-triage
纯 Python 无依赖的日志分诊脚本,从 Linux 和 Windows 认证日志中快速提取暴力破解等安全告警,作为轻量级 SIEM 替代方案。
Stars: 0 | Forks: 0
# log-triage
扫描身份验证日志以检测暴力破解、密码喷洒和可疑登录。将其指向 Linux `auth.log` 或 Windows Security 事件导出文件,即可获得优先级排序的警报列表。纯 Python 标准库,无依赖,无需 SIEM。
作为一个轻量级的替代方案,无需搭建完整的检测技术栈:在几秒钟内即可在一个日志文件上运行的脚本中,实现至关重要的检测逻辑。
## 用法
```
# Linux auth.log
python -m logtriage /var/log/auth.log
# Windows Security 事件导出(来自 Event Viewer 或 Get-WinEvent 的 CSV)
python -m logtriage security_events.csv --windows
# 调整阈值并将 alerts 保存为 JSON
python -m logtriage auth.log --fails 10 --window 2 --json alerts.json
```
示例输出:
```
Parsed 37 auth events from samples/auth.log
20 failures, 17 successes
6 alert(s):
[High ] bruteforce 203.0.113.66
12 failed logins within 5 min
window: 2026-03-10 02:14:00 -> 2026-03-10 02:16:45
[High ] success-after-bruteforce 203.0.113.66
successful login as 'root' after 12 failures (possible compromise)
[High ] password-spray 198.51.100.23
failures against 8 distinct users: admin, backup, deploy, git...
```
## 检测项
| 规则 | 严重程度 | 触发条件 |
|------|----------|-----------|
| `bruteforce` | 高 | 在短时间窗口内来自同一 IP 的多次失败登录(滑动窗口,默认 5 次失败 / 5 分钟) |
| `password-spray` | 高 | 同一 IP 尝试多个不同用户名失败(默认 5 个或以上),这是与暴力破解相反的模式 |
| `success-after-bruteforce` | 高 | 某 IP 在达到暴力破解阈值后立即成功登录:可能发生了账户被入侵 |
| `odd-hours-login` | 中 | 在非工作时间内的成功登录(默认 00:00-05:59) |
所有阈值均可在命令行中调整,因此该工具同样适用于嘈杂的互联网暴露主机或安静的内网主机。
## 支持的输入
| 来源 | 格式 | 可识别的事件 |
|--------|--------|-------------------|
| Linux | `/var/log/auth.log` (syslog 文本) | sshd 接受/失败/无效用户登录,sudo 身份验证失败 |
| Windows | Security 事件日志 CSV 导出 | 4624 登录成功,4625 登录失败,4740 账户锁定 |
两者都会被规范化为通用的事件模型,因此同一套检测引擎可对任一来源运行。
## 工作原理
1. 源解析器将原始日志行转换为标准化的 `AuthEvent` 记录(时间戳、结果、用户、源 IP)
2. 检测规则在事件流上运行,每条规则返回按严重程度排序的警报
3. 检测与顺序无关:无论日志是按时间顺序排列还是被打乱,结果都是一样的
暴力破解规则使用真正的滑动时间窗口,而不是简单的总计数,因此它能区分真正的攻击(几分钟内多次失败)与一天中偶尔输错几次密码的用户。
## 项目结构
```
logtriage/
├── model.py # Normalized AuthEvent
├── parse_linux.py # auth.log parser (sshd, sudo)
├── parse_windows.py # Windows Security CSV parser
├── detect.py # Detection rules + tunable thresholds
└── __main__.py # CLI
samples/ # Synthetic logs with embedded attack patterns
tests/ # pytest suite
```
## 测试
```
python -m pytest tests/
```
示例日志是合成的,并使用了文档保留的 IP 段(203.0.113.0/24, 198.51.100.0/24)。真实日志包含实时的 IP、用户名和基础设施细节,因此它们被排除在版本控制之外(参见 `.gitignore`)。
## 路线图
- 源 IP 的 Geo/ASN 丰富
- 检测每个用户来自新/异常国家的登录
- journald JSON 输入
- 简单的 HTML 报告输出
标签:AMSI绕过, Python, 威胁检测, 安全运营, 扫描框架, 无后门, 红队行动, 逆向工具