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, 威胁情报, 安全防御评估, 开发者工具, 版权保护, 自动化攻击, 逆向工具