jly-engineer/threat_intelligence_app

GitHub: jly-engineer/threat_intelligence_app

这是一个面向MSP运营商的自托管威胁情报聚合平台,旨在整合CISA KEV、NVD及安全RSS源,提供统一的CVE追踪、补丁建议和威胁新闻仪表板。

Stars: 0 | Forks: 0

# ThreatPilot 一个面向 MSP 运营商的自托管威胁情报聚合平台。ThreatPilot 从外部威胁情报源(CISA KEV、安全 RSS)拉取数据,进行标准化处理,并展示一个每日更新的仪表板,显示活跃的 CVE、补丁建议、威胁参与者活动以及安全新闻信号分析。 ## 功能 - **CVE 追踪** — 接入 CISA 已知利用漏洞 (KEV) 源,包含严重性评分、CVSS 和 EPSS 数据 - **补丁队列** — 为您监控的软件清单自动生成优先级补丁建议 - **新闻聚合** — 从安全 RSS 源(Bleeping Computer、Krebs on Security、Qualys Blog)拉取新闻并附带信号评级 - **监控应用** — 定义您的软件栈;CVE 会自动与其进行匹配 - **每日报告** — 生成过去 24 小时的 CVE 和新闻的 PDF 摘要 - **定时任务** — 源获取、报告生成和清理通过 APScheduler 自动运行 - **暗色 UI** — Bootstrap 5 暗色主题,配备 Chart.js 仪表板和 HTMX 驱动的交互 ## 技术栈 | 层级 | 技术组件 | |---------------|-----------------------------------------| | 框架 | Flask 3.x | | ORM | Flask-SQLAlchemy / SQLAlchemy 2.0 | | 迁移 | Flask-Migrate / Alembic | | 数据库 | MySQL 8.0 | | 认证 | Flask-Login + Werkzeug | | 调度器 | APScheduler | | HTTP 客户端 | httpx | | RSS 解析 | feedparser | | PDF 报告 | WeasyPrint | | 前端 | Jinja2 + HTMX + Chart.js + Bootstrap 5 | ## 安装说明 ### 前置条件 - [Docker](https://docs.docker.com/get-docker/) 24+ - [Docker Compose](https://docs.docker.com/compose/install/) v2(包含在 Docker Desktop 中) - Git ### 1. 克隆仓库 ``` git clone https://github.com/jly-engineer/threat_intelligence_app.git threatpilot cd threatpilot ``` ### 2. 配置环境 ``` python3 -c "import secrets; print(secrets.token_hex(32))" ``` ``` cp .env.example .env ``` 打开 `.env` 并设置所需值: ``` # 必需 — 使用一个长随机字符串(例如:openssl rand -hex 32) SECRET_KEY=your-secret-key-here # 必需 — 内置管理员账户的密码 DEFAULT_ADMIN_PASSWORD=your-admin-password # MySQL 凭证 # DB_ROOT_PASSWORD 和 DB_PASSWORD 应为强随机字符串。 # Docker Compose 在首次运行时使用这些值创建 MySQL 数据库, # 因此无需匹配预先存在的数据库 — 只需生成并粘贴。 # 示例:python3 -c "import secrets; print(secrets.token_hex(16))" DB_ROOT_PASSWORD=your-random-root-password DB_PASSWORD=your-random-db-password # DB_USER 和 DB_NAME 可以保持默认值 — 它们是标签,不是机密。 DB_USER=threatpilot DB_NAME=threatpilot # 可选 — 您的本地时区 SCHEDULER_TIMEZONE=America/Indiana/Indianapolis # 可选 — 增加 NVD API 速率限制 # 在 https://nvd.nist.gov/developers/request-an-api-key 获取免费密钥 NVD_API_KEY= ``` ### 3. 初始化迁移(仅首次安装) ``` docker compose run --rm app flask db init docker compose run --rm app flask db migrate -m "initial" ``` ### 4. 构建并启动 ``` docker compose up -d ``` 这将执行以下操作: 1. 拉取 MySQL 8.0 镜像 2. 构建 ThreatPilot 应用镜像 3. 等待数据库就绪 4. 运行 `flask db upgrade` 以应用迁移 5. 播种默认源、管理员用户和设置 6. 在端口 **8082** 上启动应用 ### 5. 访问应用 在浏览器中打开 `http://localhost:8082` 并使用以下凭据登录: - **用户名:** `admin` - **密码:** 您为 `DEFAULT_ADMIN_PASSWORD` 设置的值 ## 默认源 以下源会在首次运行时自动播种: | 源 | 类型 | 来源 | |---------------------|------|-------------------------------| | CISA KEV | API | cisa.gov | | Bleeping Computer | RSS | bleepingcomputer.com | | Krebs on Security | RSS | krebsonsecurity.com | | Qualys Blog | RSS | blog.qualys.com | 可以在应用内的 **Feed Sources** 页面添加更多源。 ## 定时任务 | 任务 | 计划 | 描述 | |-----------------------|----------------|------------------------------------| | `fetch_all_feeds` | 每日 06:00 | 拉取所有已启用的源 | | `generate_daily_report` | 每日 07:00 | 构建并保存 PDF 摘要 | | `cleanup_old_news` | 每周日 | 删除超过 90 天的新闻项 | ## 常用命令 ``` # 查看实时日志 docker compose logs -f app # 停止堆栈 docker compose down # 停止并清除所有数据(破坏性) docker compose down -v # 代码更新后重新构建 docker compose up -d --build # 在 app container 中打开 shell docker compose exec app bash # 手动应用数据库迁移 docker compose exec app flask db upgrade ``` ## 数据持久化 | 卷 | 内容 | |------------------|--------------------------| | `db_data` | MySQL 数据库文件 | | `reports_output` | 生成的 PDF 报告 | | `backups` | 数据库备份 | 卷在 `docker compose down` 后会保留。仅当需要彻底重置时才使用 `docker compose down -v`。 ## 升级 ``` git pull docker compose up -d --build ``` 入口脚本会在每次启动时自动运行 `flask db upgrade`,因此在升级时会自动应用迁移,无需额外步骤。 ## 端口参考 | 端口 | 服务 | |------|-----------------------| | 8082 | ThreatPilot Web UI | | 3306 | MySQL(仅内部使用) | ## 故障排除 ### 表不存在 / 登录时出现 500 错误 如果应用启动但崩溃并提示 `Table 'threatpilot.users' doesn't exist`,说明数据库迁移未运行。这通常意味着 `db_data` 卷包含之前启动失败时留下的陈旧状态。请清除它并重启: ``` docker compose down -v docker compose up -d --build ``` 在 gunicorn 启动之前,您应该在日志中看到 `Running upgrade -> 5aee1ee15443`。如果没有看到,说明迁移脚本未到达容器 —— 请检查 `.dockerignore` 中是否排除了 `migrations/versions/`。 ### MySQL 已启动,但出现 `ERROR 2026: TLS/SSL error` MariaDB 容器不使用 SSL。如果入口脚本中的 `mysql` CLI 因 TLS 错误而失败,请确保 `entrypoint.sh` 中存在 `--ssl=FALSE` 标志: ``` mysql -h "${DB_HOST}" -uroot -p"${DB_ROOT_PASSWORD}" --ssl=FALSE <
标签:APScheduler, Bootstrap 5, Chart.js, CISA KEV, CVE追踪, Flask, GPT, HTMX, MSP工具, NVD, Python, RSS聚合, SQLAlchemy, WeasyPrint, 后端开发, 威胁情报, 安全仪表盘, 安全运营, 开发者工具, 扫描框架, 无后门, 漏洞管理, 端点安全, 网络安全, 自动化报告, 自托管, 补丁管理, 请求拦截, 逆向工具, 隐私保护