Vanelko/SecLogAnalyzer
GitHub: Vanelko/SecLogAnalyzer
一个仅依赖 Python 标准库的 Windows 安全日志分析器,通过检测规则从 JSON 格式事件日志中发现暴力破解、密码喷射、特权滥用等攻击模式并生成按严重程度排序的报告。
Stars: 0 | Forks: 0
# SecLogAnalyzer
**Windows Security 事件日志分析器:检测日志中的攻击迹象,并生成按严重程度优先排序的报告。**




## 关于项目
Windows Security 日志是 SOC 分析师的主要数据源之一:几乎针对 Windows 基础设施的任何攻击都会在其中留下痕迹(登录失败、账户锁定、权限变更)。手动查看数千个事件是不可能的,因此在实际工作中,这通常由 SIEM 系统的关联规则来完成。
SecLogAnalyzer 以微缩的形式实现了同样的理念:它接收 JSON 格式的事件日志转储,将其通过一组检测规则进行处理,并生成一份文本报告,其中最关键的发现排在最前面。该项目仅使用 Python 标准库编写——没有任何外部依赖。
## 检测规则
| 规则 | EventID | 严重程度 | 检测内容 |
|---|---|---|---|
| `bruteforce_attack` | 4625 | CRITICAL | 暴力破解:10分钟内同一账户出现5次以上登录失败 |
| `password_spray` | 4740 | CRITICAL | Password spray:30分钟内5个以上**不同**的账户被锁定 |
| `offhours_privileged_logon` | 4672 | HIGH | 非工作时间(9:00–19:00)的特权登录 |
| `privilege_changes` | 4720, 4732 | HIGH | 创建账户 / 添加到安全组 |
| `login_after_failures` | 4625 → 4624 | MEDIUM | 在一系列失败尝试后不久成功登录——密码可能已泄露 |
所有阈值(尝试次数、时间窗口大小、工作时间边界)都放在 `src/constants.py` 中,只需在一个地方进行修改。
## 架构
该项目构建为由独立模块组成的流水线,每个模块只负责一个阶段:
```
JSON-файл журнала
│
▼
parser.py — чтение файла, валидация структуры и обязательных полей,
│ превращение «сырых» словарей в типизированные LogEvent
▼
analyzer.py — пять правил-детекторов (чистые функции list[LogEvent] → list[Finding])
│ и оркестратор analyze_events(), собирающий их находки
▼
report.py — сортировка находок (по критичности, затем по времени)
│ и форматирование текстового отчёта
▼
main.py — CLI: аргументы командной строки, запуск конвейера,
обработка ошибок, вывод/сохранение отчёта
```
流水线中没有独立阶段的通用模块:
- `models.py` — 数据模型:`LogEvent`(单个事件)、`Finding`(单个发现)、`Severity`(严重程度级别);
- `constants.py` — Windows 事件 ID、检测阈值、必填字段;
- `exceptions.py` — 自定义异常层级结构(`SecLogError` 及其子类),而不是直接捕获 `Exception`。
关键设计决策:
- **每条规则都是一个独立的纯函数。** 规则之间互不依赖:添加新规则无需修改现有规则,每条规则都可以独立测试。
- **模块对相邻模块的感知降至最低。** `analyzer.py` 不负责读取文件,`report.py` 不负责分析,`main.py` 不包含业务逻辑。一个阶段的损坏不会影响其他阶段。
- **损坏的事件不会中断分析。** 缺少必填字段或日期格式不正确的事件将被跳过并在日志中记录警告,解析过程会继续进行——这正是处理真实且非理想数据的工具应有的行为。
## 项目结构
```
Project_01_LogAnalyzer/
├── src/
│ ├── main.py # точка входа, CLI
│ ├── parser.py # чтение и валидация журнала
│ ├── analyzer.py # правила обнаружения
│ ├── report.py # формирование отчёта
│ ├── models.py # LogEvent, Finding, Severity
│ ├── constants.py # EventID, пороги, настройки
│ └── exceptions.py # иерархия исключений
├── tests/
│ ├── test_parser.py # 9 тестов: валидация файла и событий
│ ├── test_analyzer.py # 16 тестов: все правила + регрессионные
│ ├── test_report.py # 7 тестов: содержимое и сортировка отчёта
│ └── test_main.py # 3 теста: композиция конвейера, обработка ошибок
├── data/
│ └── sample_logs/ # демонстрационный журнал и битые файлы для тестов
├── docs/ # THEORY, INTERVIEW, DEVELOPMENT
├── README.md
├── CHANGELOG.md
├── ROADMAP.md
└── LICENSE
```
## 安装与运行
只需要 Python 3.10+ —— 没有外部依赖。
```
git clone https://github.com/Vanelko/SecLogAnalyzer.git
cd SecLogAnalyzer
# 分析日志并将报告输出到控制台
python src/main.py data/sample_logs/sample_security_log.json
# 同上 + 将报告保存到文件
python src/main.py data/sample_logs/sample_security_log.json -o report.txt
# 帮助
python src/main.py --help
```
## 报告示例
```
======================================================================
ОТЧЁТ ПО БЕЗОПАСНОСТИ — Windows Security Log Analyzer
======================================================================
Всего находок: 5
CRITICAL: 1
HIGH: 3
MEDIUM: 1
LOW: 0
======================================================================
[CRITICAL] Перебор пароля (bruteforce)
Правило: bruteforce_attack
На учётную запись jdoe совершено 5 неудачных попыток входа за 10 минут.
Связанных событий: 5
[HIGH] Создание учётной записи
Правило: privilege_changes
Была создана учётная запись newintern
Связанных событий: 1
...
```
## 输入数据格式
包含事件列表的 JSON 文件。每个事件的必填字段为 `EventID`、`TimeCreated`(ISO 8601)、`AccountName`;可选字段为 `LogonType`、`SourceIP`、`WorkstationName`:
```
[
{
"EventID": 4625,
"TimeCreated": "2026-07-09T14:20:05",
"AccountName": "jdoe",
"LogonType": 3,
"SourceIP": "203.0.113.10",
"WorkstationName": "WKS-042"
}
]
```
此格式与通过 `Get-WinEvent | ConvertTo-Json`(在选出所需字段后)转储 Security 日志的格式相对应,允许在可复现的数据上调试分析器。
## 测试
```
python -m unittest discover -s tests
```
35 个测试涵盖了:文件和事件验证(包括损坏的 JSON、空文件、缺失字段)、每条检测规则(触发、未触发、边界情况)、排序和报告内容、流水线组合以及 CLI 错误处理。专门针对开发期间发现的错误增加了回归测试:包括长系列攻击期间发现结果的重复问题,以及重复锁定时唯一账户的统计问题。
## 限制
该项目在第一版的范围内受到刻意限制:
- **输入仅限 JSON**,而不是“实时”的 Windows 日志或 EVTX 文件:分析器与数据收集分离,这简化了测试,但需要预先进行导出。
- **阈值在 constants.py 中固定** —— 没有用于覆盖它们的配置文件或 CLI 标志。
- **规则之间互不关联**:每条规则独立工作,攻击链(暴力破解 → 登录 → 提权)不会被链接为一个单一的安全事件。
- **每次运行仅分析一个日志** —— 不包含来自多台机器的事件聚合。
这些限制中的每一项都是已规划的下一步发展,请参阅 [ROADMAP.md](ROADMAP.md)。
## 文档
- [THEORY.md](docs/THEORY.md) — 相关主题笔记:Windows Security 日志、EventID、攻击模式、在 SOC 中的应用;
- [INTERVIEW.md](docs/INTERVIEW.md) — 用于准备该项目技术面试的问答;
- [DEVELOPMENT.md](docs/DEVELOPMENT.md) — 开发日志;
- [CHANGELOG.md](CHANGELOG.md) — 版本历史;
- [ROADMAP.md](ROADMAP.md) — 发展计划。
## 许可证
该项目基于 [MIT](LICENSE) 许可证发布。
## 作者
Ivan Bushuev — RTU MIREA 学生,“信息安全”专业。
标签:Python, URL发现, 安全检测, 安全运营, 扫描框架, 无后门, 红队行动, 逆向工具