dr4gon123/flores
GitHub: dr4gon123/flores
FLORES 从 FortiGate 官方文档中提取日志字段定义,生成结构化 CSV 数据集并映射到 ECS/OCSF schema,帮助团队构建可靠的日志归一化管道。
Stars: 4 | Forks: 1
# FLORES — FortiGate 日志消息参考抓取器
FLORES 从 Fortinet 官方的 Log Message Reference 文档中提取 FortiGate 日志字段文档,并将其转换为整洁、结构化的 CSV 数据集。它专为需要机器可读的 syslog schema 以进行解析器开发、日志规范化或字段参考的安全工程师和数据团队而设计。
Schema 规范化使得防火墙日志在现代安全体系中变得可查询、可关联且可操作。将 FortiGate 日志字段针对 ECS、OCSF 或自定义 schema 进行规范化,需要跨越 Traffic、Event 和 UTM 日志类型中数百个 LOGID 的确切字段名称、数据类型和描述——而这些信息被 Fortinet 分散在了各个次要版本的文档页面中。
FLORES 提供了完整的 pipeline:收集、整合并追踪次要版本间的 schema 变化,然后将其转换为准备好用于您的规范化工作流的 ECS 和 OCSF 字段映射。
## 快速开始
所有抓取的数据和生成的输出均已提交到此仓库中——您可以直接使用这些 CSV 和 Markdown 文件,无需运行任何内容。
要添加新的 FortiOS 版本或重新生成输出:
```
pip install httpx[http2] beautifulsoup4 pandas lxml pyyaml
python3 fortigate_scraper.py # scrape Fortinet docs
python3 generate_changelog.py # changelogs, field matrices, consolidated CSVs, INDEX.md
python3 generate_ecs_mappings.py # ECS mapping CSVs
```
输出将存放在当前工作目录下的大版本子目录(例如 `7.6/`)中。
## 输出
```
INDEX.md # root index: all versions, all sections
{major}/ # e.g. 7.6/
INDEX.md # per-major index: changelog, fields, ECS, matrices
{minor}/ # e.g. 7.6.4/
LOGID/ # one CSV per LOGID
{LOGID_description}.csv
CHANGELOG.md # intra-version conflicts + inter-version diffs
traffic_matrix.csv # field × subtype occurrence counts
event_matrix.csv
utm_matrix.csv
fields/
traffic_fields.csv # consolidated across all minor versions
event_fields.csv
utm_fields.csv
action_descriptions.csv # UTM action field variants (one column per subtype)
ECS/
traffic_ecs.csv # FortiGate fields mapped to ECS targets
event_ecs.csv
utm_ecs.csv
```
**`{LOGID_description}.csv`** — 从 Fortinet 文档中抓取的单个 LOGID 的原始日志字段表。
列:`Type`、`Log Field Name`、`Description`、`Data Type`。
**`fields/{log_type}_fields.csv`** — 聚合了该大版本下所有次要版本的某种日志类型的整合字段参考。当某个字段在不同 subtype 下有不同的描述时,每种变体都会被标记为 `subtype: description`。
**`CHANGELOG.md`** — 记录次要版本的更新日志,包含版本内描述冲突(相同字段名,跨 LOGID 的不同描述)和跨版本差异(自上一个次要版本以来添加或删除的字段和 LOGID)。
**`{log_type}_matrix.csv`** — field × subtype 矩阵,显示哪些字段出现在哪些 subtype 中,并附带出现次数。列标题是该版本确定的 subtype 列表。
## 索引文件
两个层级的 `INDEX.md` 提供了进入该仓库的可导航入口:
**[INDEX.md](INDEX.md)** — 涵盖所有大版本的根索引。对于每个大版本,它列出了:
- **Changelog** — 指向各次要版本 `CHANGELOG.md` 的链接
- **Consolidated Fields** — 指向 `fields/{log_type}_fields.csv` 的链接
- **ECS** — 指向 `ECS/{log_type}_ecs.csv` 的链接
- **Field Occurrence Matrix** — 指向 `traffic_matrix.csv · event_matrix.csv · utm_matrix.csv` 的次要版本链接
**`{major}/INDEX.md`** (例如 [7.6/INDEX.md](7.6/INDEX.md)) — 作用域限定于单个大版本的相同章节,包含相对于该文件夹的链接。
这两个文件均由 `python3 generate_changelog.py --index` 自动生成。
## Elastic Common Schema (ECS) 映射
FortiGate 字段通过对照 Elastic Common Schema (ECS) 进行交叉引用,以便用于 SIEM 的摄取和规范化。
| 日志类型 | 状态 | 输出 |
|----------|--------|--------|
| Traffic | 已映射 45/295 个字段 | `{major}/ECS/traffic_ecs.csv` |
| Event | 已映射 22/404 个字段 | `{major}/ECS/event_ecs.csv` |
| UTM | 已映射 51/567 个字段 | `{major}/ECS/utm_ecs.csv` |
在抓取新版本后,运行 `python3 generate_ecs_mappings.py` 以重新生成 ECS CSV。
有关映射表示法、覆盖范围详情、有意未映射的字段以及扩展映射的指南,请参见 [FIELD_NAMING_NORMALIZATION.md](FIELD_NAMING_NORMALIZATION.md)。
## 配置
编辑 `fortigate_scraper_config.yaml` 以自定义行为:
| 设置 | 默认值 | 效果 |
|---------|---------|--------|
| `base_delay` | `1.0` | HTTP 请求之间的秒数(速率限制) |
| `max_retries` | `3` | 每个URL发生错误后的额外尝试次数(`0` = 不重试) |
| `retry_backoff` | `2.0` | 指数退避乘数:`base_delay × (backoff ^ attempt)` |
| `concurrency` | `5` | 每个版本的最大并行 LOGID 获取数(`asyncio.Semaphore`) |
| `force_rescrape` | `false` | 重新抓取本地已存在的版本 |
| `dry_run` | `false` | 仅记录抓取计划,不获取任何页面 |
| `output_dir` | `"."` | 所有输出的根目录 |
## 添加新的 FortiOS 版本
在 `fortigate_scraper_config.yaml` 中的 `versions` 下添加一个新条目:
```
versions:
- "7.6.7"
```
除非设置 `force_rescrape: true`,否则 FLORES 将跳过本地已存在的版本。
## FortiGate 文档说明
FortiGate 的日志 schema 在结构上具有异构性,这给规范化 pipeline 带来了复杂性。UTM subtype 是独立开发的:仅 `action` 字段在 16 个 subtype 中就具有不同的值和长度,并且其中六个 subtype 根本没有对其进行描述。GTP 日志在结构上与 UTM 的其余部分不兼容(字段类型冲突,约 150 个未记录字段)。该 schema 并非单向棘轮——在次要版本之间,字段和 LOGID 都会被添加和移除,且日志流中未嵌入任何版本字段。LOGID 分类法没有一致的规则:某些 subtype 将结果编码在单独的 LOGID 中(VideoFilter、DNS、CASB),其他则将其编码在 `action` 字段中(Anomaly、Virus),而 SIEM 必须知道 subtype 遵循哪种模式才能正确分类事件。
每一个结构性发现、字段冲突和 schema 演化细节都记录在 [ANALYSIS.md](ANALYSIS.md) 中,按日志类型组织,并包含 LOGID 分布、字段计数、跨类型冲突以及各次要版本更改计数的表格。
## 面向开发者与维护者
请参阅 [DEVELOPERS_GUIDE.md](DEVELOPERS_GUIDE.md) 了解:
- 架构概述和 pipeline 演练
- 数据流图(scraper → changelog → fields → ECS)
- 关键方法参考
*对 FortiGate 不感兴趣?看看 [PALOS - PAN-OS 日志抓取器](https://github.com/dr4gon123/palos)*
标签:ECS, OCSF, PB级数据处理, Python, Terraform, 安全运维, 恶意代码分类, 数据清洗, 数据规范化, 无后门, 日志处理, 运行时操纵, 逆向工具, 防火墙日志