sameer-sameer/OSWAT
GitHub: sameer-sameer/OSWAT
OSWAT 是一个自托管的开源 Web 分析与威胁情报平台,为分析师提供多维度真实数据源的 OSINT 调查、案件管理与证据持久化能力。
Stars: 0 | Forks: 0
# OSWAT
**开源 Web 分析与威胁情报平台**
专为分析师打造的自托管 OSINT 指挥中心。提供真实的 provider 集成(无模拟数据)、基于数据库的调查持久化存储、AES-256-GCM 密钥保险库以及完整的审计日志。
## 技术栈
- Next.js 15 + TypeScript (Node runtime)
- Tailwind + Radix UI
- Prisma + PostgreSQL
- 可选:Redis, Neo4j, Supabase Storage
- Anthropic / OpenAI(可选的 AI 助手)
- React Flow, Leaflet, jsPDF, docx
## 情报模块
| 模块 | Endpoint | 真实集成 |
|---|---|---|
| Email | `GET /api/intel/email?e=` | DNS MX/SPF/DMARC/MTA-STS, Gravatar, disposable, EmailRep, HIBP, Hunter |
| Phone | `GET /api/intel/phone?p=` | libphonenumber, NumVerify, Twilio Lookup, Veriphone, AbstractAPI |
| Username | `GET /api/intel/username?u=` | 48 平台 Sherlock 风格探测 |
| Domain | `GET /api/intel/domain?d=` | dns/promises, whoiser, crt.sh, SecurityTrails, VirusTotal, TLS handshake |
| IP | `GET /api/intel/ip?ip=` | ip-api, reverse DNS, AbuseIPDB, VirusTotal, GreyNoise, Shodan, IPInfo, OTX |
| Image | `POST /api/intel/image` (multipart) | exifr EXIF, MD5/SHA-1/SHA-256, Supabase upload, Google Vision reverse search |
| Hash | `GET /api/intel/hash?h=` | MalwareBazaar, VirusTotal, Hybrid Analysis |
| URL | `GET /api/intel/url?u=` | Redirect chain, OpenGraph, VirusTotal, urlscan.io |
| Breach | `POST /api/intel/breach` | HIBP, Intelligence X, DeHashed |
| UPI | `GET /api/intel/upi?v=` | NPCI PSP/bank mapping, merchant heuristics |
| Threats | `GET /api/intel/threats` | URLhaus, MalwareBazaar, AlienVault OTX |
| Analyze | `POST /api/intel/analyze` | 基于真实证据的规则发现生成器 |
| Correlate | `POST /api/intel/correlate` | 实体到实体的关联引擎 |
| LLM | `POST /api/intel/llm` | 可选的 Anthropic/OpenAI 叙述 |
## Docker 设置
带有健康检查和持久化卷的 PostgreSQL + Redis:
```
docker compose up -d
docker compose ps # both should be "healthy"
```
然后应用迁移:
```
npx prisma migrate dev --name init
npx prisma generate
```
要在不丢失数据的情况下停止:
```
docker compose down
```
要彻底擦除(销毁 DB volume):
```
docker compose down -v
```
## 环境设置
```
cp .env.example .env
```
必填值:
| 变量 | 用途 |
|---|---|
| `JWT_SECRET` | 最少 32 个字符 — 如果短于此长度,应用将拒绝签发或验证 token。生成命令:`openssl rand -base64 48` |
| `DATABASE_URL` | Postgres URL。Compose 默认值:`postgresql://oswat:oswat@localhost:5432/oswat?schema=public` |
| `VAULT_MASTER_KEY` | 最少 32 个字符 — 使用 AES-256-GCM 加密 `ApiKeySecret` 行 |
所有其他密钥均为可选 — 未设置时,相应的模块会优雅降级(返回一个带有 `warning` 的 `configured: false` 块)。有关完整清单,请参阅 `.env.example`。
## API 速率限制
基于每个 IP(如果已认证,则基于每个用户)的内存令牌桶算法:
| 等级 | 容量 | 恢复速率 |
|---|---|---|
| `auth` (login, register, settings) | 10 | 10 / 60s |
| `intel` (email, phone, domain, ip, hash, upi, url, breach, threats, analyze, correlate, settings) | 30 | 30 / 60s |
| `expensive` (username sweep, image upload, LLM, breach search) | 5 | 5 / 60s |
超出的请求将收到 `HTTP 429` 以及 `retryAfterSec` 字段。
对于多实例部署,请将内存存储替换为 Redis(相关辅助工具位于 `src/lib/storage/redis.ts`)。
## 认证与 CSRF
- Bcrypt 哈希密码(cost 为 12)。
- JWT (HS256,有效期 7 天) 存放在 `httpOnly`、`secure`(在生产环境中)且 `sameSite: strict` 的 cookie 中。
- **无演示绕过机制** — DB 无法连接时返回 HTTP 503;绝不签发备用 token。
- CSRF:双重提交 cookie 模式。从 `GET /api/auth/csrf` 获取 token,并在所有更改状态的请求(`/api/cases/*`, `/api/entities/*`, `/api/notes/*`, `/api/settings`, `/api/intel/breach`)中将其作为 `x-csrf-token` header 发送。
## 持久化
| 资源 | 存储 |
|---|---|
| 用户、设置 | Postgres (`User`, `UserSettings`) |
| 案件(调查) | Postgres (`Case`) |
| 实体、笔记、证据、时间线 | Postgres (`Entity`, `Note`, `Evidence`, `TimelineEvent`) |
| 搜索历史 | Postgres (`SearchHistory`) — 当用户通过认证时,每个情报路由都会自动写入 |
| API 密钥 | Postgres (`ApiKeySecret`),使用 AES-256-GCM 加密密封 |
| 审计日志 | Postgres (`AuditLog`) |
| 证据文件(图像) | Supabase Storage(当设置了 `SUPABASE_URL` + `SUPABASE_SERVICE_KEY` 时) |
| 可选图存储 | Neo4j(当设置了 `NEO4J_URI` 时) |
## 快速开始(全新检出)
```
# 1. 启动基础设施
docker compose up -d
# 2. 配置
cp .env.example .env
# 编辑:至少设置 JWT_SECRET 和 VAULT_MASTER_KEY(两者均 ≥ 32 个字符)
# DATABASE_URL 对于 compose stack 已经是正确的
# 3. 安装
npm install
# 4. 迁移 + 生成
npx prisma migrate dev --name init
# 5. 运行
npm run dev # development
# 或者
npm run build && npm start # production
```
打开 http://localhost:3000。
## 文件夹名称
项目文件夹必须命名为 **`OSWAT`**(无空格、无括号、无 `&`)。如果路径中包含 `&`,Windows 的 `cmd` / `npm` / `npx` 将会执行失败,因为 `cmd` 会将其解析为命令分隔符。
## 免费部署
- 使用 Vercel 免费层级托管 Next.js 应用。
- 使用 Supabase 免费层级提供 PostgreSQL + 可选的 Storage。
- 所有 OSINT 模块均使用免费层级的 provider 或以无密钥方式运行(DNS, crt.sh, Pwned Passwords k-anonymity, MalwareBazaar, URLhaus 等)。
标签:PostgreSQL, TypeScript, Web分析, 威胁情报, 安全插件, 开发者工具, 搜索引擎查询, 测试用例, 自动化攻击, 自托管, 请求拦截