noisegratte/proxmox-trivy-scanner
GitHub: noisegratte/proxmox-trivy-scanner
一款专为 Proxmox VE 环境定制的 Trivy 漏洞扫描器,通过 LXC 容器和 QEMU Guest Agent 实现全基础设施的集中化 CVE 监测与仪表板可视化管理。
Stars: 0 | Forks: 0
# Proxmox Trivy 扫描器
一款使用 [Trivy](https://github.com/aquasecurity/trivy) 针对 Proxmox VE 环境的自动化 CVE 漏洞扫描工具。
该工具在每个 Proxmox 节点上部署一个专用的 LXC 容器,并通过 Web 仪表板扫描和监控整个基础设施中的漏洞。
## 功能特性
- 遵循 [community-scripts/ProxmoxVE](https://github.com/community-scripts/ProxmoxVE) 规范的单行安装
- 基于 Trivy 的 CVE 扫描(聚合 OSV.dev + NVD 数据库)
- 支持暗色模式的 Web 仪表板(端口 8080),采用 API 密钥认证
- 通过 SSH + `pct exec` 远程扫描 LXC 容器
- 通过 QEMU Guest Agent (`qm guest exec`) 远程扫描 VM
- 支持 dpkg (Debian/Ubuntu)、apk (Alpine) 和 pacman (Arch Linux) 包管理器
- 支持按需扫描和每日定时扫描
- 提供 REST API 以便与监控工具集成
- “仅可修复”过滤器,专注于可操作的漏洞
- 采用 Gunicorn WSGI 服务器,具备输入验证、路径白名单和安全头
## 快速安装
在您的 Proxmox 主机上运行:
```
bash -c "$(curl -fsSL https://raw.githubusercontent.com/noisegratte/proxmox-trivy-scanner/main/ct/trivy.sh)"
```
这将创建一个 Debian 13 LXC(2 CPU,1GB 内存,8GB 磁盘),并预配置好 Trivy 和仪表板。
## 安装后设置
### 1. 获取您的 API 密钥
```
pct exec -- cat /opt/trivy-dashboard/.api_key
```
### 2. 远程扫描
远程扫描在安装过程中已**自动配置**:
- `config.json` 已填入 Proxmox 主机 IP 和容器 ID
- 生成的 SSH 密钥已在主机上授权
- 主机指纹已添加到容器的已知主机中
如需覆盖配置,请编辑 LXC 内部的 `/opt/trivy-dashboard/config.json`:
```
{
"pve_host": "",
"pve_user": "root",
"self_ctid": ""
}
```
### 3. VM 扫描要求
VM 通过 QEMU Guest Agent 进行扫描。启用步骤:
- 在每个 VM 内部安装 `qemu-guest-agent`
- 在 Proxmox VM 设置中启用代理(选项 > QEMU Guest Agent)
未安装 Guest Agent 的 VM 将在远程扫描中被跳过。
## 架构
```
Proxmox Host
|
+-- LXC "trivy" (Debian 13)
|-- Trivy binary
|-- Gunicorn + Flask dashboard (:8080)
|-- Daily scan timer (3am)
|-- Remote scanner
| |-- LXC containers (SSH -> pct exec)
| +-- VMs (SSH -> qm guest exec)
+-- /opt/trivy-results/ (JSON scan history)
```
## 仪表板
访问地址 `http://:8080`(需要 API 密钥)
- 严重等级分类卡片(CRITICAL / HIGH / MEDIUM / LOW)
- 远程容器和 VM 概览,显示健康指标和漏洞条形图
- CVE 表格,包含 NVD 链接、软件包版本、修复可用性
- 从 UI 触发本地或远程扫描
- 按严重等级过滤,切换“仅可修复”
- 点击任意容器/VM 查看其 CVE 详情
## API
所有 API 端点都需要通过 `Authorization: Bearer ` 请求头、`?key=` 查询参数或会话 Cookie 进行认证。
| 端点 | 方法 | 描述 |
|---|---|---|
| `/api/results/latest` | GET | 最新的本地扫描结果 |
| `/api/results` | GET | 列出所有扫描文件 |
| `/api/scan` | POST | 启动本地扫描 |
| `/api/scan/status/` | GET | 检查扫描任务状态 |
| `/api/remote/scan` | POST | 扫描所有远程 CT 和 VM |
| `/api/remote/summary` | GET | 最新的远程扫描摘要 |
| `/api/remote/results/` | GET | 特定 CT 或 VM 的结果 |
### 示例:启动扫描
```
curl -X POST http://:8080/api/scan \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"scan_type":"fs","target":"/","severity":"HIGH,CRITICAL"}'
```
## 安全
完整的的安全模型和加固建议请参阅 [SECURITY.md](SECURITY.md)。
关键点:
- 仪表板受 API 密钥认证保护(256 位,恒定时间比较)
- SSH 使用 `StrictHostKeyChecking=yes`(不自动接受)
- 扫描路径根据白名单进行验证
- 容器/VM ID 验证为数字以防止注入
- 严重性参数根据显式允许列表进行验证
- 使用 Gunicorn 生产服务器(非 Flask 开发服务器)
- 安全头(X-Frame-Options, X-Content-Type-Options, CSP 等)
- 线程安全的扫描作业管理,带有自动剔除机制
- 自动清理 30 天前的扫描结果
## 配置
| 文件 | 描述 |
|---|---|
| `/opt/trivy-dashboard/config.json` | PVE 主机、用户、自身 CTID |
| `/opt/trivy-dashboard/.api_key` | 仪表板认证密钥 |
| `/etc/systemd/system/trivy-scan.timer` | 每日扫描计划 |
环境变量 `PVE_HOST`、`PVE_USER`、`SELF_CTID` 可覆盖配置文件中的值。
## 路线图
- [x] 基于扫描邻居 LXC 容器的 SSH
- [x] 通过 QEMU Guest Agent 扫描 VM
- [ ] 多节点聚合仪表板
- [ ] 扫描历史比较(新出现/已解决 的 CVE)
- [ ] Webhook 通知(Gotify, Ntfy)当出现新的 CRITICAL 级别漏洞时
- [ ] Docker 镜像扫描支持
- [ ] 用于 helper-scripts.com 的 metadata.json
## 许可证
MIT - 详见 [LICENSE](LICENSE)
Trivy 由 Aqua Security 根据 [Apache 2.0](https://github.com/aquasecurity/trivy/blob/main/LICENSE) 授权。
community-scripts 构建框架根据 [MIT](https://github.com/community-scripts/ProxmoxVE/blob/main/LICENSE) 授权。
Flask 根据 [BSD-3-Clause](https://github.com/pallets/flask/blob/main/LICENSE.txt) 授权。
Gunicorn 根据 [MIT](https://github.com/benoitc/gunicorn/blob/master/LICENSE) 授权。
标签:Debian, DevSecOps, GPT, LXC容器, PE 加载器, Proxmox VE, Python, QEMU, REST API, SSH, Web Dashboard, Web报告查看器, 上游代理, 内联执行, 基线扫描, 安全合规, 指令遵循, 无后门, 无线安全, 漏洞管理, 网络代理, 网络安全审计, 网络测绘, 自动化运维, 虚拟化安全, 身份验证强制, 逆向工具