Kartik0219/soc-log-dashboard
GitHub: Kartik0219/soc-log-dashboard
一款 SOC 日志分析 CLI 工具,将 Windows 安全事件日志导入 SQLite 并自动检测暴力破解、密码喷洒、不可能旅行及权限提升等威胁模式,生成多格式报告。
Stars: 0 | Forks: 0
# SOC 日志分析仪表板
一款命令行工具,它将标准化后的 Windows 安全事件日志导入到 SQLite 中,并扫描它们以查找 SOC 分析师每天会分类处理的模式——暴力破解、密码喷洒、不可能的旅行以及权限提升链——从而生成带有嵌入式图表的控制台、CSV 和独立的 HTML 仪表板报告。
```
$ python -m soc_dashboard.cli events.csv
Severity | Category | Account | Source IP | First Seen | Summary
---------+----------------------+------------+-----------+---------------------+----------------------------------------------------------------------
HIGH | Privilege Escalation | svc_backup | - | 2024-01-15 08:00:00 | Account 'svc_backup' was created and added to 'Domain Admins' only 0:06:00 later - unusually fast provisioning
HIGH | Privilege Escalation | tjones | - | 2024-01-15 10:00:00 | Account 'tjones' absorbed 5 failed logons and was then added to 'Administrators' within 15 minutes - possible compromise followed by privilege escalation
2 alert(s) - 2 high, 0 medium, 0 low
```
## 它能检测什么
| 检测器 | 信号 | 为什么重要 |
|---|---|---|
| **暴力破解** | 同一源 IP 在滚动时间窗口内对同一账户产生 ≥ N 次失败的登录尝试 (4625) | 针对单一高价值账户的经典凭证猜测攻击 |
| **密码喷洒** | 同一源 IP 在短时间窗口内尝试登录多个不同的账户 | 旨在规避账户锁定策略的低频缓慢攻击技术 |
| **不可能的旅行** | 同一账户从两个地点成功登录,且两地的大圆距离意味着不切实际的移动速度 | 凭证被盗或从远程位置进行会话重放的强烈信号 |
| **权限提升 — 快速创建的账户** | 账户在几分钟内被创建 (4720) 并被添加到敏感组 (4728/4732,例如 Domain Admins) 中 | 合法的配置流程通常包含审批延迟;后门账户则不会等待 |
| **权限提升 — 被攻陷后** | 账户遭遇大量失败的登录尝试,且不久后即被添加到敏感组中 | 暗示攻击者已成功登录,并立即着手巩固访问权限 |
每个警报都包含严重性评级 (`low`/`medium`/`high`) 和结构化的证据(计数、时间戳、间隔持续时间、组名等),以便您验证*为什么*某些内容会被标记。
## 安装
```
git clone
cd soc-log-dashboard
python -m venv venv
# Windows: venv\Scripts\activate | macOS/Linux: source venv/bin/activate
pip install -r requirements.txt
```
需要 Python 3.10+ 和 [matplotlib](https://matplotlib.org/)(用于
渲染仪表板的图表;通过 `requirements.txt` 安装)。
其他所有功能——CSV 解析、SQLite 存储、检测——仅使用
标准库。
## 用法
```
# 运行所有 detector 并打印 console 报告
python -m soc_dashboard.cli events.csv
# 仅运行指定的 detector
python -m soc_dashboard.cli events.csv --checks brute_force impossible_travel
# 将 ingested events 持久化到 SQLite 文件,而不是 in-memory DB
python -m soc_dashboard.cli events.csv --db events.sqlite3
# 导出机器可读 / 可共享的报告
python -m soc_dashboard.cli events.csv --csv alerts.csv --html dashboard.html
# 隐藏 console 表格(与 --csv/--html 搭配使用时很方便)
python -m soc_dashboard.cli events.csv -q --html dashboard.html
```
运行 `python -m soc_dashboard.cli --help` 获取完整的选项列表。如果
触发了任何警报,进程将以状态码 `1` 退出,如果日志
看起来正常,则以 `0` 退出——这非常方便用于脚本/CI 检查。
## 输入格式
该工具使用扁平化、标准化后的 CSV(而非原始 EVTX),以便它可以专注
于检测逻辑,而不是事件日志解析的繁琐细节:
```
timestamp,event_id,account,source_ip,logon_type,workstation,target_account,group_name
```
仅 `timestamp`、`event_id` 和 `account` 是必需的;其余部分在每行中
均为可选,并由特定的检测器使用(例如,用于权限提升链的 `target_account`
和 `group_name`)。`samples/README.md`
解释了如何使用 `Get-WinEvent` 将真实的 Windows 安全日志导出为此格式,
并提供了指向公开检测工程数据集的指引。
## 构建方式
```
soc_dashboard/
├── models.py # LogEvent / Alert dataclasses + Windows event-ID constants
├── geoip.py # Static IP→location lookup + haversine distance for impossible travel
├── ingest.py # Normalized-CSV parser with fail-fast validation
├── db.py # SQLite schema, connection, insert/fetch helpers
├── engine.py # Loads events once, fans them out to every detector
├── detectors/
│ ├── brute_force.py # Rolling-window failed-logon and password-spray counters
│ ├── impossible_travel.py # Geo distance + implied-speed analysis between consecutive logons
│ └── priv_escalation.py # Account-creation / failed-logon → sensitive-group-add chains
├── report.py # Console table, CSV, and self-contained HTML+chart renderers
└── cli.py # argparse front-end
```
事件被一次性导入 (`engine.analyze`),内存中的列表会在
所有检测器之间共享,因此添加新检查就像将带有
`detect(events) -> list[Alert]` 函数的模块放入
`detectors/` 并在 `detectors/__init__.py` 中注册一样简单。
## 测试
测试套件使用小型的、确定性的**合成** CSV 固定数据
(`tests/fixtures/generate.py`)——每一个都准确地隔离出一种
可疑模式(或者对于“正常活动”基准则没有),因此
这些测试断言了真实信号能被捕获,且良性
活动保持静默。
```
pip install -r requirements-dev.txt
pytest
```
要在更改检测逻辑或添加新
场景后重新生成固定数据:
```
python tests/fixtures/generate.py
```
## 设计说明与局限性
- **基于启发式,而非基于签名。** 每个检测器都使用统计
阈值(每个窗口的失败登录次数、距离/速度截止值、
配置间隔持续时间),并针对合成固定数据进行调优。
真实环境更加嘈杂——预期需要为您所在的组织调优每个
检测器模块顶部的常量(窗口大小、阈值),
并将 `low`/`medium` 警报视为待调查的线索。
- **静态 GeoIP 查找。** `geoip.py` 提供了一个小型的内置
示例位置表,而不是调用实时的地理定位服务,因此
该工具可完全离线且确定性地运行。生产环境的
版本将接入真实的 GeoIP 数据库(例如 MaxMind GeoLite2)。
- **单次遍历,内存处理。** 日志在每次
运行期间被完全加载到内存中。这对于练习规模的导出(数千行)来说没有问题;
超大型日志将需要进行流式/分块重新设计。
## 道德使用
该工具仅**读取**现有的日志导出——它不收集
实时遥测数据,也不与任何网络或目录服务交互。请仅
针对您有权分析的日志(您自己的机器,
或已发布的训练/研究数据集,例如 `samples/README.md` 中列出的那些)运行它。
标签:AMSI绕过, Python, Windows事件日志, 威胁检测, 安全运营, 扫描框架, 无后门, 红队行动, 逆向工具