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分析, 威胁情报, 安全插件, 开发者工具, 搜索引擎查询, 测试用例, 自动化攻击, 自托管, 请求拦截