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 规则汇总表——这是一个“单玻璃面板”的分诊视图。 ![SOC Overview dashboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/5c1ce17f43200451.png) ### 地磁 峰值 Kp 和 G 级指标(固定显示最近 7 天)、行星 K 指数历史、 IMF Bz/Bt 和太阳风速度/密度曲线、DONKI 90 天地磁暴 目录(每次事件的峰值 Kp),以及地磁告警时间轴。 ![Geomagnetic dashboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/20fdea1f54200505.png) ### 太阳活动 GOES X 射线通量(µW/m²,对数坐标——耀斑 C/M/X 级正好落在 10 的整次幂上) 和 ≥10 MeV 质子通量,旁边是 DONKI 耀斑/CME 目录和 近期事件表。 ![Solar Activity dashboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/06400d5433200519.png) ### Pipeline 健康 已摄入的事件总数、已触发的告警数、按数据源划分的文档直方图(最近 7 天)、 用于发现静默数据源的最近活动表,以及按数据集细分的数据摄入量。 ![Pipeline Health dashboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/a1500edf90200529.png) ## 路线图 - [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)
标签:Elastic Stack, 数据流水线, 气象数据, 流量重放, 版权保护, 请求拦截, 越狱测试, 逆向工具