ChristianPresley/threat-dashboard
GitHub: ChristianPresley/threat-dashboard
一款基于 Zig + Vulkan 构建的 SOC 桌面应用,为安全分析师提供威胁分诊、狩猎、检测规则管理与威胁情报一体化的工作环境。
Stars: 0 | Forks: 0
# threat-dashboard
一款威胁狩猎、检测和管理的桌面应用程序 — Zig + Vulkan + Dear ImGui (docking),其工作区/窗口框架移植自交易仪表板:支持吸附/停靠的窗口、标签页、F 键工作区、快捷键、防崩溃的布局持久化、命令行 + 模糊搜索面板,以及通过注册表生成的 HELP 目录。
## 环境要求
- **Zig 0.16.0+**(与交易代码库构建时使用的工具链相同)
- **LunarG Vulkan SDK ≥ 1.3.296**,并设置 `VULKAN_SDK` 环境变量(Debug 构建会将验证层复制到 exe 旁边;`zig build vulkan-layers` 会强制仅执行该步骤)
- Windows(渲染器和持久化使用 win32 路径)
## 构建与运行
```
zig build # builds zig-out/bin/threat-dashboard.exe
zig build run # build + launch (mock world, seed 42)
zig build test # unit tests (ui, domain, data, ai)
```
实用参数:
| 参数 | 效果 |
|---|---|
| `--seed ` | 模拟世界种子 — 相同的种子 ⇒ 字节完全一致的世界 |
| `--state-dir ` | 存放 `layout.ini` + `ui_state.json` 的位置(默认:cwd) |
| `--pg ` | 从 PostgreSQL 加载世界,而不是使用模拟生成器 |
| `--selftest` | 无头模式数据路径 + 布局往返自测(以内存泄漏为门控) |
| `--mcp-check` | 启动威胁情报 MCP 服务器,列出其工具,然后退出 |
| `--validate` | 强制循环遍历每个工作区/面板进行有限运行,然后退出 |
| `--screenshot ` | `--validate` + 为每个工作区生成一张 PNG |
| `--tour ` | 脚本化引导导览捕获(静态图像 + 用于演示的 GIF 图片流) |
| `--window WxH`, `--dpi-scale `, `--mailbox`, `--demo` | 参见 `--help` |
## 工作区 (F1–F5)
| 按键 | 工作区 | 面板 |
|---|---|---|
| F1 | TRIAGE | 态势总结 · 告警队列 · 案例 · 时间线 · 传感器健康 · 日志 · 任务 |
| F2 | HUNT | 事件搜索 · 时间线 · 进程树 · 网络 · IOC 列表 · 日志 · 任务 |
| F3 | DETECT | 检测规则 · ATT&CK 矩阵 · YARA 规则 · 规则调优 · 告警队列 · 日志 |
| F4 | INTEL | 情报源 · IOC 列表 · IOC 富化 · 威胁行为者 · 案例 · 日志 |
| F5 | OPS | 传感器健康 · 摄取统计 · 数据流水线 · 任务 · 审计追踪 · 告警队列 · 日志 |
## 检测工程与威胁情报
- **YARA 规则即代码** (`YAR`, DETECT):一个包含 7 字段元数据策略和每条规则 5 个 CI 门控的规则库 — 编译(警告即错误)、元数据、真阳性测试用例、假阳性语料库,以及 50 毫秒性能预算 — 汇总为 A–F 质量等级。ATT&CK 矩阵会标记由活动 YARA 规则覆盖的技术。
- **IOC 富化** (`ENR`, INTEL):判定结果、多引擎检测率、信誉度、托管/whois 上下文、url-scan 生命周期,以及向已接触指标(indicator)的透视。默认使用确定性模拟数据;相同的数据结构会通过威胁情报 MCP 服务器从实时的 VirusTotal/urlscan 查询中填充。
## 数据流水线 (dbt 风格 ELT)
`PIP` (OPS) 端到端管理数据处理流水线:注册**源**(PostgreSQL、MySQL、MSSQL、S3、Kafka、syslog、REST API、CSV 导出 — 带有连接状态探测),遵循 dbt 约定链接**转换模型**(`stg_*` 暂存视图 → `int_*` 增量模型 → `mart_*` 表,支持去重/过滤/富化/连接/聚合/脱敏步骤类型以及针对模型的物化),并将结果落入**接收端**(PostgreSQL、Elasticsearch、ClickHouse、S3 Parquet 或 Kafka topic)。每个流水线都带有一个 **dbt 风格测试套件**(`not_null`、`unique`、`accepted_values`、`relationships`、源 `freshness`),其通过/失败结果和失败行计数会显示在运行历史记录旁边(输入行 → 输出行、拒绝行、持续时间)。构建器部分可从已注册的源创建新流水线;运行以异步任务执行,且变更通过与其他所有内容相同的 Store 写入钩子镜像同步到 PostgreSQL。
流水线会自动运行:**调度器**会自动将到期运行加入队列(根据流水线的节奏),每个流水线都带有一个 **watermark**(落入接收端的最新数据),其延迟会驱动新鲜度测试,而被拒绝的行会溢出到 **dead-letter queue** 中,并提供每一行的样本供分析师重放或丢弃。接收端健康状态(上次落入时间、行数/24 小时、watermark 延迟)会按每个流水线显示。
## 任务、审计与 SLA 指标
- **任务队列** (`JOB`, 大多数工作区):异步工作是一个真正的队列 — N 个并发槽位、排队/运行中/完成/失败/取消状态、FIFO 晋升、带清理的取消(取消的运行/同步/富化绝不会残留半开放状态),以及有限的终端历史记录。情报源同步可按单个源或全队列运行;保留清理会修剪旧的运行历史和已处理的 dead letter。
- **审计追踪** (`AUD`, OPS):监管链 — 每个分析师和系统操作(确认、规则开关、案例移动、情报源同步、流水线操作)都会在 Store 变更 choke point 记录下来,包含 谁 · 什么 · 何时。该记录存在于可替换的 Store 状态之外,因此 PostgreSQL 快照刷新永远不会将其抹除 — 并且在 `--pg` 下,它会镜像到 `audit_log` 表并在启动时重新加载,因此它也能在重启后保留。
- **分类处理 SLA** (`PST`):告警带有确认/解决时间戳;态势总结会显示根据它们计算出的真实 MTTA 和 MTTR。
## AI 助手
`Ctrl+Shift+A` 会打开一个内嵌的 Claude 聊天界面,其中包含一个代理工具使用循环:只读仪表板工具(告警、事件、IOC、规则、YARA、ATT&CK 覆盖率、传感器),以及通过 stdio 代理到 [threatintel-mcp](https://github.com/ChristianPresley) 的 `ti_*` 威胁情报工具。
配置仅通过环境变量进行:
```
set ANTHROPIC_API_KEY=... # required — enables the assistant
set TD_AI_MODEL=claude-sonnet-5 # optional
set TD_MCP_CMD=threatintel-mcp --transport stdio # optional override
set VT_API_KEY=... & set URLSCAN_API_KEY=... # optional, live intel
```
所有网络 I/O 都在懒惰生成的工作线程上运行;`--selftest`、`--validate` 和 CI 绝不会触碰网络。工具是只读的,威胁情报输出被视为不受信任的状态,并在显示时进行无害化(defanged)处理。
每个面板都有一个简短的 CODE (`ALQ`, `EVT`, `RUL`, …) — 在命令行中输入它(`Ctrl+K` 或 `/`)并按回车键。`?` 会打开 HELP 目录,其中包含完整的键盘映射。面板可自由拖拽/停靠/标签化;`RESET` 会重建活动工作区的预设;`Ctrl+S` 会为布局 + UI 状态生成快照。
## 数据
v1 附带了一个**确定性模拟世界**(昼夜遥测 + 脚本化的事件链:网络钓鱼 → 宏 → PowerShell → C2 → 凭据转储 → 横向移动 → 数据窃取),因此每个面板都已填充数据,并且跨面板链接(时间线刷选 → 事件搜索,ATT&CK 单元格 → 规则,事件 → 进程树)能讲述连贯的故事。
### PostgreSQL
```
# 一次性:使用 mock world 填充数据库
threat-dashboard pgload --pg postgres://postgres:pass@localhost:5432/postgres
# 针对其运行 — panel actions(ack、rule toggles、case moves)写回
threat-dashboard --pg postgres://postgres:pass@localhost:5432/postgres
```
Schema 位于 `src/data/schema.sql` 中(在连接时以幂等方式应用)。如果数据库不可访问,应用程序会降级到模拟世界并显示严重警告横幅 — UI 绝不会随着数据库而崩溃。
在初始加载后,一个**后台工作线程**拥有数据库连接(`src/data/pg_worker.zig`):面板变更会排队给它,而不是阻塞渲染线程,并且每 5 秒它会加载一个新快照供渲染线程替换 — 外部写入(摄取、其他分析师)无需重启即可显示。变更序列防护会丢弃任何与面板写入发生竞争的快照,因此刷新永远不会撤销您刚刚执行的操作。如果连接断开,工作线程会进行带退避(backoff)的重连,并重新加载数据库的最终真实状态。
## 布局持久化
ImGui 自身的 ini 写入器已禁用;`src/ui/layout.zig` 会在有改动时每 60 秒、在工作区切换时以及在退出时,以防崩溃的方式(临时文件 + 原子重命名)保存 `layout.ini`。`ui_state.json` 用于持久化活动工作区、种子和过滤器。
标签:SOC平台, Vulkan, YARA, Zig, 云资产可视化, 图形渲染, 桌面应用, 测试用例