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, 安全运营, 异常检测, 扫描框架, 无后门, 红队行动, 逆向工具