tamasmrtn/trivyal
GitHub: tamasmrtn/trivyal
一款面向家庭实验室和小型 Docker 环境的轻量级自托管容器漏洞扫描器,采用 Hub-Agent 架构,通过 Trivy 扫描运行时容器并聚合展示结果。
Stars: 0 | Forks: 0
一个轻量级、自托管的容器漏洞扫描器,采用 Hub-Agent 模型,由 Trivy 提供支持。
Trivyal 专为家庭实验室和小型多服务器 Docker 环境设计。一个轻量级的 Agent 运行在每台主机上,使用 Trivy 扫描本地容器,并将结果发送到中央 Hub,Hub 聚合所有数据并在单一 UI 中展示。 ## 替代方案 **[Harbor](https://goharbor.io/)** 是一个已从 CNCF 毕业的容器镜像仓库,内置漏洞扫描、镜像签名和基于角色的访问控制。如果你需要一个私有镜像仓库,请使用它——扫描功能是附带的 bonus。它在镜像仓库层面运行(在推送时扫描镜像),而不是在运行时层面,因此它无法检测到使用在新 CVE 披露之前推送的镜像运行的容器。 **[DefectDojo](https://www.defectdojo.org/)** 是一个功能齐全的 DevSecOps 漏洞管理平台。它接收来自多种扫描器(包括 Trivy)的发现结果,对其进行去重,跟踪修复进度,生成报告,并与问题跟踪器和 CI 流水线集成。当你需要在多个团队、产品和扫描器类型之间建立统一的安全管理程序时使用它——运行它需要投入大量的运维精力。 **在以下情况请使用 Trivyal**:你运行的是家庭实验室或小型多服务器 Docker 环境,并且需要一个单一的轻量级工具来告诉你当前主机上正在运行哪些漏洞——无需镜像仓库、无需流水线、无需专门的安全团队。Trivyal 专注于做一件事:通过 Docker socket 发现实际运行的内容,使用 Trivy 进行扫描,并将新发现呈现给你。 ## 功能特性 ### Hub - 仪表盘显示所有已连接的 Agent 及其状态(在线 / 离线 / 扫描中) - 跨所有主机的聚合漏洞视图 —— 可按严重程度(Critical, High, Medium, Low, Unknown)过滤 - 针对单个主机和单个容器的深入详情 - 发现时间线 —— 跟踪 CVE 出现和解决的时间 - 扫描间的差异视图 —— 高亮显示新增和已修复的发现 - 风险接受 —— 将某个发现标记为已接受,并附上原因和过期日期 - 针对单个发现的误报标记 - 每台主机的完整扫描历史日志 - 发现新的 Critical/High 级别漏洞时的 Webhook 通知(Slack, Discord, Ntfy) - Agent 管理 UI —— 添加、移除和查看 Agent;复制粘贴 Docker Compose 片段以快速部署 - 深色模式 UI(默认为深色,可切换) - 单一管理员用户,支持基于 Token 的 API 访问 ### Agent - 通过 Docker socket 自动发现所有运行中的容器 - 根据可配置的计划(默认:每晚)对每个容器进行 Trivy 镜像扫描 - 支持从 Hub 触发按需扫描 - 通过经过身份验证的 WebSocket 连接将结果发送到 Hub - 在本地缓存最后一次扫描结果,以便在 Hub 暂时无法访问时保持弹性 - 自我报告主机元数据(主机名、Docker 版本、操作系统、Agent 版本) - 轻量级 —— 作为单个 Docker 容器运行,以只读方式挂载 Docker socket ## 架构 Trivyal 采用 Hub-Agent 模型。Hub 是聚合扫描结果并提供 UI 的中央服务器。Agent 运行在每台 Docker 主机上,执行扫描,并通过持久化、经过身份验证的 WebSocket 连接回调 Hub。 ``` ┌─────────────────────────────────┐ ┌──────────────────────────────────┐ │ Hub Server │ │ Agent Host │ │ │ │ │ │ ┌─────────────────────────┐ │ │ ┌───────────────────────────┐ │ │ │ React UI │ │ │ │ Trivyal Agent │ │ │ │ (shadcn/ui dark mode) │ │ │ │ (Python) │ │ │ └──────────┬──────────────┘ │ │ │ │ │ │ │ HTTP │ │ │ - Docker socket listener │ │ │ ┌──────────▼──────────────┐ │ │ │ - Trivy runner │ │ │ │ FastAPI Hub │ │ │ │ - Result cache │ │ │ │ (Python) │◄───┼───────┼──│ - WebSocket client │ │ │ │ │ │ WSS │ └───────────┬───────────────┘ │ │ │ - Agent manager │ │ │ │ │ │ │ - Scan aggregator │ │ │ /var/run/docker.sock (ro) │ │ │ - Auth / token mgmt │ │ └──────────────────────────────────┘ │ │ - Notification sender │ │ │ └──────────┬──────────────┘ │ │ │ │ │ ┌──────────▼──────────────┐ │ │ │ SQLite DB │ │ │ └─────────────────────────┘ │ └─────────────────────────────────┘ ``` ### 技术栈 | 层级 | 选型 | |---|---| | Hub 后端 | Python 3.14 + FastAPI | | Hub 数据库 | SQLite via SQLModel | | Hub 前端 | React + shadcn/ui + Tailwind CSS | | Agent | Python 3.14 | | 包管理 | uv | | 扫描器 | Trivy (CLI, 由 agent 调用) | | 认证 | Ed25519 keypair + token (PyNaCl) | | 通信 | WebSocket (持久化,允许 Hub 发起扫描触发) | | 容器化 | Docker Compose | ### 注册流程 当你在 UI 中添加 Agent 时,Hub 会生成一个注册 Token 和一个 Ed25519 密钥对。你使用该 Token、Hub URL 和 Hub 公钥部署 Agent。首次连接时,Hub 验证 Token,Agent 通过签名质询验证 Hub 的身份。握手完成后,Agent 的机器指纹(派生自 `/etc/machine-id`)会被存储 —— 将该 Token 锁定到原始主机。 ## 快速开始 ### 前置条件 - 所有主机上均已安装 Docker 和 Docker Compose - Hub 主机必须能被所有 Agent 主机通过 TCP 访问(默认端口 `8099`) ### 1. 部署 Hub 在 Hub 主机上,克隆仓库并创建你的 `.env`: ``` cp .env.example .env ``` 编辑 `.env` 并至少设置: ``` TRIVYAL_SECRET_KEY=标签:Claude, CVE检测, DevSecOps, Docker, Go语言, GPT, Hub-Agent架构, LangChain, Web截图, 上游代理, 多服务器管理, 安全仪表盘, 安全防御评估, 家庭实验室, 容器安全, 开源安全工具, 漏洞管理, 程序破解, 聚合展示, 自托管, 请求拦截, 轻量级, 逆向工程平台, 镜像审计