gripebomb/ThreatDeck

GitHub: gripebomb/ThreatDeck

一款基于 Rust 终端 UI 的威胁情报多源聚合、关键词匹配与自动告警平台。

Stars: 0 | Forks: 0

# ThreatDeck

基于终端的威胁情报监控和警报平台
面向 SOC、安全研究人员和威胁情报分析师

Rust 1.75+ Platform

## 仪表盘预览 image ## 订阅源预览 image ## 警报预览 image ## 文章预览 image ## 关键词预览 image ## 标签预览 image ## 功能特性 - **多源订阅源管理** — 聚合来自 API、RSS/Atom 订阅源、网站抓取以及通过 Tor 访问的 `.onion` 站点的威胁情报 - **JSONPath API 模板** — 使用可配置的 JSONPath 表达式从 JSON API 中提取结构化数据(包括标题、描述、日期、URL 和来源字段) - **关键词匹配** — 基于简单文本或正则表达式的关键词匹配,支持 4 个严重级别(低、中、高、严重) - **警报生成** — 自动创建警报并支持去重(内容哈希)、摘要提取和元数据保留 - **文章缓存订阅** — 浏览 RSS/API 源中的每个缓存条目,并直接在终端中阅读清洗后的文章文本 - **标签系统** — 使用带有颜色的自定义标签来组织订阅源、关键词和警报 - **通知** — 通过电子邮件 (SMTP)、Webhook 或 Discord 发送警报,支持为每个通知渠道设置最低严重级别阈值 - **仪表盘概览** — 便捷的统计视图、严重程度分布、近期警报和 7 天趋势可视化 - **订阅源健康监控** — 跟踪连续失败次数、健康状态(健康/警告/错误/已禁用)以及详细的健康日志 - **设置管理** — 警报保留策略、主题选择、通知渠道配置 - **5 款内置主题** — dark、light、solarized、dracula、monokai ## 安装说明 ### 从源代码安装 (Cargo) 要求 Rust 1.75 或更高版本。 ``` # 克隆仓库 git clone https://github.com/gripebomb/ThreatDeck.git cd ThreatDeck # 构建和安装 cargo install --path . # 或直接从 git 安装 cargo install --git https://github.com/gripebomb/ThreatDeck.git ``` 该二进制文件将作为 `ThreatDeck` 安装在您的 Cargo bin 目录中(通常为 `~/.cargo/bin/`)。 ### 从源代码构建 ``` git clone https://github.com/gripebomb/ThreatDeck.git cd ThreatDeck # Debug 构建 cargo build # Release 构建(已优化) cargo build --release # Binary 位置 target/release/ThreatDeck ``` ## 快速入门 ### 首次运行 首次启动时,`ThreatDeck` 会自动创建其配置和数据目录: ``` ThreatDeck ``` 默认路径: - **配置文件**: `~/.config/ThreatDeck/config.toml` - **数据库**: `~/.local/share/ThreatDeck/ThreatDeck.db` 要查看您系统上的确切路径: ``` ThreatDeck --config-paths ``` ### 添加订阅源 1. 启动应用程序:`ThreatDeck` 2. 按 `2` 导航至 **Feeds** (订阅源) 界面 3. 按 `a` 添加新的订阅源 4. 填写订阅源详情(使用 Tab 键切换字段,Enter 键保存): - **Name (名称)**: 订阅源的描述性名称 - **URL**: 订阅源的 endpoint URL - **Type (类型)**: API、RSS、Website 或 Onion - **Interval (间隔)**: 轮询间隔,以秒为单位(最少 60 秒) - 对于 API 订阅源:选择一个 API 模板并视情况提供 API 密钥 - 对于 Onion 订阅源:配置 Tor 代理(例如,`socks5h://127.0.0.1:9050`) ### 创建关键词 1. 按 `4` 导航至 **Keywords** (关键词) 界面 2. 按 `a` 添加关键词 3. 进行配置: - **Pattern (模式)**: 用于匹配的文本或正则表达式模式 - **Type (类型)**: 简单文本 (Simple text) 或正则表达式 (Regex) - **Case Sensitive (区分大小写)**: 匹配时是否区分大小写 - **Criticality (严重性)**: 低、中、高或严重 4. 在保存之前按 `t` 可针对样例输入测试该模式 ### 查看警报 1. 按 `3` 导航至 **Alerts** (警报) 界面 2. 使用 `j`/`k` 或方向键浏览警报 3. 按 `r` 切换已读/未读状态 4. 按 `R` 将所有警报标记为已读 5. 按 `d` 删除单个警报,按 `D` 进入批量删除模式 ## 配置 配置文件存储在 `~/.config/ThreatDeck/config.toml`: ``` theme = "dark" # dark, light, solarized, dracula, monokai alert_retention_days = 30 # Auto-delete alerts older than N days dashboard_refresh_secs = 30 # Dashboard data refresh interval tick_rate_ms = 250 # UI tick rate (lower = more responsive) max_health_log_entries = 100 # Maximum feed health log entries to retain ``` ### 主题设置 通过设置界面 (`7`) 动态更改主题,或者直接编辑 `config.toml`: | 主题 | 描述 | |-----------|------------------------------------------| | `dark` | 默认深色主题,色调柔和 | | `light` | 适用于明亮终端的简洁浅色主题 | | `solarized` | Ethan Schoonover 的 Solarized Dark 主题 | | `dracula` | 流行的 Dracula 配色方案 | | `monokai` | 经典的 Monokai 语法高亮主题 | ## 订阅源类型 ### API (配合 JSONPath 模板) 对于 JSON REST API,使用 JSONPath 表达式提取字段。内置了两个模板: | 模板 | 标题路径 | 描述路径 | 日期路径 | URL 路径 | |---------------|-------------------|------------------|-----------------|------------| | Ransomfeed.it | `$.post_title` | `$.description` | `$.discovered` | `$.source` | | RansomLook | `$.name` | `$.description` | `$.published` | `$.url` | 可以通过 SQL 或 API 创建自定义模板。`pagination_config` 字段支持 offset/limit 和基于页码的分页策略。 **API 订阅源配置示例:** - URL: `https://api.ransomfeed.it/v1/posts` - 类型: `API` - 模板: `Ransomfeed.it` - 间隔: `300`(5 分钟) ### RSS / Atom 系统会自动解析标准的 RSS 2.0 和 Atom 1.0 订阅源。只需提供订阅源 URL 并选择类型为 `RSS`。 **RSS 订阅源示例:** - `https://feeds.securityweek.com/securityweek` - `https://www.bleepingcomputer.com/feed/` ### 网站抓取 对于没有结构化订阅源的 HTML 页面,抓取器会从页面主体提取文本内容以进行关键词匹配。提供目标 URL 并选择类型为 `Website`。 **示例:** - URL: `https://www.cisa.gov/news-events/cybersecurity-advisories` - 类型: `Website` - 间隔: `600`(10 分钟) ### Onion / Tor 通过 Tor SOCKS5 代理访问 `.onion` 威胁情报源。配置 Tor 代理地址(默认为:`socks5h://127.0.0.1:9050`)并提供一个 `.onion` URL。 **前提条件:** 必须在本地运行带有 SOCKS5 监听器的 Tor。 **示例:** - URL: `http://ransomxifxwc5ste.onion/posts` - 类型: `Onion` - Tor 代理: `socks5h://127.0.0.1:9050` ## 键盘快捷键 ### 全局按键 | 按键 | 操作 | |----------------|---------------------------------------------| | `1` | 仪表盘界面 | | `2` | 订阅源界面 | | `3` | 警报界面 | | `4` | 文章界面 | | `5` | 关键词界面 | | `6` | 标签界面 | | `7` | 日志界面 | | `8` | 设置界面 | | `q` | 退出应用程序 | | `?` / `F1` | 切换帮助覆盖层 | | `Esc` | 取消当前操作 / 返回上一级 | ### 仪表盘 | 按键 | 操作 | |----------------|---------------------------------------------| | `r` | 刷新仪表盘数据 | | `1-8` | 导航至其他界面 | ### 订阅源 | 按键 | 操作 | |----------------|---------------------------------------------| | `j` / `↓` | 向下移动选择项 | | `k` / `↑` | 向上移动选择项 | | `a` / `n` | 添加新的订阅源 | | `e` | 编辑选定的订阅源 | | `d` | 删除选定的订阅源 (需确认) | | `m` | 触发手动抓取 | | `t` | 为订阅源分配标签 | | `Enter` | 查看订阅源详情 | | `Space` | 切换订阅源的启用/禁用状态 | | `/` | 过滤订阅源 | | `s` | 切换排序方式 | ### 警报 | 按键 | 操作 | |----------------|---------------------------------------------| | `j` / `↓` | 向下移动选择项 | | `k` / `↑` | 向上移动选择项 | | `r` | 切换已读/未读状态 | | `R` | 将所有警报标记为已读 | | `d` | 删除选定的警报 | | `D` | 进入批量删除模式 | | `t` | 为警报分配标签 | | `/` | 过滤警报 | **批量模式 (在按下 `D` 之后):** | 按键 | 操作 | |----------------|---------------------------------------------| | `Space` | 切换当前警报的选择状态 | | `a` | 选择所有警报 | | `d` | 删除选定的警报 | | `Esc` | 退出批量模式 | ### 文章 | 按键 | 操作 | |----------------|---------------------------------------------| | `j` / `↓` | 向下移动选择项 | | `k` / `↑` | 向上移动选择项 | | `Enter` | 如有需要则抓取全文,然后打开阅读器 | | `r` | 切换已读/未读状态 | | `u` | 切换“仅显示未读”过滤器 | | `/` | 过滤缓存的文章 | | `Esc` | 关闭文章阅读器 | ### 关键词 | 按键 | 操作 | |----------------|---------------------------------------------| | `j` / `↓` | 向下移动选择项 | | `k` / `↑` | 向上移动选择项 | | `a` / `n` | 添加新的关键词 | | `e` | 编辑选定的关键词 | | `d` | 删除选定的关键词 | | `t` | 针对样例输入测试模式 | | `Enter` | 切换关键词的启用/禁用状态 | ### 标签 | 按键 | 操作 | |----------------|---------------------------------------------| | `j` / `↓` | 向下移动选择项 | | `k` / `↑` | 向上移动选择项 | | `a` / `n` | 添加新的标签 | | `e` | 编辑选定的标签 | | `d` | 删除选定的标签 | ### 日志 | 按键 | 操作 | |----------------|---------------------------------------------| | `j` / `↓` | 向下移动选择项 | | `k` / `↑` | 向上移动选择项 | ### 设置 | 按键 | 操作 | |----------------|---------------------------------------------| | `Tab` | 在“常规/通知”选项卡之间切换 | ### 表单 (添加/编辑) | 按键 | 操作 | |----------------|---------------------------------------------| | `Tab` | 下一个字段 | | `Shift+Tab` | 上一个字段 | | `Enter` | 保存 | | `Esc` | 取消并关闭表单 | ## 架构概览 ``` ThreatDeck/ ├── src/ │ ├── main.rs # CLI args, terminal setup, main event loop │ ├── app.rs # Application state, screen navigation, key routing │ ├── config.rs # Config file (TOML) loading and saving │ ├── db.rs # SQLite database operations (rusqlite) │ ├── types.rs # Core data structures and enums │ ├── theme.rs # Color theme definitions │ ├── schema.sql # Database schema with default data │ ├── scheduler.rs # Background feed polling scheduler │ ├── notify.rs # Notification channels (Email, Webhook, Discord) │ ├── alert.rs # Alert processing and deduplication logic │ ├── keyword.rs # Keyword matching engine (text + regex) │ ├── tag.rs # Tag management │ ├── template.rs # API template management │ ├── ai.rs # AI/ML analysis integration placeholder │ ├── feed/ # Feed processing modules │ │ ├── mod.rs # Feed dispatcher and common types │ │ ├── api.rs # JSON API feed fetcher with JSONPath │ │ ├── rss.rs # RSS/Atom feed parser │ │ ├── web.rs # Website HTML scraper │ │ ├── onion.rs # Tor/onion site fetcher │ │ └── utils.rs # Feed utility functions │ └── ui/ # TUI rendering modules │ ├── mod.rs # Main draw dispatcher, help, notifications │ ├── dashboard.rs # Stats, pie chart, recent alerts, trend │ ├── feeds.rs # Feed list, add/edit form │ ├── alerts.rs # Alert list, bulk operations │ ├── keywords.rs # Keyword list, test mode │ ├── tags.rs # Tag management screen │ ├── logs.rs # Feed health log viewer │ ├── settings.rs # General settings and notifications │ └── utils.rs # UI helper functions ├── Cargo.toml └── README.md ``` ### 核心设计决策 - **SQLite (内置)**: 零外部依赖的自包含数据库;启用内置特性的 rusqlite 确保了跨平台构建的一致性 - **ratatui + crossterm**: 具异步事件处理能力的跨平台终端 UI 框架 - **用于 API 的 JSONPath**: 无需为每个订阅源编写自定义解析器即可进行声明式数据提取 - **内容哈希**: 基于SHA-256的去重机制可防止相同内容产生重复警报 - **模块化订阅源引擎**: 每种订阅源类型都实现了通用接口,便于轻松添加新的来源 ## 开发 ### 前置条件 - Rust 1.75+ 及 Cargo - sqlite3 命令行工具 (用于 `demo-seed.sh`) ### 构建 ``` # Debug 构建 cargo build # 带优化的 Release 构建 cargo build --release # 使用 cargo 运行 cargo run # 运行并打印 config 路径 cargo run -- --config-paths ``` ### 测试 ``` # 运行所有测试 cargo test # 运行并输出 cargo test -- --nocapture ``` ### 代码质量 ``` # Format 检查 cargo fmt --check # 应用 Format cargo fmt # 运行 Clippy lints cargo clippy -- -D warnings # 开启所有 features 运行 Clippy cargo clippy --all-targets --all-features -- -D warnings ``` ### 填充演示数据 提供了一个辅助脚本用于向数据库填充逼真的演示数据: ``` # 使用默认 database 路径 ./demo-seed.sh # 或指定自定义 database 路径 ./demo-seed.sh /path/to/custom.db ``` 这会创建 6 个订阅源、8 个关键词、15 条警报以及用于测试和演示的标签分配。 ### 数据库 Schema 应用程序使用以下 SQLite Schema(参见 `src/schema.sql`): - **feeds** — 带有健康跟踪的订阅源 - **api_templates** — JSONPath 提取模板 - **keywords** — 带有严重级别的匹配模式 - **alerts** — 带有去重哈希的已生成警报 - **tags** — 带有颜色的标签 - **feed_tags / keyword_tags / alert_tags** — 多对多标签分配 - **notifications** — 通知渠道配置 - **feed_health_logs** — 每个订阅源的健康状态历史记录 ## 许可证 本项目采用 [MIT 许可证](LICENSE) 进行授权。

使用 ratatui 和 Rust 构建。

标签:API集成, Atom, Feed管理, JSONPath, .onion, RSS, Rust, Tor, TUI, 关键词匹配, 去重, 可观测性, 可视化界面, 告警平台, 告警生成, 威胁情报, 威胁情报分析师, 安全研究员, 安全运营中心, 实时处理, 开发者工具, 开源安全工具, 情报聚合, 数据提取, 文章缓存, 终端UI, 网站抓取, 网络安全, 网络映射, 网络流量审计, 逆向工程平台, 通知系统, 隐私保护