P0w3r223/auth-log-scan
GitHub: P0w3r223/auth-log-scan
一个零依赖的 Python 脚本,用于扫描 OpenSSH 认证日志并检测暴力破解、用户枚举和可疑成功登录等安全事件。
Stars: 0 | Forks: 0
# auth-log-scan
[](https://github.com/P0w3r223/auth-log-scan/actions/workflows/ci.yml)
**扫描 OpenSSH 认证日志中的暴力破解、用户名枚举和可疑登录** — 从 `/var/log/auth.log` 生成终端报告(以及可选的 JSON),无额外依赖。
## 功能说明
1. **暴力破解源** — 在滑动时间窗口内,出现 ≥ *阈值* 次失败登录的 IP。
2. **用户名枚举** — 探测账户,尤其是探测不存在的账户(`invalid user`)。
3. **可疑成功登录** — 来自某个 IP 的 `Accepted` 登录,且该 IP 在此之前的日志中已经历过多次失败(可能是暴力破解后的入侵)。
## 安装说明
Python 3.11+;无运行时依赖(仅使用标准库)。
```
python -m venv .venv
.venv/Scripts/python -m pip install -r requirements.txt # Linux: .venv/bin/python
pytest
```
## 用法
```
auth-log-scan sample/auth.log # scan a file
cat /var/log/auth.log | auth-log-scan - # read from stdin
python -m auth_log_scan sample/auth.log # equivalent module form
# 调整 detectors 并导出 JSON:
auth-log-scan /var/log/auth.log -t 8 -w 120 --json findings.json
```
选项:`-t/--threshold`(默认 5),`-w/--window` 秒数(60),`--top` 行数(10),为省略年份的时间戳指定 `--year`(默认:当前年份),`--json PATH`(`-` 表示输出到 stdout)。
## 输出示例
针对内置的合成日志(`sample/auth.log`)运行:
```
== auth-log-scan report ==
events parsed : 20
time range : 2026-03-10 06:54:59 .. 2026-03-10 08:00:00
failed / accepted / invalid-user : 13 / 3 / 4
[!] brute-force sources (2)
source_ip max/win win(s) total users first last
------------- ------- ------ ----- ----- ------------------- -------------------
203.0.113.7 7 60 7 5 2026-03-10 06:55:01 2026-03-10 06:55:13
198.51.100.23 6 60 6 1 2026-03-10 07:10:00 2026-03-10 07:10:10
[!] suspicious successes (1)
source_ip user when prior_fails
------------- ------ ------------------- -----------
198.51.100.23 deploy 2026-03-10 07:10:12 6
top attacked usernames
user attempts
-------- --------
deploy 6
root 3
admin 1
oracle 1
postgres 1
test 1
top source IPs by failures
source_ip failures
------------- --------
203.0.113.7 7
198.51.100.23 6
invalid usernames probed (4): admin, oracle, postgres, test
```
## 检测与方法论
- **暴力破解** 使用 *滑动窗口*,而非简单的总数统计:它会报告任意 `window` 时间跨度内来自某 IP 的最大失败次数,因此缓慢、分散的干扰不会被误判为攻击。
- **枚举** 统计每个用户名的尝试次数,并收集通过 `invalid user` 探测的所有账户,这是典型的侦察特征。
- **可疑成功登录** 仅统计在成功登录*之前*发生的失败(日志按时间顺序处理),因此不会将偶然先于后续失败发生的正常登录标记为可疑。
解析器(`parse.py`)和检测器(`analyze.py`)是没有任何 I/O 操作的纯函数;所有文件/stdin 处理都位于 `cli.py` 中。这种分离方式使得无需接触真实日志即可实现 24 个单元测试。
## 局限性
特此声明,这只是一个有针对性的概念验证,而非 IDS:
- **仅支持 OpenSSH + 传统 syslog 格式**(`auth.log` / `secure`)。journald/ISO-8601 时间戳及其他守护进程不在支持范围内。
- **传统格式省略了年份** — 通过 `--year` 提供(默认:当前年份)。
- **无状态、单文件** 分析(无持久化,不支持实时追踪,IPv4/IPv6 被视为不透明的源字符串)。
- 内置的 `sample/auth.log` 是 **合成的**,使用了 RFC 5737 文档规定的 IP 段。
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
标签:Python, SSH, 安全规则引擎, 无后门, 红队行动, 逆向工具