Arthur-K-99/space-weather-siem
GitHub: Arthur-K-99/space-weather-siem
一个以太空天气事件为「威胁」的 SIEM 管道项目,借助 Elastic Stack 实现从数据摄入到告警可视化的完整检测工程闭环。
Stars: 0 | Forks: 0
# 太空天气 SIEM
一个完整的 SIEM(安全信息与事件管理) pipeline,其“威胁”是**太空天气事件**而非安全日志。
我们的核心赌注在于:太空天气在结构上与安全遥测数据完全相同——来自远程传感器的嘈杂实时数据流、严重程度各异的离散事件、需要标准化为统一 schema 的异构数据源、基于阈值触发检测的规则,以及构建于其上的告警与仪表板。本项目在免费、公开、schema 稳定且极具趣味性的数据上,实践了完整的检测工程闭环——**摄入 → 标准化 → 检测 → 告警 → 可视化**。
## 概念类比
| SIEM 概念 | 太空天气对应项 |
|---|---|
| 日志源 / endpoint | NOAA SWPC 实时数据流(GOES, DSCOVR),NASA DONKI |
| 日志采集 / 转发器 | 定时数据轮询器(Python collector) |
| 标准化为通用 schema (ECS) | 适用于所有数据流的基于 ECS 启发的事件 schema |
| 严重性分类 (low → critical) | NOAA G/R/S 等级(G1–G5, R1–R5, S1–S5) |
| 阈值检测规则 | Kp ≥ 5,X 射线通量 ≥ M 级,质子通量 ≥ 10 pfu |
| 多阶段攻击链 (kill chain) | 太阳耀斑 → CME → 地磁暴序列 |
| 告警去重 / 抑制 | 指纹告警,活动状态下不重复告警 |
| “日志源掉线”检测 | 遥测丢失规则(数据流静默时间超过 N × 周期) |
| 攻击模拟 / 紫队 | 历史性地重放 G5 强地磁暴(2024 年 5 月 Gannon 风暴) |
| SOC 仪表板 | Kibana:告警分诊、地磁、太阳活动、pipeline 健康 |
此外,每个告警背后的“实质性影响”都是具体且真实的:地磁暴会降低 GPS/GNSS 的精度并在电网中诱发电流,无线电黑障会中断 HF 通信,辐射风暴会损坏卫星并威胁极地航线航空安全。
## 架构
```
flowchart LR
A[NOAA SWPC
JSON feeds] --> C[collector
Python pollers] B[NASA DONKI
event catalog] --> C C -->|normalized events| E[(Elasticsearch
space-weather-events)] E --> D[detector
YAML rule engine] D -->|dedup + throttle| F[(space-weather-alerts)] E --> K[Kibana dashboards] F --> K ``` 通过 `docker-compose` 运行的四个容器:**elasticsearch**、**kibana**、**collector**、**detector**——外加一个用于应用 index templates/ILM 并导入仪表板的 bootstrap 脚本。 ## 数据源(全部免费) - **NOAA SWPC** (`services.swpc.noaa.gov`,无需 API key):行星 K 指数、太阳风等离子体和磁力计(DSCOVR)、GOES X 射线通量、GOES 质子通量、当前 NOAA 等级、官方告警。 - **NASA DONKI** (`api.nasa.gov/DONKI`,免费 key):太阳耀斑、CME、地磁暴、SEP 事件——为多阶段关联规则和历史回放提供数据支持。 ## 检测规则 规则以 YAML 格式存储在 [`rules/`](rules/) 中——即检测即代码,与其他代码一样需要经过审查: 1. **地磁暴 (Geomagnetic storm)** — Kp ≥ 5,严重程度映射至 G1–G5 2. **无线电黑障 (Radio blackout)** — GOES X 射线通量达到 M/X 级阈值 → R1–R5 3. **辐射风暴 (Radiation storm)** — ≥10 MeV 质子通量 ≥ 10 pfu → S1–S5 4. **风暴前兆 (Storm precursor)** — 南向 Bz ≤ −10 nT 持续 + 太阳风速度 > 600 km/s(关联) 5. **事件链 (Event chain)** — 耀斑 → 6 小时内发生 CME → 1–3 天内出现 Kp ≥ 5(多阶段关联) 6. **遥测丢失 (Telemetry loss)** — 数据流静默(经典的“日志源掉线”场景) ## 快速开始 ``` cp .env.example .env # set passwords; add a NASA API key for higher DONKI limits docker compose up -d # ES + Kibana, one-shot bootstrap (templates/ILM), then the collector ``` 这就是整个 pipeline:`bootstrap` 应用 index templates 和 ILM,`collector` 按照各自独立的周期(60 秒 / 5 分钟 / 15 分钟)轮询全部七个 SWPC 数据源和四个 NASA DONKI 目录,并将数据索引至 `space-weather-events`;`detector` 每分钟评估 [`rules/`](rules/) 中的 YAML 规则,将去重/抑制后的告警写入 `space-weather-alerts`。这六条规则涵盖了三种阈值检测(Kp / X 射线 / 质子风暴)、两种关联(Bz+风速构成的风暴前兆,以及耀斑→CME→风暴的事件链),以及一条数据源掉线的“遥测丢失”健康规则。你可以通过 `docker compose logs -f collector detector` 查看它们的运行状态。 Kibana 地址为——使用 `elastic` 作为用户名,并输入你的 `ELASTIC_PASSWORD` 登录。Bootstrap 步骤会导入四个现成的仪表板(**SOC 概览**、**地磁**、**太阳活动**、**Pipeline 健康**)——在菜单中打开 **Dashboards**,或直接访问 。关于各个仪表板的具体内容,请参阅 [`kibana/`](kibana/)。在 Linux 主机上,你需要先执行 `sysctl -w vm.max_map_count=262144`(Docker Desktop 和 OrbStack 会自动为你处理)。
如果要在 Docker 之外运行 collector(用于开发/测试),它会自动读取 `.env` 配置:
```
python -m venv .venv && .venv/bin/pip install -r collector/requirements.txt
.venv/bin/python -m collector --once # one pass over every feed, then exit
```
## 回填历史数据
Collector 会轮询较短的时间窗口(6小时 / 1天),以保持每次轮询的负载足够轻量,
因此全新的系统实例中几乎没有历史数据,仪表板看起来会很稀疏。
[`scripts/backfill.py`](scripts/backfill.py) 会用**真实**数据填充它们——包括
SWPC `*-7-day` 产品窗口(包含一周的 X 射线、质子和太阳风指标数据)
以及长期的 DONKI 回溯查询(涵盖数月真实的耀斑、CME 和风暴记录):
```
.venv/bin/python scripts/backfill.py # SWPC 7-day + DONKI 90 days
.venv/bin/python scripts/backfill.py --donki-days 30
```
它复用了 collector 的标准化器和幂等索引机制,因此重复运行是
安全的(重叠记录会被跳过)。拉宽 Kibana 的时间选择器即可查看
完整的 DONKI 目录历史记录。
## 重放 2024 年 5 月的 G5 风暴
太空天气通常处于平静期,因此这些规则极少在实时数据上触发——
在触发之前,仪表板的告警面板会一直处于空白状态。与其被动等待太阳活动,
不如重放一次历史风暴。[`scripts/replay.py`](scripts/replay.py) 会将**2024 年 5 月的 Gannon 风暴**(已提交的固定测试数据集位于 [`replay/`](replay/))传入
真实的标准化器进行处理,并将时间戳重设为*当前时间*,从而让 detector 观测到一次“实时”的 G5 事件:
```
.venv/bin/python scripts/replay.py # inject the storm at the current time
.venv/bin/python -m detector --once # evaluate — the storm rules fire
```
这相当于紫队/攻击模拟演练:一个你可以随时召唤用于演示的确定性突发事件。
风暴规则会立刻触发亮起——地磁暴 (G5)、太阳风暴链 (耀斑→CME→风暴)、无线电黑障 (R3)、辐射风暴 (S1) 和风暴前兆——并且去重后的告警会呈现在 **SOC 概览**仪表板上。第六条规则,即遥测丢失,属于*缺失*检测:当某个数据源真正陷入静默时它就会触发(为了演示该效果,重放脚本会刻意扣留等离子体数据流——详情请参阅其 [处理手册](docs/runbooks/telemetry_loss.md))。被重放的事件会被标记为 `replay`/`gannon-2024`,以便事后轻松筛选和过滤。
[`docs/runbooks/`](docs/runbooks/) 中包含了每个告警的分诊手册——详细说明了潜在影响与应对措施,每条规则各一份。
## 仪表板
四个 Kibana 仪表板以代码形式提供([`kibana/`](kibana/)),并在 bootstrap 步骤中执行导入。以下截图展示了填充真实回填数据和重放风暴数据后的效果。
### SOC 概览
处于开启状态的告警数、当前最高活动严重性、当前的 NOAA G/R/S 等级磁贴、
按严重性划分的告警时间轴、按类别显示的事件量,以及 Recent Alerts
规则汇总表——这是一个“单玻璃面板”的分诊视图。

### 地磁
峰值 Kp 和 G 级指标(固定显示最近 7 天)、行星 K 指数历史、
IMF Bz/Bt 和太阳风速度/密度曲线、DONKI 90 天地磁暴
目录(每次事件的峰值 Kp),以及地磁告警时间轴。

### 太阳活动
GOES X 射线通量(µW/m²,对数坐标——耀斑 C/M/X 级正好落在 10 的整次幂上)
和 ≥10 MeV 质子通量,旁边是 DONKI 耀斑/CME 目录和
近期事件表。

### Pipeline 健康
已摄入的事件总数、已触发的告警数、按数据源划分的文档直方图(最近 7 天)、
用于发现静默数据源的最近活动表,以及按数据集细分的数据摄入量。

## 路线图
- [x] **M0** — 仓库初始化:README、开源许可、CI 占位符
- [x] **M1** — 通过 docker-compose 配置 Elasticsearch + Kibana、index templates + ILM
- [x] **M2** — 首次摄入:Kp-index + X 射线数据流、标准化器 + 测试
- [x] **M3** — 全面摄入:所有 SWPC 数据源 + DONKI、幂等索引
- [x] **M4** — 检测引擎:YAML 规则、阈值规则 1–3、告警去重/抑制
- [x] **M5** — 关联与健康规则 4–6:风暴前兆、耀斑→CME→风暴事件链、遥测丢失
- [x] **M6** — Kibana 仪表板(以代码形式实现 4 个仪表板 → NDJSON,由 bootstrap 导入)
- [x] **M7** — 历史风暴重放 ([`scripts/replay.py`](scripts/replay.py)) + 每条规则对应的[处理手册](docs/runbooks/)
完整的实施计划详见 [docs/PLAN.md](docs/PLAN.md)。
## 开源许可
[MIT](LICENSE)
JSON feeds] --> C[collector
Python pollers] B[NASA DONKI
event catalog] --> C C -->|normalized events| E[(Elasticsearch
space-weather-events)] E --> D[detector
YAML rule engine] D -->|dedup + throttle| F[(space-weather-alerts)] E --> K[Kibana dashboards] F --> K ``` 通过 `docker-compose` 运行的四个容器:**elasticsearch**、**kibana**、**collector**、**detector**——外加一个用于应用 index templates/ILM 并导入仪表板的 bootstrap 脚本。 ## 数据源(全部免费) - **NOAA SWPC** (`services.swpc.noaa.gov`,无需 API key):行星 K 指数、太阳风等离子体和磁力计(DSCOVR)、GOES X 射线通量、GOES 质子通量、当前 NOAA 等级、官方告警。 - **NASA DONKI** (`api.nasa.gov/DONKI`,免费 key):太阳耀斑、CME、地磁暴、SEP 事件——为多阶段关联规则和历史回放提供数据支持。 ## 检测规则 规则以 YAML 格式存储在 [`rules/`](rules/) 中——即检测即代码,与其他代码一样需要经过审查: 1. **地磁暴 (Geomagnetic storm)** — Kp ≥ 5,严重程度映射至 G1–G5 2. **无线电黑障 (Radio blackout)** — GOES X 射线通量达到 M/X 级阈值 → R1–R5 3. **辐射风暴 (Radiation storm)** — ≥10 MeV 质子通量 ≥ 10 pfu → S1–S5 4. **风暴前兆 (Storm precursor)** — 南向 Bz ≤ −10 nT 持续 + 太阳风速度 > 600 km/s(关联) 5. **事件链 (Event chain)** — 耀斑 → 6 小时内发生 CME → 1–3 天内出现 Kp ≥ 5(多阶段关联) 6. **遥测丢失 (Telemetry loss)** — 数据流静默(经典的“日志源掉线”场景) ## 快速开始 ``` cp .env.example .env # set passwords; add a NASA API key for higher DONKI limits docker compose up -d # ES + Kibana, one-shot bootstrap (templates/ILM), then the collector ``` 这就是整个 pipeline:`bootstrap` 应用 index templates 和 ILM,`collector` 按照各自独立的周期(60 秒 / 5 分钟 / 15 分钟)轮询全部七个 SWPC 数据源和四个 NASA DONKI 目录,并将数据索引至 `space-weather-events`;`detector` 每分钟评估 [`rules/`](rules/) 中的 YAML 规则,将去重/抑制后的告警写入 `space-weather-alerts`。这六条规则涵盖了三种阈值检测(Kp / X 射线 / 质子风暴)、两种关联(Bz+风速构成的风暴前兆,以及耀斑→CME→风暴的事件链),以及一条数据源掉线的“遥测丢失”健康规则。你可以通过 `docker compose logs -f collector detector` 查看它们的运行状态。 Kibana 地址为
标签:Elastic Stack, 数据流水线, 气象数据, 流量重放, 版权保护, 请求拦截, 越狱测试, 逆向工具