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, 云资产可视化, 图形渲染, 桌面应用, 测试用例