Vishwaspatel2401/Redwatch-SOC
GitHub: Vishwaspatel2401/Redwatch-SOC
一个基于 GPT-4o-mini 的全栈 SOC 日志分析平台,支持上传多种格式日志并自动检测威胁、生成分析报告。
Stars: 0 | Forks: 0
# RedWatch — SOC 日志分析器
一个用于上传和分析 Web 代理、服务器及应用程序日志的全栈网络安全平台。使用 OpenAI GPT-4o-mini 检测异常、识别威胁,并生成带有置信度分数的 SOC 分析师摘要。可选择通过 VirusTotal 哈希查询来丰富分析结果。
🔴 **在线演示:** [redwatch-soc.vercel.app](https://redwatch-soc.vercel.app)
📁 **GitHub:** [github.com/Vishwaspatel2401/Redwatch-SOC](https://github.com/Vishwaspatel2401/Redwatch-SOC)
## 技术栈
| 层级 | 技术 | 版本 |
|-------|-----------|---------|
| 前端 | React + TypeScript | 18.x / 5.x |
| 前端 | Vite | 5.x |
| 前端 | Tailwind CSS + shadcn/ui | 3.x |
| 前端 | TanStack Query | 5.x |
| 前端 | Recharts | 2.x |
| 前端 | React Router | 6.x |
| 后端 | Python + Flask | 3.11+ / 3.0 |
| 后端 | SQLAlchemy | 通过 Flask-SQLAlchemy(启动时自动创建表) |
| 后端 | Flask-JWT-Extended + Bcrypt | 4.x / 1.x |
| AI | OpenAI GPT-4o-mini | 通过 openai SDK ≥1.50 |
| 威胁情报 | VirusTotal API v3 | 可选 |
| 数据库 | PostgreSQL | 16.x |
## 架构
3 层架构。React 前端仅与 Flask REST API 通信。前端不进行任何 AI 调用。
```
User → React (Vite) → Flask REST API → OpenAI GPT-4o-mini
→ VirusTotal API (background, optional)
→ PostgreSQL
```
**上传流程:**
1. 用户认证 → Flask 签发一个 24 小时有效的 JWT token
2. 用户上传日志文件(`.log`、`.txt`、`.csv`、`.json`、`.ndjson`、`.gz`)
3. 前端将文件作为 `multipart/form-data` 发送到 `POST /api/logs/upload`
4. 后端自动检测格式(ZScaler CSV / Apache Combined Log / JSON/NDJSON)
5. 将最多 5,000 条日志事件解析为规范化模式,然后在整个文件中均匀抽取 500 条
6. 将采样后的条目发送给 OpenAI GPT-4o-mini,并附带结构化的 SOC 分析师提示词
7. VirusTotal SHA256 哈希查询在**后台线程**中运行(非阻塞)
8. 结果(异常、威胁等级、时间线、摘要)持久化存储到 PostgreSQL
9. 前端渲染仪表盘、告警和 AI 助手
## 快速开始 ⚡
运行全栈的最快方式 —— PostgreSQL、后端和前端同时启动。
```
git clone https://github.com/Vishwaspatel2401/Redwatch-SOC
cd Redwatch-SOC
# 1. 设置您的 API keys
cp .env.example .env
# 编辑 .env 并设置 OPENAI_API_KEY 和 JWT_SECRET_KEY
# 2. 启动所有内容
docker-compose up --build
# Frontend → http://localhost:3000
# Backend → http://localhost:8000
```
停止运行:
```
docker-compose down
```
同时清除数据库:
```
docker-compose down -v
```
## 手动设置(不使用 Docker)
### 前置条件
- Node.js 20+ 和 npm
- Python 3.11+ 和 pip
- 本地运行的 PostgreSQL 16
- OpenAI API key — [platform.openai.com](https://platform.openai.com)
- _(可选)_ VirusTotal API key — [virustotal.com/gui/my-apikey](https://www.virustotal.com/gui/my-apikey)
## 设置步骤
### 1. 克隆仓库
```
git clone https://github.com/Vishwaspatel2401/Redwatch-SOC
cd Redwatch-SOC
```
### 2. PostgreSQL — 创建数据库和用户
```
psql -U postgres
```
```
CREATE USER soc_user WITH PASSWORD 'soc_password';
CREATE DATABASE soc_db OWNER soc_user;
GRANT ALL PRIVILEGES ON DATABASE soc_db TO soc_user;
\q
```
### 3. 后端
```
cd backend
pip install -r requirements.txt
```
创建 `backend/.env`:
```
DATABASE_URL=postgresql://soc_user:soc_password@localhost:5432/soc_db
JWT_SECRET_KEY=change-this-to-a-random-64-char-string
OPENAI_API_KEY=sk-your-openai-key-here
FLASK_ENV=development
UPLOAD_FOLDER=/tmp/uploads
# 可选项 — 启用 ZScaler 日志的 SHA256 哈希查找
VIRUSTOTAL_API_KEY=your-vt-key-here
```
启动后端(运行在端口 8000):
```
python main.py
```
### 4. 前端
```
cd frontend
npm install
```
创建 `frontend/.env`:
```
VITE_API_BASE_URL=http://localhost:8000
```
启动前端(运行在端口 3000):
```
npm run dev
```
访问 [http://localhost:3000](http://localhost:3000)
## 示例日志文件
`sample-logs/` 中提供了三个示例文件用于测试:
| 文件 | 格式 | 事件数 | 显著异常 |
|------|--------|--------|-------------------|
| `zscaler_sample.csv` | ZScaler Web Proxy CSV | 20 | 恶意软件 C2 信标、数据渗出(92 MB 上传)、钓鱼访问、漏洞利用工具包下载 |
| `apache_sample.log` | Apache Combined Log | 25 | 通过 sqlmap 进行的 SQL 注入、暴力登录、Nikto 扫描器、敏感文件侦察 |
| `app_sample.ndjson` | JSON/NDJSON | 20 | 暴力破解 → 成功登录、大数据导出(95 MB)、午夜管理员操作、SQL 注入 |
上传以上任意文件以验证端到端分析是否正常工作。
## AI 模型与方法
**模型:** 通过 OpenAI Chat Completions API 使用 `gpt-4o-mini`
**位置:** `backend/app/services/ai_analyzer.py`
**Temperature:** `0.2`(低随机性以保证结果一致性)
**Max tokens:** `4096`
**响应格式:** `json_object`(仅结构化 JSON,无 markdown)
**输入:** 最多 5,000 条解析条目,均匀采样至 500 条以适应 GPT 上下文窗口
**输出:** 结构化 JSON,包含:
- `summary` — 为 SOC 团队提供的 2–3 句执行摘要
- `threat_level` — `low | medium | high | critical`
- `timeline` — 按时间顺序排列的关键事件列表,包含严重程度
- `anomalies[]` — 每项包含:
- `type`、`description`、`reason`(为何可疑)
- `affected_ips`、`affected_users`
- `confidence`(0.0–1.0)
- `severity` — `low | medium | high | critical`
**GPT 关注的内容:**
- 来自单一 IP 的异常请求量(DDoS / 爬取)
- 访问已知的恶意软件或钓鱼域名
- 大数据传输(`bytes_sent > 10MB` — 潜在数据渗出)
- 非工作时间访问(07:00 之前或 20:00 之后)
- 被阻止的请求后跟重试(持久化 / 信标活动)
- 横向移动模式
- 已填充的 `threat_name` 字段(来自 ZScaler 的已确认恶意软件)
### 置信度分数指南
| 分数 | 含义 |
|-------|---------|
| 1.0 | `threat_name` 已填充 — 确认的恶意软件检测 |
| 0.85–0.99 | 类别为恶意软件/钓鱼且操作被阻止 |
| 0.70–0.84 | 统计异常并伴有佐证信号 |
| 0.50–0.69 | 行为异常(如非工作时间)且上下文有限 |
| < 0.50 | 弱信号,仅为可见性而包含 |
## VirusTotal 集成(可选)
当设置了 `VIRUSTOTAL_API_KEY` 时,后端会通过检查 VirusTotal 的 70+ 个 AV 引擎数据库来丰富包含 `sha256` 字段的日志条目(存在于 ZScaler 日志中)。
- 在**后台线程**中运行 —— 不会阻塞上传响应
- 仅检查唯一的哈希值(去重)
- 免费层:4 次请求/分钟(调用间隔 15 秒休眠)
- 结果会输入到 GPT 的输入上下文中以实现更高置信度的检测
- Apache 和 JSON 日志(无 SHA256 字段)不受影响
## API 端点
### 认证 — `/api/auth`
| 方法 | 端点 | 认证 | 描述 |
|--------|----------|------|-------------|
| POST | `/register` | 无 | 创建新用户账户 |
| POST | `/login` | 无 | 返回 JWT access token |
| GET | `/me` | JWT | 获取当前用户资料 |
### 日志 — `/api/logs`
| 方法 | 端点 | 认证 | 描述 |
|--------|----------|------|-------------|
| POST | `/upload` | JWT | 上传日志文件并触发分析 |
| GET | `/` | JWT | 列出当前用户的所有上传 |
| GET | `/` | JWT | 获取某次上传的完整分析结果 |
| DELETE | `/` | JWT | 删除某次上传及其结果 |
### AI 助手 — `/api/assistant`
| 方法 | 端点 | 认证 | 描述 |
|--------|----------|------|-------------|
| POST | `/chat` | JWT | 针对特定上传向 GPT-4o-mini 提问 |
## 数据库模式
**`users`**
- `id`(UUID PK)、`username`、`email`、`password_hash`(bcrypt)、`created_at`
**`log_uploads`**
- `id`(UUID PK)、`user_id`(FK → users)、`filename`、`file_size`、`log_type`、`status`、`uploaded_at`
**`analysis_results`**
- `id`(UUID PK)、`upload_id`(FK → log_uploads)、`summary`、`threat_level`、`total_events`、`flagged_events`、`key_findings`(JSON)、`timeline_json`(JSON)、`anomalies_json`(JSON)、`events_sample`(JSON)、`raw_response`、`analyzed_at`
表通过应用工厂中的 `db.create_all()` 在**首次启动时自动创建**。无需迁移命令。
## 项目结构
```
Redwatch-SOC/
├── frontend/
│ └── src/
│ ├── pages/
│ │ ├── DashboardPage.tsx # Charts, metrics, history panel
│ │ ├── UploadPage.tsx # File upload + upload history
│ │ ├── AlertsPage.tsx # Anomaly cards with confidence scores
│ │ ├── ReportsPage.tsx # Incident report generation + PDF export
│ │ └── LandingPage.tsx # Public marketing homepage
│ ├── components/
│ │ ├── AppLayout.tsx # Sidebar navigation + theme toggle
│ │ └── ChatBubble.tsx # A.R.I.A. floating AI assistant widget
│ ├── contexts/
│ │ ├── AuthContext.tsx # JWT auth state + RequireAuth guard
│ │ └── ThemeContext.tsx # Dark/light mode + localStorage persistence
│ └── lib/
│ └── api.ts # Typed API client (fetch + JWT)
├── backend/
│ └── app/
│ ├── models.py # SQLAlchemy models
│ ├── config.py # Environment config
│ ├── routes/
│ │ ├── auth.py # /api/auth/*
│ │ ├── logs.py # /api/logs/*
│ │ └── assistant.py # /api/assistant/*
│ └── services/
│ ├── log_parser.py # Auto-detect + parse ZScaler/Apache/JSON
│ ├── ai_analyzer.py # OpenAI GPT-4o-mini integration
│ └── virustotal.py # VirusTotal SHA256 enrichment
├── sample-logs/
│ ├── zscaler_sample.csv
│ ├── apache_sample.log
│ └── app_sample.ndjson
└── README.md
```
## 支持的日志格式
| 格式 | 检测方法 | 提取的关键字段 |
|--------|-----------------|----------------------|
| ZScaler Web Proxy (CSV) | 标题行包含 `src_ip` + `url` 列 | IP、URL、字节、动作、类别、sha256、threat_name |
| Apache / Nginx Combined Log | 对 `IP - user [timestamp] "METHOD /path" status bytes` 进行正则匹配 | IP、方法、路径、状态码、字节 |
| JSON / NDJSON | 每行一个 JSON 对象 | 任意常见字段名(自动规范化) |
| `.gz` 压缩 | 格式检测前自动解压 | 以上所有 |
标签:AMSI绕过, Apache日志, Apex, Ask搜索, Flask, GPT-4, JSON日志, JWT认证, OISF, OpenAI, PostgreSQL, Python, React, SQLAlchemy, Syscalls, Tailwind CSS, TypeScript, VirusTotal, Vite, Web安全, ZScaler, 云端安全, 人工智能, 代码共享, 代码示例, 内存规避, 威胁检测, 安全分析平台, 安全情报, 安全插件, 安全警报, 安全运营中心, 异常检测, 数据分析, 文件上传, 无后门, 日志管理, 机器学习, 测试用例, 用户模式Hook绕过, 结构化查询, 网络安全, 网络映射, 自动化安全, 自动化攻击, 蓝队分析, 请求拦截, 逆向工具, 隐私保护, 风险评分