chapagainmanoj/threat-intelligence

GitHub: chapagainmanoj/threat-intelligence

一个三层架构的安全威胁情报监控仪表板,通过 React 前端、GraphQL 网关与 FastAPI 数据服务实现威胁事件的集中展示与管理。

Stars: 0 | Forks: 0

# 威胁情报仪表板 一个三层安全威胁监控仪表板:**React SPA** → **Node.js GraphQL 网关** → **Python FastAPI 数据服务**。 ``` Browser → Nginx (:80) ├─ /graphql → backend (Apollo Server 4, :4000) └─ / → web (React 19 / Vite, :5173) backend ↔ HTTP ↔ threats-service (FastAPI, :8000) ↕ File I/O threats.json ``` ## 前置条件 | 工具 | 版本 | 检查方式 | |------|---------|-------| | Node.js | 20+ | `node -v` | | npm | 10+ | `npm -v` | | Python | 3.9+(推荐 3.12) | `python3 --version` | | pip | 最新版 | `pip3 --version` | | Docker + Compose *(可选)* | 24+ / v2+ | `docker --version && docker compose version` | ## 快速开始(Docker — 推荐) 使用单个命令启动所有服务。除了 Docker 之外无需任何本地安装。 ``` docker compose -f docker/dev.compose.yaml up --build ``` 等待所有 4 个容器健康运行后,打开 **http://localhost**。使用 `analyst` / `threatintel` 登录。 停止服务: ``` docker compose -f docker/dev.compose.yaml down ``` ## 快速开始(本地 — 3 个终端) 服务必须按以下顺序启动:**threats-service → backend → web**。 ### 1. Threats Service (Python — 端口 8000) ``` cd threats-service uv sync uv run uvicorn main:app --reload --port 8000 ``` **验证其是否正在运行:** ``` curl http://localhost:8000/threats ``` 预期输出: ``` [{"id":"1","name":"Brute Force Attack","severity":"High","status":"Active"},...] ``` ### 2. Backend (Node.js — 端口 4000) 在项目根目录打开一个**新终端**: ``` cd backend npm install npm run dev ``` 你应该会看到: ``` 🚀 GraphQL backend ready at http://localhost:4000/graphql ``` **验证其是否正在运行:** ``` curl -X POST http://localhost:4000/graphql \ -H "Content-Type: application/json" \ -d '{"query":"mutation { login(username: \"analyst\", password: \"threatintel\") { token } }"}' ``` 预期输出:一个包含 `"token": "eyJ..."` 的 JSON 响应。 ### 3. Web (React — 端口 5173) 在项目根目录打开一个**新终端**: ``` cd web npm install npm run dev ``` 你应该会看到: ``` VITE v8.x.x ready in XXX ms ➜ Local: http://localhost:5173/ ``` 在浏览器中打开 **http://localhost:5173**。 ### 登录凭据 | 字段 | 值 | |-------|-------| | 用户名 | `analyst` | | 密码 | `threatintel` | ## 环境变量 所有变量都有用于本地开发的默认值。在生产环境中,只有 `JWT_SECRET` 是**必需的**。 | 变量 | 服务 | 默认值 | 用途 | |----------|---------|---------|---------| | `JWT_SECRET` | backend | `threat-intel-dev-secret` | 用于签名/验证 JWT 的 HMAC 密钥 | | `AUTH_USERNAME` | backend | `analyst` | 登录用户名 | | `AUTH_PASSWORD` | backend | `threatintel` | 登录密码 | | `THREATS_SERVICE_URL` | backend | `http://localhost:8000` | Python 数据服务的 Base URL | | `PORT` | backend | `4000` | Express 监听端口 | | `DATA_FILE` | threats-service | `data/threats.json` | JSON 威胁数据存储路径 | 要在本地覆盖默认配置: ``` JWT_SECRET=my-secret AUTH_USERNAME=admin npm run dev ``` Docker Compose 会自动设置 `THREATS_SERVICE_URL=http://threats-service:8000` 以适应容器网络环境。 ## 运行测试 ``` # Python(从项目根目录) cd threats-service && pytest -v # Backend(从项目根目录) cd backend && npm test # Web(从项目根目录) cd web && npm test ``` 监听模式: ``` cd backend && npm run test:watch cd web && npm run test:watch ``` ## 生产环境构建 ``` # Backend — 将 TypeScript 编译到 dist/ cd backend && npm run build # Web — 使用 Vite 进行类型检查并打包到 dist/ cd web && npm run build ``` 使用 Docker 运行完整的生产技术栈: ``` JWT_SECRET=your-production-secret docker compose -f docker/prod.compose.yaml up --build ``` ## 代码检查与格式化 ``` # ESLint (React/TypeScript) cd web && npm run lint # Prettier (TypeScript + CSS) npx prettier --check "backend/src/**/*.ts" "web/src/**/*.{ts,tsx,css}" # Ruff (Python) ruff check threats-service/ ruff format --check threats-service/ ``` ## 项目结构 ``` threat-intelligence/ ├── threats-service/ Python FastAPI data layer (reads/writes threats.json) ├── backend/ Node.js GraphQL gateway (JWT auth, delegates to Python) ├── web/ React SPA (login, dashboard, charts) ├── proxy/ Nginx configs (dev with HMR, prod with SPA fallback) ├── docker/ Docker Compose files (dev + prod) └── .github/workflows/ CI pipeline (lint → test → build) ``` ## API 参考 ### REST — threats-service (:8000) | 方法 | 路径 | 描述 | |--------|------|-------------| | `GET` | `/threats` | 列出所有威胁 | | `POST` | `/threats/acknowledge` | 确认威胁(请求体:`{"id": "1"}`) | ### GraphQL — backend (:4000) ``` # Public mutation Login($u: String!, $p: String!) { login(username: $u, password: $p) { token user { username } } } # 需要 Authorization: Bearer query { getThreats { id name severity status } } mutation { acknowledgeThreat(id: "1") { id name severity status } } ``` ## 常见错误 ### 端口 8000 上的 `ECONNREFUSED` **原因:** Backend 无法连接到 Python 的 threats-service。 **解决:** 确保先启动 threats-service: ``` cd threats-service && uvicorn main:app --reload --port 8000 ``` ### 来自 GraphQL 的 `You must be logged in.` 错误 **原因:** 请求中缺少 JWT token 或 token 已过期。 **解决:** 首先通过 UI 或 GraphQL mutation 登录。token 存储在 `localStorage` 中,并由 Apollo Client 自动注入。 ### `Module not found: pytest` **原因:** 当前活动的 Python 环境中未安装 pytest。 **解决:** ``` cd threats-service && pip3 install -r requirements.txt ``` ### 前端显示空白页 / 网络错误 **原因:** `/graphql` 请求未能到达 backend(CORS 或代理问题)。 **解决(本地不使用 Docker):** 在 `web/vite.config.ts` 中添加一个 Vite proxy: ``` server: { proxy: { '/graphql': 'http://localhost:4000' }, } ``` **解决(Docker):** 使用 `http://localhost`(端口 80)—— Nginx 会处理路由。 ### `threats.json` 在测试失败后包含陈旧数据 **解决:** ``` git checkout threats-service/data/threats.json ``` ## 服务概览 | 服务 | 端口 | 技术栈 | Dockerfile | |---------|------|------|------------| | `threats-service` | 8000 | Python 3.12 · FastAPI · Pydantic · pydantic-settings | `threats-service/Dockerfile` | | `backend` | 4000 | Node.js 20 · Apollo Server 4 · Express | `backend/Dockerfile` | | `web` | 5173 | React 19 · Vite 8 · TypeScript 6 | `web/Dockerfile` | | `proxy` | 80 | Nginx Alpine | Docker Hub 镜像 |
标签:AV绕过, Docker, FastAPI, GraphQL, MITM代理, React, Syscalls, 威胁情报, 安全防御评估, 开发者工具, 版权保护, 自动化攻击, 逆向工具