基于 Aqua Security Trivy 的容器镜像安全扫描工具,提供简洁的 Web UI 界面,用于对容器镜像进行漏洞扫描、配置检查和 SBOM 生成。
- 🔍 容器镜像漏洞扫描(基于 Trivy)
- 📊 实时扫描进度和日志展示(SSE)
- 📋 漏洞结果可视化(支持按严重等级筛选)
- 📥 多格式报告导出(JSON/HTML/SARIF/SBOM)
- 📚 扫描历史管理(支持分页、搜索、过滤)
- ⚙️ 扫描配置保存与管理
- 🔐 支持私有镜像仓库认证
- 🔒 OIDC 统一认证支持(可选,用户数据隔离)
- 🎯 任务队列管理(串行执行,队列状态可视)
- ⚡ 前后端分离架构,易于部署
后端:
- Go 1.25+
- Gin Web Framework v1.11.0+
- Trivy (Client-Server 模式)
- Cobra (命令行参数解析)
- Viper (配置管理)
前端:
- React 19.1+
- Ant Design 5.27+
- JavaScript (非 TypeScript)
本项目使用 Client-Server 模式,需要先部署 Trivy Server。
Docker Compose 部署(推荐):
version: '3.8'
services:
trivy-server:
image: aquasec/trivy:latest
container_name: trivy-server
command:
- server
- --listen=0.0.0.0:4954
volumes:
- trivy-cache:/root/.cache/trivy
ports:
- "4954:4954"
restart: unless-stopped
volumes:
trivy-cache:启动服务:
docker-compose up -d详细配置请参考 Trivy Server 部署文档
适用于 Lazycat Cloud 平台部署。
make build-dist
# 或手动构建
sh build.shmake build-backend
# 或手动构建
cd backend
docker build -t registry.lazycat.cloud/trivy/backend:latest .make push
# 或手动推送
docker push registry.lazycat.cloud/trivy/backend:latestmake build-lpk
# 或手动构建
lzc build将生成的 .lpk 文件上传到 Lazycat Cloud 平台进行部署。
环境变量说明:
后端环境变量:
TRIVY_TRIVY_SERVER: Trivy Server 地址(必需),例如http://trivy-server:4954TRIVY_DEFAULT_REGISTRY: 默认镜像仓库地址前缀TRIVY_ALLOW_PASSWORD_SAVE: 是否允许保存密码到配置文件,默认falseTRIVY_MAX_WORKERS: 最大并发扫描工作线程数,默认5TRIVY_SCAN_RETENTION_DAYS: 扫描历史保留天数,默认90
OIDC 认证环境变量(可选):
TRIVY_OIDC_CLIENT_ID=${LAZYCAT_AUTH_OIDC_CLIENT_ID}TRIVY_OIDC_CLIENT_SECRET=${LAZYCAT_AUTH_OIDC_CLIENT_SECRET}TRIVY_OIDC_ISSUER=${LAZYCAT_AUTH_OIDC_ISSUER}TRIVY_OIDC_REDIRECT_URL=https://${LAZYCAT_APP_DOMAIN}/api/v1/auth/callback
LPK 部署说明:
- 前端通过
application.routes配置自动代理到后端 - 修改后端地址或端口时,只需更新
lzc-manifest.yml中的routes配置 - 详见 部署指南
# 使用 Makefile(推荐)
make dev-backend
# 或手动启动
cd backend
go mod download
export TRIVY_TRIVY_SERVER="http://localhost:4954"
export TRIVY_DEFAULT_REGISTRY="docker.io/"
go run cmd/server/main.go后端服务默认运行在 http://localhost:8080
可以通过 -p 或 --port 参数指定端口:
go run cmd/server/main.go --port 9090# 使用 Makefile(推荐)
make dev-frontend
# 或手动启动
cd frontend
npm install
npm start前端服务默认运行在 http://localhost:3000
配置说明:
后端支持通过环境变量或命令行参数配置。主要配置项:
--trivy-server: Trivy Server 地址(必需)--default-registry: 默认镜像仓库地址前缀--timeout: 扫描任务超时时间(秒),默认 600--config-dir: 配置文件存储目录,默认./configs--reports-dir: 扫描报告存储目录,默认./reports--allow-password-save: 是否允许保存密码,默认false
环境变量格式:TRIVY_ + 参数名(横线替换为下划线),例如 TRIVY_TRIVY_SERVER
- 打开浏览器访问
http://localhost:3000 - 填写镜像地址(例如:
docker.io/library/nginx:latest) - 如果是私有仓库,填写对应的用户名和密码
- 选择扫描选项:
- 漏洞严重等级过滤(CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN)
- 是否忽略未修复的漏洞
- 扫描器类型(vuln, misconfig, secret, license)
- 检测优先级(precise / comprehensive)
- 包类型过滤(os, library)
- 选择输出格式(JSON / Table / SARIF / CycloneDX / SPDX)
- 点击"开始扫描"按钮
- 实时查看扫描日志和进度
- 扫描完成后查看漏洞结果,支持:
- 按严重等级筛选
- 按包名称搜索
- 查看漏洞详细信息(CVE ID、描述、CVSS 评分、修复建议等)
- 下载多格式报告(JSON/HTML/SARIF/SBOM)
配置保存(高级功能):
- 通过高级选项面板可以保存常用配置,方便下次使用
- 支持多配置管理,每个配置最大 4KB
- 每个用户最多保存 1000 个配置
- 启用 OIDC 认证后,配置自动隔离,每个用户独立管理
- 密码保存功能默认禁用(
--allow-password-save=false),需要时可通过参数启用
trivy-web-ui/
├── backend/ # Go 后端
│ ├── cmd/
│ │ └── server/
│ │ └── main.go # 应用入口
│ ├── internal/ # 内部包
│ │ ├── config/ # 配置管理(已废弃,使用 types.Config)
│ │ ├── models/ # 数据模型
│ │ ├── types/ # 类型定义
│ │ ├── repository/ # 数据访问层
│ │ ├── service/ # 业务逻辑层
│ │ ├── handler/ # HTTP 处理层
│ │ ├── middleware/ # 中间件
│ │ ├── router/ # 路由管理
│ │ └── pkg/ # 工具包
│ ├── go.mod
│ ├── Dockerfile
│ └── .gitignore
├── frontend/ # React 前端
│ ├── src/
│ │ ├── App.js # 主组件
│ │ └── App.css # 样式
│ ├── package.json
│ └── .gitignore
├── dist/ # 构建输出目录(由 build.sh 生成)
│ └── web/ # 前端静态文件
├── docs/ # 文档目录
│ ├── trivy-server-deployment.md
│ └── DEPLOYMENT.md
├── build.sh # 前端构建脚本
├── lzc-build.yml # LPK 构建配置
├── lzc-manifest.yml # LPK 应用清单
├── icon.png # 应用图标
├── Makefile # 构建命令
├── CLAUDE.md # Claude 参考文档
└── README.md # 项目说明
- POST
/api/v1/scan- 创建扫描任务 - GET
/api/v1/scan/:id- 查询扫描任务状态 - GET
/api/v1/scan- 查询扫描任务列表(支持分页、过滤) - GET
/api/v1/scan/:id/logs- 获取扫描任务的实时日志流 (SSE) - DELETE
/api/v1/scan/:id- 删除扫描任务 - DELETE
/api/v1/scan/:id/cancel- 取消队列中的扫描任务 - POST
/api/v1/scan/:id/rescan- 使用相同参数重新扫描
- GET
/api/v1/scan/:id/report/:format- 下载指定格式的扫描报告- 支持格式:
json,html,sarif,cyclonedx,spdx,table
- 支持格式:
- GET
/api/v1/scan/:id/report/archive- 批量下载所有格式的报告(ZIP)
- GET
/api/v1/config/:name- 获取已保存的用户配置 - POST
/api/v1/config/:name- 保存用户配置 - DELETE
/api/v1/config/:name- 删除已保存的用户配置 - GET
/api/v1/configs- 获取所有配置名称列表 - GET
/api/v1/config/last-used- 获取最后使用的配置名称
- GET
/api/v1/queue/status- 查询任务队列状态
- GET
/api/v1/auth/login- 跳转到 OIDC 登录页 - GET
/api/v1/auth/callback- OIDC 认证回调 - POST
/api/v1/auth/logout- 注销当前用户会话 - GET
/api/v1/auth/userinfo- 获取当前用户信息
- GET
/api/v1/health- 健康检查接口
详细 API 文档请参考 CLAUDE.md
make help # 显示所有可用命令
make build # 构建后端镜像和前端 dist
make build-backend # 构建后端 Docker 镜像
make build-dist # 构建前端到 dist 目录
make build-lpk # 构建 LPK 包(需要 lzc-cli)
make build-local # 本地编译后端二进制
make push # 推送后端镜像到仓库
make dev-backend # 启动后端开发服务
make dev-frontend # 启动前端开发服务
make test # 运行测试
make clean # 清理构建输出应用内置了完整的调试功能,方便在移动端和生产环境排障:
-
浮动调试按钮
- 位于页面右下角的虫子图标
- 显示当前调试日志数量徽章
- 点击打开调试日志面板
-
调试日志记录
- 自动记录所有关键操作(初始化、API 请求、错误等)
- VSCode 风格深色主题显示
- 支持清空日志和自动滚动
-
版本信息显示
- 页面底部显示应用版本、Git commit、分支名和构建时间
- 鼠标悬停查看完整 commit 哈希
- 方便快速确认部署版本
build.sh 脚本会自动注入以下构建信息:
- Git commit 短哈希(如
502089b) - Git 分支名
- 构建时间(UTC)
这些信息会编译到前端代码中,并显示在页面底部。
- 基础 Web UI 界面
- 镜像扫描功能(支持多种扫描选项)
- 实时日志查看功能(SSE)
- 漏洞结果展示和筛选
- 多格式报告导出(JSON/HTML/SARIF/SBOM)
- 扫描历史管理(列表、分页、搜索)
- 任务队列管理(串行执行)
- 配置保存与管理
- OIDC 认证支持
- 前端调试工具(浮动按钮 + 日志面板)
- Git 版本信息显示(commit、分支、构建时间)
- 后端分层架构重构
- LPK 打包支持
- 扫描结果对比功能(同镜像不同版本)
- 存储统计和配额管理
- 后台定时清理任务
- Docker 本地镜像扫描支持
- 部署指南 - 详细的环境变量配置和部署说明
- Trivy Server 部署 - Trivy Server 配置和部署
- Claude 开发文档 - 项目技术架构和开发指南
MIT
欢迎提交 Issue 和 Pull Request!