lbabikian/log-monitor

GitHub: lbabikian/log-monitor

基于 Python 标准库实现的轻量级 SSH 暴力破解检测器,通过滑动窗口算法实时监控认证日志中的异常登录行为。

Stars: 0 | Forks: 0

# 日志监控器 - SSH 暴力破解检测器 一个实时日志监控器,可监控 SSH 认证日志,解析登录尝试,并使用滑动窗口算法检测暴力破解模式 - 例如:在可配置的时间窗口内,来自同一 IP 的重复失败登录。对应于 **MITRE ATT&CK T1110.001(暴力破解:密码猜测)**。 作为一个小巧、无依赖的工具构建,具有清晰的流水线:`parser -> Event -> detector -> alert`,因此可以在不影响系统其余部分的情况下添加新的日志源或检测规则。有关架构背后的原因,请参阅 [DESIGN.md](DESIGN.md)。 ## 演示 无需真实攻击(或真实日志数据)- `scripts/simulate_attack.py` 会生成合成 sshd 流量,并将其通过管道直接输入到监控器: ``` $ python scripts/simulate_attack.py --mode burst | python -m src.main - [ALERT] Failed SSH logins from 203.0.113.77: 5 in 60s [rule=auth_failed_burst ip=203.0.113.77 count=5 window=60s] ``` 或者针对内置的示例日志: ``` $ python -m src.main samples/auth_small.log [ALERT] Failed SSH logins from 192.168.0.10: 5 in 60s [rule=auth_failed_burst ip=192.168.0.10 count=5 window=60s] ``` ## 功能 - 解析 OpenSSH `auth.log`(支持传统的 syslog 和 ISO-8601 时间戳格式) - 基于源 IP 的滑动窗口暴力破解检测 - 支持批处理模式(读取一次文件)、`tail -f` 样式的跟随模式和 stdin 管道输入 - 去重告警:每次突发仅触发一次,而不是每次失败尝试都触发 - JSON 告警输出(`--json`),便于通过管道传递给其他工具 - 用于演示和验证的合成攻击流量生成器 - 零运行时依赖 - 仅使用 Python 标准库 ## 安装 ``` git clone cd log-monitor python -m venv .venv && source .venv/bin/activate pip install -e . # installs the `log-monitor` command pip install -r requirements-dev.txt # only needed to run the tests ``` 无需安装,所有功能也可以直接在仓库根目录下运行: ``` python -m src.main samples/auth_small.log ``` ## 用法 ``` log-monitor samples/auth_small.log # batch mode log-monitor /var/log/auth.log --follow # live tail -f mode log-monitor --window 30 --threshold 3 # tune the detection rule log-monitor --json samples/auth_small.log # JSON alerts, for piping tail -f /var/log/auth.log | log-monitor - # read from stdin ``` `--window` 是以秒为单位的滑动窗口大小(默认为 60),`--threshold` 是在该窗口内触发告警所需的失败次数 (默认为 5)。 ## 架构 ``` log source -> parser -> Event -> detector -> alert -> sink ``` - `src/parsers/auth.py` - 基于 regex 的 sshd 日志解析器,返回通用的 `Event` - `src/models.py` - 每个解析器和 detector 共享的 `Event` dataclass - `src/detectors/rules.py` - `FailedLoginBurst`,一个基于 deque 的滑动窗口规则 - `src/alerts/console.py` - 告警 sink(纯文本或 JSON) - `src/tailer.py` - 文件读取,包括 `tail -f` 跟随器 - `scripts/simulate_attack.py` - 用于演示/测试的合成 sshd 流量生成器 关于这些选择的完整理由 - 为什么使用 deque 而不是数据库,为什么 检测是基于 IP 的,以及详细的 ATT&CK 映射 - 都在 [DESIGN.md](DESIGN.md) 中。 ## 测试 ``` pip install -r requirements-dev.txt pytest ``` 涵盖时间戳/regex 解析、滑动窗口 detector(阈值 越过、窗口过期、去重/重新告警行为、按 IP 隔离)以及 告警 sink 的文本/JSON 输出。 ## 限制 / 路线图 本项目有意划定了一个范围边界,而不是一次性半成品式地实现所有功能: - **仅限内存状态** - 重启进程会遗忘任何正在进行的 突发。持久化存储(SQLite/Redis)是自然的下一步。 - **仅限基于 IP 的检测** - 分布式攻击(许多 IP,每个 IP 少量尝试, 同一个目标账户 - ATT&CK T1110.003/T1110.004)在今天 将无法越过基于单个 IP 的阈值。`scripts/simulate_attack.py --mode distributed` 特意演示了这个缺陷。基于用户名的 detector 是计划中的 修复方案,将复用相同的滑动窗口原语。 - **无白名单机制** - 目前无法排除已知安全的 IP(例如你自己的 跳板机或内部扫描器)。 - **仅限控制台告警** - 尚未支持 webhook/Slack/邮件 sink。 - **仅限本地文件/stdin 输入** - 没有网络监听器,这使得 攻击面刻意保持在最小,适合作为 CLI 工具。 ## 许可证 MIT - 见 [LICENSE](LICENSE)。
标签:Python, 异常检测, 无后门, 逆向工具