fant3k/ssh-log-analyzer

GitHub: fant3k/ssh-log-analyzer

一款零依赖的防御性 OpenSSH 日志解析与关联工具,通过基于时间窗口的检测规则识别暴力破解、密码喷洒等可疑登录行为。

Stars: 0 | Forks: 0

# SSH Log Analyzer [![测试](https://static.pigsec.cn/wp-content/uploads/repos/cas/6b/6b52945adbf8d9e421fe243515ae54cfbd3da263f16b1eabda37cdc0b797b8eb.svg)](https://github.com/fant3k/ssh-log-analyzer/actions/workflows/tests.yml) ![Python](https://img.shields.io/badge/Python-3.9%2B-3776ab) ![许可证](https://img.shields.io/badge/license-MIT-22c55e) ![依赖](https://img.shields.io/badge/runtime_dependencies-0-0ea5e9) 一个小型的防御性工具,用于解析 OpenSSH 身份验证日志,并对可疑登录进行初步关联。它可以标准化来自 `auth.log`、`secure` 以及 journald 文本输出的事件,生成摘要,并标记出在 triage(分类排查)期间需要检查的事件序列。 该工具不会将每一次失败的登录都宣告为攻击:只有在有限的时间窗口内达到明确指定的阈值时,才会创建 finding(发现结果)。 ![合成 OpenSSH 日志的分析结果](https://raw.githubusercontent.com/fant3k/ssh-log-analyzer/main/docs/assets/terminal-demo.png) ## 分析内容 - 通过 password、public key 和 keyboard-interactive 进行的失败与成功登录; - 尝试使用不存在的用户进行登录; - IPv4 和 IPv6 来源; - 单次运行处理多个文件或来自 stdin 的流; - RFC 3164 时间戳(`Feb 8 10:00:00`)和 ISO 8601 journald 时间戳。 ## 关联规则 | 规则 ID | 机制 | 默认阈值 | 严重程度 | |---|---|---:|---| | `ssh_brute_force` | 来自单一 IP 的一系列失败尝试 | 5 分钟内 5 次 | high | | `ssh_password_spray` | 单一 IP 尝试多个不同用户 | 5 分钟内 4 个用户 | high | | `ssh_distributed_account_attack` | 单个账户遭到多个不同 IP 攻击 | 5 分钟内 4 个 IP | high | | `ssh_success_after_failures` | 在同一 IP/用户对的一系列失败后成功登录 | 5 分钟内 5 次失败 | critical | 最后一条规则是用于紧急检查的信号,而不是遭到入侵的自动证明:合法用户也可能会输错几次然后成功登录。 ## 快速开始 ``` git clone https://github.com/fant3k/ssh-log-analyzer.git cd ssh-log-analyzer python3 -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip pip install . ssh-log-analyzer --version ``` 该项目仅使用 Python standard library,没有 runtime 依赖。 ## 在演示日志上进行测试 ``` ssh-log-analyzer sample_logs/example_auth.log --year 2026 ``` Fixture 仅使用专为文档保留的 IP 范围。 预期结果:20 行,19 个 authentication events 和 5 个 findings,覆盖所有四条规则。 ## 处理真实日志 单个文件: ``` ssh-log-analyzer /var/log/auth.log ``` 轮替文件将被一起分析: ``` ssh-log-analyzer /var/log/auth.log.1 /var/log/auth.log ``` journald 流: ``` journalctl -u ssh --since today -o short-iso | ssh-log-analyzer - ``` 如果 syslog 行不属于当前年份,则需要显式指定: ``` ssh-log-analyzer archived-auth.log --year 2025 ``` ## JSON 和 CSV ``` ssh-log-analyzer /var/log/auth.log \ --json-out reports/ssh-analysis.json \ --csv-out reports/ssh-findings.csv ``` JSON 包含 schema 版本、摘要、高频 IP/用户以及 findings。默认情况下不写入标准化的事件,因为 usernames 和 IP 可能属于敏感信息。在进行本地调查时,您可以显式添加它们: ``` ssh-log-analyzer /var/log/auth.log \ --json-out reports/with-events.json \ --include-events ``` ## 配置检测 ``` ssh-log-analyzer /var/log/auth.log \ --window-minutes 10 \ --brute-force-threshold 8 \ --spray-user-threshold 6 \ --distributed-ip-threshold 5 ``` 如果发现至少一个信号,`--fail-on-findings` 将返回 exit code `2`。这允许在本地 pipeline 中使用该分析器,而不会将执行错误与检测到的事件混淆。 ## 架构 ``` ssh_log_analyzer/ parser.py OpenSSH parsing и нормализация detection.py window-based correlation rules models.py типизированные events, findings и result reporting.py console, JSON и CSV cli.py аргументы, входные лимиты и orchestration sample_logs/ синтетический безопасный fixture tests/ unit и CLI integration tests ``` ## 项目检查 ``` scripts/test.sh ``` 测试涵盖了真实的 OpenSSH 字符串变体、IPv4/IPv6、两种 timestamp 格式、每条关联规则、时间窗口、报告、CLI 以及针对行数的防御性限制。GitHub Actions 会在 Python 3.9、3.11 和 3.13 上重复执行这些检查。 ## 限制 - 这是一个 triage 工具,不是 SIEM,也不能替代手动调查; - RFC 3164 不包含年份 —— 需通过 `--year` 指定; - ISO 时间戳会转换为 UTC,RFC 3164 则保留在主机的本地时间; - 经发行版修改过的非标准消息可能需要添加新的 parser rule; - 在解释结果时,必须考虑 NAT、bastion hosts 和公共 egress IP; - severity 反映的是检查的优先级,而不是已证实的 impact。 ## 文档 - [English README](README_EN.md) - [安全和数据处理政策](SECURITY.md) - [MIT 许可证](LICENSE)
标签:Python, SSH, 异常检测, 文档结构分析, 无后门, 红队行动, 逆向工具