buddhsen-tripathi/openvscan

GitHub: buddhsen-tripathi/openvscan

一款完全运行在 Cloudflare 上的 Web 漏洞扫描器,将开源安全工具与 AI 分析结合,用于预生产阶段的安全检测。

Stars: 15 | Forks: 7

# OpenVScan OpenVScan 是一款基于 Web 的漏洞扫描器,它将开源安全工具与 AI 辅助分析相结合,以实现更快、更可靠的预生产安全测试。它**完全运行在 Cloudflare 上** —— 使用了 Workers、Containers、D1、R2 和 Queues。 ## 架构 | 层级 | 技术栈 | 职责 | |------|-------|------------------| | **Web Worker** (`web/`) | TanStack Start, React 19, Tailwind 4, Cloudflare Workers | UI、Better-auth、服务器函数(项目/扫描 CRUD)、队列生产者、导出 | | **Scanner Worker** (`workers/`) | Cloudflare Worker + Container, Queues | 消费扫描作业,在 container 中运行 Trivy,将扫描结果写入 D1,并将产出物写入 R2 | | **数据库** | Cloudflare **D1** (SQLite, Drizzle ORM) | 用户、会话、项目、扫描、发现结果、日志 | | **对象存储** | Cloudflare **R2** | 原始扫描器输出产出物 | | **队列** | Cloudflare **Queues** | 将扫描调度与执行解耦 | **没有单独的 API 服务器、Redis 或 Postgres** —— Web Worker 通过 TanStack Start 服务器函数管理数据访问,消费者 Worker 驱动扫描器 container。 ## 快速开始 ``` # Clone 和 install git clone https://github.com/Buddhsen-tripathi/openvscan.git cd openvscan pnpm install # 认证并 provision Cloudflare 资源(仅限首次) pnpm --filter openvscan-web exec wrangler login pnpm --filter openvscan-web exec wrangler d1 create openvscan pnpm --filter openvscan-web exec wrangler r2 bucket create openvscan-artifacts pnpm --filter openvscan-web exec wrangler queues create openvscan-scans # → 将打印出的 D1 database_id 复制到 web/wrangler.jsonc 和 workers/wrangler.jsonc 中 # 将 schema 应用到本地 D1,然后启动 web app pnpm db:migrate:local pnpm dev:web ``` Web 应用运行在 http://localhost:3000。 ### 环境配置 绑定(D1、R2、Queue)位于 `wrangler.jsonc` 中,而不是 `.env`。在 `web/.dev.vars` 中提供本地开发所需的密钥: ``` BETTER_AUTH_SECRET="generate-a-random-32-char-secret" BETTER_AUTH_URL=http://localhost:3000 VITE_APP_URL=http://localhost:3000 ``` 使用 `openssl rand -base64 32` 生成密钥。 ### GitHub 集成 OpenVScan 通过 **GitHub App**(仓库访问权限、push webhook、PR 评论)和 OAuth 客户端(用于“使用 GitHub 继续”登录)连接到 GitHub。GitHub 功能是可选的 —— 如果不启用,手动项目扫描仍然可以正常工作。 **1. 注册 GitHub App**(Settings → Developer settings → GitHub Apps → New): | 设置 | 值 | |---------|-------| | Webhook URL | `https:///api/github/webhook` | | Setup URL (callback) | `https:///api/github/setup`(勾选 "Redirect on update") | | Webhook secret | 一个随机字符串(作为 `GITHUB_WEBHOOK_SECRET`) | | Permissions | **Contents:** read, **Pull requests:** read & write, **Metadata:** read | | Subscribe to events | **Push**, **Pull request**, **Installation**, **Installation repositories** | 为 App 生成一个私钥(会下载一个 `.pem` 文件)。该 App 的 **App ID**、**slug**(来自其公开页面 URL)、**Client ID/secret** 以及私钥将用于填充下方的密钥。 **2. 提供密钥。** 在本地,复制 `web/.dev.vars.example` → `web/.dev.vars` 和 `workers/.dev.vars.example` → `workers/.dev.vars` 并填写内容。在生产环境中: ``` # Web Worker for s in GITHUB_APP_ID GITHUB_APP_SLUG GITHUB_APP_PRIVATE_KEY GITHUB_WEBHOOK_SECRET \ GITHUB_CLIENT_ID GITHUB_CLIENT_SECRET; do pnpm --filter openvscan-web exec wrangler secret put "$s" done # Scanner Worker for s in GITHUB_APP_ID GITHUB_APP_PRIVATE_KEY APP_URL; do pnpm --filter openvscan-workers exec wrangler secret put "$s" done ``` **3. 使用它。** 登录 → **Repositories** → 将 App 安装到你想要的 repo 上 → 连接一个 repo → 将其触发器设置为 **Automatic**,并可选择性配置分支过滤。在匹配的 push 发生时,OpenVScan 会扫描该 repo,并且(当分支有打开的 PR 时)发布一条发现结果摘要评论。 对于本地 webhook 测试,使用隧道(例如 [smee.io](https://smee.io) 或 `cloudflared tunnel`)将 GitHub 的请求转发到你的开发服务器,并指向 `localhost:3000/api/github/webhook`。 ### 首次运行 1. 访问 http://localhost:3000/signup 并创建一个账户。 2. 从仪表板创建一个项目。 3. 从项目页面启动扫描(目标 = 一个 repo URL、container image 或路径)。 4. 打开扫描详情页面以查看状态、发现结果、日志和导出内容。 ## 功能 ### 当前功能 - ✅ 邮箱/密码**和 GitHub**身份验证(基于 D1 的 Better-auth) - ✅ 多租户项目管理 - ✅ **GitHub App 集成**:连接 repo,在 push 时自动扫描,将发现结果发布到 PR - ✅ 使用 Trivy 进行异步漏洞扫描(依赖项、container image、repo) - ✅ 按严重程度分组的发现结果及修复指南 - ✅ 扫描执行日志和状态轮询 - ✅ 扫描取消(基于数据库标志) - ✅ 导出 JSON 和 SARIF 格式 - ✅ 原始扫描器产出物存储在 R2 中 ### 计划中 - 🔜 额外的扫描器(Nmap、Semgrep、OWASP ZAP) - 🔜 消费者 Worker 中的 AI 辅助分诊 - 🔜 行内 PR 审查评论(逐行)+ Checks API - 🔜 支持 GitLab - 🔜 定时扫描和基线 - 🔜 团队协作 ## 仓库结构 ``` openvscan/ ├── web/ # TanStack Start app on Cloudflare Workers │ ├── src/routes/ # routes incl. api/auth/$ and api/scans.$id.export │ ├── components/ # auth/, dashboard/, homepage/, ui/ │ ├── lib/ # auth.ts, db.ts, server.ts (server functions), api.ts │ └── wrangler.jsonc # bindings: DB (D1), ARTIFACTS (R2), SCAN_QUEUE ├── workers/ # Cloudflare consumer Worker (openvscan-scanner) │ ├── src/index.ts # ScannerContainer + queue() handler │ ├── container/ # Dockerfile (node + Trivy) + server.mjs │ └── wrangler.jsonc # queue consumer + D1 + R2 + Container bindings ├── packages/ │ ├── db/ # Drizzle SQLite schema for D1 + migrations │ └── types/ # Shared TypeScript types & enums └── package.json # Root scripts ``` ## 开发 ### 前置条件 - Node.js 22.12+ - pnpm 8+ - 一个 Cloudflare 账户(使用 Workers Paid 以运行扫描器 container) - Docker(仅用于构建/运行扫描器 container) ### 命令 ``` # 开发 pnpm dev:web # web Worker (local D1/R2/Queue via vite plugin) pnpm --filter openvscan-workers dev # scanner Worker (needs Docker) # Build pnpm prebuild # build shared packages pnpm build # build the web Worker # Database (D1) pnpm db:generate # generate SQLite migrations from the schema pnpm db:migrate:local # apply to local D1 pnpm db:migrate # apply to remote D1 ``` ## 部署 所有内容都部署到 Cloudflare。 ``` # 1. 将 migrations 应用到远程 D1 pnpm db:migrate # 2. 部署 scanner Worker(包含 build 和 push container image — 需要 Docker) pnpm --filter openvscan-workers deploy # 3. 部署 web Worker pnpm deploy # 4. 在 web Worker 上设置 production secrets pnpm --filter openvscan-web exec wrangler secret put BETTER_AUTH_SECRET # 同时将 BETTER_AUTH_URL / VITE_APP_URL 设置为已部署的 origin,然后重新 deploy ``` ## 文档 - **[AGENTS.MD](AGENTS.MD)** — 面向 AI agent 的架构上下文 - **[CONTRIBUTING.md](CONTRIBUTING.md)** — 贡献指南 - **[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)** — 社区标准 ## 许可证 仅根据 GNU Affero General Public License v3.0 获得许可。详情请参阅 [LICENSE](LICENSE)。 ## 致谢 OpenVScan 构建在受信赖的开源安全工具之上: - [Trivy](https://github.com/aquasecurity/trivy) — container、文件系统及 repository 扫描 - [OWASP ZAP](https://www.zaproxy.org/) — DAST 扫描(计划中) - [Nmap](https://nmap.org/) — 网络扫描(计划中) - [Semgrep](https://semgrep.dev/) — 静态分析(计划中) **由 [Buddhsen Tripathi](https://github.com/Buddhsen-tripathi) 制作** 如有疑问或需要支持,请[提交一个 issue](https://github.com/Buddhsen-tripathi/openvscan/issues)。
标签:AI应用开发, Cloudflare, MITRE ATT&CK, React, Serverless, Syscalls, Web安全, 加密, 安全测试, 攻击性安全, 漏洞扫描器, 程序员工具, 自动化攻击, 蓝队分析, 请求拦截