1cng-dev/SAW

GitHub: 1cng-dev/SAW

面向 security.1cloudng.com 的安全公告聚合器,统一接入 NVD、MITRE、GHSA 及厂商 RSS 等实时漏洞数据源,提供集中化的漏洞情报浏览与趋势追踪。

Stars: 0 | Forks: 0

# Sec-1CNG 一个专为 security.1cloudng.com 设计的安全公告聚合器。仅接入**真实、实时的**数据 —— 包括 NVD、MITRE、GitHub Security Advisories 以及安全新闻/供应商的 RSS feeds。整个 pipeline 中没有任何模拟或预置数据。 ## 技术栈 - **Frontend**: React 18 + TypeScript + Vite, TanStack Query/Router/Table/Virtual/Form, Chakra UI, recharts - **Backend**: Node.js + TypeScript + Fastify - **Database**: PostgreSQL via Drizzle ORM - **Cache/Queue**: Redis + BullMQ - **Monorepo**: npm workspaces (`apps/api`, `apps/worker`, `apps/web`, `packages/db`, `packages/shared`) ## 前置条件 - Node.js >= 20 - Docker(用于运行 Postgres + Redis,或通过 `docker compose up` 运行完整环境) - NVD API key 是可选的,但推荐使用 —— (未认证:5 req/30s,认证后:50 req/30s) - 必须提供 GitHub personal access token 才能进行 GitHub Security Advisory (GHSA) 的接入。如果没有该 token,GHSA 的接入逻辑虽然已完整配置,但会正常地空跳过 (输出日志 `skipped: no GITHUB_TOKEN configured`),而不会引发报错。 ## 设置 ``` cp .env.example .env # 编辑 .env:如果你有的话,填写 NVD_API_KEY / GITHUB_TOKEN npm install # 仅启动 Postgres + Redis(用于直接在主机上运行 api/worker/web) docker compose up -d postgres redis # 运行 Drizzle migrations npm run db:migrate ``` `npm run db:generate` 会在 schema 发生变更后,根据 `packages/db/src/schema/` 中的 Drizzle schema 重新生成迁移 SQL;`npm run db:studio` 将针对 正在运行的数据库打开 Drizzle Studio。 ## 运行应用 API 服务器和接入 worker 是**独立的进程** —— 请在单独的终端中运行它们 (或通过 Docker Compose 运行,见下文): ``` npm run dev:api # Fastify API on http://localhost:4000 npm run dev:worker # BullMQ worker: runs scheduled ingestion + trending jobs npm run dev:web # Vite dev server on http://localhost:5173 ``` Worker 在启动时会注册可重复执行的 BullMQ 任务,并会立即将每个任务 加入队列执行一次,以便让接入工作立即可见地开始运行: | Job | Interval | |---|---| | `sync-nvd-cves` | 每 2h(通过 `sync_state` 游标增量执行) | | `sync-news-feeds` | 每 15m | | `sync-vendor-advisories` | 每 6h | | `sync-ghsa-advisories` | 每 6h(若无 `GITHUB_TOKEN` 则空跳过) | | `recalculate-trending` | 每 30m | 随时检查 `GET /api/admin/sync-status`(或在浏览器中访问),以查看每个 Job 的上次运行时间、状态和记录数。 ## 触发手动同步 在 worker/scheduler 运行之前,或任何你想要在计划外按需 拉取数据时,请使用一次性的 CLI 脚本(与 BullMQ 处理器调用的接入代码相同): ``` npm run sync:nvd # pulls NVD_PULL_DAYS (default 7) days of lastModified CVEs npm run sync:news # pulls all 5 news RSS feeds once npm run sync:vendors # pulls MSRC/Ubuntu/Cisco vendor advisory feeds once ``` 每个脚本都会输出一份摘要(获取/插入/更新的记录数),并向 `sync_log` 写入一条记录。任何无法访问的数据源都会被明确记录 —— 绝不回退到使用占位符数据。 ### 已知数据源注意事项 - **SecurityWeek** 自此版本构建起会拦截自动化/数据中心流量(HTTP 403) —— 每次运行都会将其记录为失败的 feed,而非伪造数据。 - **Red Hat** 自此版本构建起没有可用的纯 RSS/Atom feed;其 发布格式为 CSAF/ROLIE JSON。未包含在 `VENDOR_FEEDS` (`packages/shared/src/constants.ts`)中 —— 若要添加,将需要专门的感知 CSAF 的接入模块。 ## Docker Compose(完整技术栈) ``` docker compose up -d ``` 启动 `postgres`、`redis`、一次性的 `migrate` 服务(运行 Drizzle 迁移后退出)、`api`(端口 4000)、`worker` 和 `web`(端口 5173, Vite 开发服务器将 `/api` 代理到 `api` 容器)。`NVD_API_KEY` / `GITHUB_TOKEN` 会自动从你的根目录 `.env` 中读取。 ``` docker compose logs -f worker # watch ingestion jobs run docker compose down # stop (add -v to also drop the Postgres volume) ``` ## 项目结构 ``` apps/ api/ Fastify HTTP API (reads only — never writes/ingests) worker/ Ingestion modules, one-off CLI scripts, BullMQ processors/scheduler web/ React frontend packages/ db/ Drizzle schema, migrations, db client factory shared/ Cross-cutting constants (feed URLs, CVE regex, severity colors), zod validation, types ```
标签:MITM代理, 前端工程, 后端开发, 搜索引擎查询, 数据库, 测试用例, 消息队列, 漏洞情报聚合, 请求拦截