josebright/iot-deviceshield

GitHub: josebright/iot-deviceshield

一款基于 NIST NVD 数据查询智能家居设备漏洞并借助本地 Qwen 2.5 模型生成通俗安全解读的全栈工具。

Stars: 0 | Forks: 0

# IoT-DeviceShield 智能家居设备漏洞查询工具,基于 NIST NVD 数据支持,并由本地托管的 LLM 提供增强功能。包含 NestJS API、Next.js 仪表盘、PostgreSQL,全部通过 Docker Compose 串联在一起。 该项目的核心目的:选择一款智能家居设备,查看针对其发布的 CVE,并阅读关于每个漏洞含义的通俗语言摘要。无需托管的 AI 提供商,无需注册 API 密钥,也没有请求配额限制。语言模型完全在你的本地机器上运行。 ## 状态 这是我为了提升后端和 DevSecOps 技能而构建的个人项目。它支持在本地端到端完整运行。该项目没有部署在任何公共环境,也没有针对多租户工作负载进行生产级别的强化。 - CVE 数据源:NIST NVD REST API 2.0(公开,无需身份验证,可选的 API 密钥可提高速率限制)。 - AI 增强:运行 Qwen 2.5 3B 开源权重模型的 [Ollama](https://ollama.com)。所有处理都在你的机器上完成;不会有任何数据离开你的网络。 - 存储:PostgreSQL 16。 ## 快速开始 前置条件:Docker Desktop(或 Docker Engine + Compose v2)。建议在具有 8 GB 或更多内存的笔记本电脑上运行。 ``` git clone https://github.com/josebright/iot-deviceshield.git cd iot-deviceshield cp .env.example .env # 生成用于保护 admin/catalog mutation routes 的 admin token: printf "ADMIN_API_TOKEN=%s\n" "$(openssl rand -hex 32)" >> .env docker compose --env-file .env -f infra/docker/docker-compose.yml up -d ``` 首次启动时会下载 Ollama 镜像(约 1 GB)和 Qwen 2.5 3B 模型(约 1.9 GB)。在全新克隆的情况下大约需要 5–10 分钟。由于 volume 会同时缓存这两者,随后的启动将是瞬间完成的。 然后打开 [http://localhost:3001](http://localhost:3001)。 ## 功能说明 1. 首次启动时,API 会遍历一个包含约 18 个智能家居设备的精选目录(`packages/catalog/src/catalog.json`),将它们 upsert 到 Postgres 中,并请求 NIST CPE 字典为每个设备解析标准的 CPE 标识符。具有较高置信度的匹配项将用于后续的 CVE 查找。 2. 当用户在 Web 应用上选择一个设备时,API 会查询 NIST NVD 以获取与该设备匹配的 CVE(如果可用,则通过 `cpeName` 查询,否则通过关键字搜索)。 3. 对于每个 CVE,API 会将描述发送到本地运行的 Qwen 2.5 模型,并以 JSON 格式请求生成五个通俗字段:漏洞内容、威胁、影响、受影响的系统以及建议。 4. 结果会按设备缓存在数据库中(默认 30 分钟)。在 TTL 时间内对同一设备的后续查询将从缓存中提供,只需几十毫秒。 5. 每个传入的请求都会被提取指纹(IP、user agent、`X-Client-Id`)并按客户端进行速率限制。屡次滥用者可以通过管理员 endpoint 自动限流或手动拉黑。 ## 技术栈(实际运行的内容) | 层级 | 选择 | | ---------- | ----------------------------------------------------------- | | Monorepo | pnpm workspaces + Turborepo | | API | NestJS 11 · TypeORM · PostgreSQL 16 · Zod 环境变量验证 | | Web | Next.js 15 App Router · React 19 · MUI 6 | | Shared | `@iot-deviceshield/types`, `@iot-deviceshield/catalog` | | AI | 运行 Qwen 2.5 3B 的 Ollama(Q4_K_M 量化) | | CVE feed | NIST NVD REST API 2.0 | | Container | 多阶段 Alpine Dockerfile,非 root 用户,healthchecks | | Rate limit | 基于指纹密钥的客户端限流 + 管理员黑名单 | | Observ. | nestjs-pino JSON 日志 · Web 端的 Sentry(通过 DSN 选择性启用) | ## 端点 公开端点(受速率限制,无需身份验证): - `GET /v1/category` — 包含相关设备的类别 - `GET /v1/devices/:slug` — 通过 slug 获取单个设备 - `GET /v1/vulnerabilities?slug=` — 某设备的 CVE 及 AI 增强信息 - `GET /v1/health` — 存活状态 - `GET /v1/health/ready` — 就绪状态(数据库检查) 管理员端点(需要来自 `ADMIN_API_TOKEN` 的 bearer token): - `POST /v1/catalog/refresh` — 强制重新同步目录和 CPE - `POST /v1/catalog/devices/:slug/resolve-cpe` — 为单个设备重试 CPE 解析 - `GET /v1/catalog/status` — 上次刷新时间、未解析的设备、错误日志 - `GET /v1/admin/clients` — 分页的指纹注册表 - `POST /v1/admin/clients/:id/blacklist` - `POST /v1/admin/clients/:id/unblacklist` 在开发环境中,Swagger UI 位于 [http://localhost:3000/v1/docs](http://localhost:3000/v1/docs)。 ## 仓库布局 ``` iot-deviceshield/ ├── apps/ │ ├── api/ # NestJS backend │ └── web/ # Next.js dashboard ├── packages/ │ ├── catalog/ # Curated device catalog + Zod schema │ ├── types/ # Shared DTOs and domain types │ ├── tsconfig/ # Shared TSConfig presets │ └── eslint-config/ # Shared ESLint config ├── infra/ │ └── docker/ # docker-compose stack ├── docs/ # ARCHITECTURE, SETUP, SECURITY └── .github/workflows/ # CI: lint, typecheck, test, security scans ``` ## 常用命令 ``` pnpm install # install workspaces pnpm dev # run api + web in watch mode pnpm build # production build for every workspace pnpm typecheck # tsc --noEmit across the monorepo pnpm lint # ESLint / next lint pnpm test # jest suites # Docker stack pnpm docker:up # start postgres + ollama + api + web pnpm docker:down # stop everything (keeps volumes) pnpm docker:rebuild # rebuild images without cache ``` ## 已测试与未测试内容 本次提交时的实际情况: | 领域 | 测试情况 | | --------------------------------------- | ---------------------------------------------------------------- | | 目录 schema(Zod 验证) | 是 | | CVSS 指标标准化 | 是 | | 漏洞服务(NIST + Ollama) | 否,通过 curl 和 UI 手动测试 | | 目录同步(upserts + CPE 解析) | 否,在首次启动时手动测试 | | 客户端指纹注册表 | 否,手动测试 | | 管理员端点 | 否,通过 `curl -H "Authorization: Bearer ..."` 手动测试 | | Web UI | 通过 Playwright 冒烟测试在本地构建和渲染 | 测试目录并不是这里的重点。真正的亮点在于系统架构,以及 AI 增强功能完全实现了离线运行。 ## 历史 该项目整合并替代了之前两个大学的论文代码库,这两个代码库将作为历史保留在线上: - [cve-vulnerability-api](https://github.com/josebright/smart-home-vulnerabilities) — 原始的 NestJS 后端 - [shd-risk-assessment](https://github.com/josebright/shd-risk-assessment) — 原始的 Next.js 仪表盘 这两个旧版代码库仍保持公开以供参考。均不再进行维护。 ## 文档 - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) — 数据模型、请求流程、安全态势、决策和权衡 - [docs/SETUP.md](docs/SETUP.md) — 本地开发、环境变量、常见坑 - [CONTRIBUTING.md](CONTRIBUTING.md) — 代码规范、工作流、PR 预期 - [SECURITY.md](SECURITY.md) — 漏洞披露政策 ## 许可证 该项目基于 **PolyForm Noncommercial License 1.0.0** 发布。你可以出于个人、研究或教育目的阅读、运行、复刻和修改代码。商业用途(包括托管公共部署)需要获得我的书面许可。详情请参阅 [LICENSE](LICENSE)。
标签:AI风险缓解, CVE, Docker Compose, NestJS, 数字签名, 本地大模型, 测试用例, 漏洞查询, 物联网, 自动化攻击, 请求拦截