Singh-Manit/SSH-LOG-ANALYZER
GitHub: Singh-Manit/SSH-LOG-ANALYZER
一个基于 Python 标准库的 SSH 认证日志分析脚本,通过滑动窗口检测暴力破解、凭证填充等攻击模式并生成优先级告警。
Stars: 0 | Forks: 0
# log_analyzer
一个用于解析身份验证日志、检测暴力破解登录尝试并标记可疑 IP 的 Python 命令行工具。构建此项目作为学习实验,旨在了解 SOC 分析师如何进行日志分类处理。
## 背景
我了解到 SOC 的大量工作涉及手动或使用基本的 grep 命令检查 auth 日志以查找失败的登录模式后,便构建了这个工具。其目标是自动化那些重复性的部分——统计每个 IP 的失败次数、检查它们是否在时间上非常接近、判断同一个 IP 是否尝试了多个账户——并仅呈现真正需要关注的内容。
用于暴力破解检测的滑动窗口方法源于这样一种思考:简单的总失败计数器很容易被规避。如果攻击者在 8 小时内每 10 分钟发送一次尝试,将永远不会触发基本阈值,但他们的行为仍然是可疑的。检查在任意 5 分钟内发生了多少次失败则可以捕捉到这种情况。
## 检测内容
**暴力破解** — 在可配置的时间窗口内,来自同一 IP 的失败登录超过 N 次。默认值为 5 分钟内失败 5 次。严重性随超出阈值的程度而增加。
**凭证填充** — 单个 IP 针对 10 个或更多不同的用户名。当某人使用泄露的凭证列表而不是针对一个特定账户时,就会出现这种模式。
**失败后成功** — 来自之前发生过多次失败的 IP 的成功登录。这是最具可操作性的警报,因为它可能意味着攻击者确实成功进入了系统。
## 环境要求
- Python 3.8 或更高版本
- 不需要外部库 — 仅使用标准库
## 安装说明
```
git clone https://github.com/yourname/log_analyzer.git
cd log_analyzer
```
就这样。不需要 pip install。
## 使用说明
### 在真实日志文件上运行
```
python log_analyzer.py /var/log/auth.log
```
### 运行内置演示(无需文件)
```
python log_analyzer.py
```
它使用嵌入在脚本中的硬编码示例日志,这对于测试或向他人展示工具的工作原理非常有用,而无需访问实际的服务器。
### JSON 输出
```
python log_analyzer.py /var/log/auth.log --json
```
输出结构化的 JSON 而不是终端报告。如果你想将结果通过管道传递给另一个工具或将其存储在某个地方,这会很有用。
### 更改检测阈值
```
# 在 3 次失败后而不是 5 次后进行标记
python log_analyzer.py /var/log/auth.log --threshold 3
# 使用 60 秒的时间窗口而不是 5 分钟
python log_analyzer.py /var/log/auth.log --window 60
# 同时使用两者
python log_analyzer.py /var/log/auth.log --threshold 3 --window 60
```
### 完整帮助
```
python log_analyzer.py --help
```
## 支持的日志格式
解析器可以处理三种格式:
- **sshd** — 标准的 OpenSSH auth 日志行(`Failed password for user from IP`)
- **Apache/Nginx access logs** — combined log format,标记 401 和 403 响应
- **Generic failed auth** — 一个通用的正则表达式,用于查找 IP 地址附近的 FAILED、UNAUTHORIZED、401、403 等关键字
如果某一行不匹配任何模式,它将被跳过。报告顶部的摘要会显示已解析的行数与总行数的对比,因此你可以判断格式是否被正确识别。
## 输出说明
### 终端报告
```
Lines processed : 2847
Lines parsed : 2841
Unique IPs seen : 312
Alerts raised : 4
-- ALERTS -------------------------------------------------------
[CRITICAL] [2025-01-10 08:01:24] BRUTE_FORCE -- 192.168.1.50: 6 failed logins in 300s window
[HIGH ] [2025-01-10 08:05:18] CREDENTIAL_STUFFING -- 203.0.113.9: 10 distinct accounts targeted
[MEDIUM ] [2025-01-10 08:01:24] SUCCESS_AFTER_FAILURES -- 192.168.1.50: login succeeded after 6 failures
```
警报按严重性排序(CRITICAL 优先)。每个警报显示该 IP 最后一个相关事件的时间戳,而不是第一个。
### JSON 输出
```
{
"meta": {
"generated_at": "2025-01-10T08:15:00",
"total_lines": 2847,
"parsed_lines": 2841,
"unique_ips": 312
},
"alerts": [...],
"top_ips": [...]
}
```
## 示例日志文件
仓库中包含了 `sample_auth.log`。它包含了该工具检测到的每种攻击模式的示例以及一些正常流量。这非常适合用于测试阈值更改,而无需访问生产服务器。
```
python log_analyzer.py sample_auth.log
```
## 项目结构
```
log_analyzer/
log_analyzer.py main script
sample_auth.log example log with known attack patterns
README.md this file
```
## 局限性
**无 GeoIP 查询。** 该工具完全离线工作,无法将 IP 映射到国家或 ASN。添加该功能需要 MaxMind GeoLite2 数据库或付费 API,我希望以后对此进行探索。
**基于 Regex 的解析在非标准格式下会失效。** 如果你的 sshd 或 Apache 配置为生成与默认值不同的日志格式,这些行将被静默跳过。输出中的已解析/总行数比率是需要关注的指标。
**跨运行无持久化状态。** 每次运行都是全新开始。如果攻击者将其尝试分散在多个日志轮转文件中,并且你分别分析每个文件,滑动窗口将无法检测到该模式。你需要先将这些文件合并在一起。
**时间戳不包含年份。** 标准 syslog 格式(由 sshd 使用)的时间戳中不包含年份。脚本假定使用当前年份,这意味着如果在 1 月份分析 12 月份的日志,窗口计算的时间戳将会不正确。
**不支持 IPv6。** IP 匹配正则表达式仅处理 IPv4 地址。启用了 IPv6 的现代系统将跳过这些地址。
**不能替代真正的 SIEM。** 这是一个单主机、单文件的工具。它没有跨多个日志源的相关性分析,没有持久化数据库,没有告警集成,也没有仪表板。它旨在用于快速的手动分析或学习,而不是生产环境的监控。
**共享 IP 的误报。** 如果你的组织使用代理或 NAT 网关,许多用户可能会共享一个外部 IP。即使流量是合法的,该工具也会将该 IP 标记为暴力破解或凭证填充。目前尚未实现白名单功能。
## 可能的改进
- 为已知安全的 IP 添加白名单
- 集成 GeoIP 以标记高风险国家
- 使用 SQLite 后端跨多个日志文件进行持久化跟踪
- 发现 CRITICAL 级别的结果时通过邮件或 Slack 发出警报
- 支持 IPv6 地址
- 允许自定义 JSON 报告的输出文件路径
标签:Python, 安全运营, 异常检测, 扫描框架, 无后门, 红队行动, 逆向工具