Trivy 核心功能
核心功能
Trivy 的能力按子命令组织,每个子命令对应一类扫描目标。理解这张表基本就理解了 Trivy 的边界。
| 子命令 | 扫描目标 | 典型用途 |
|---|---|---|
trivy image | 容器镜像(远程或本地) | 构建后立刻扫,CI 门禁最常用 |
trivy fs | 本地文件系统目录 | 扫源码目录的依赖锁文件、顺带查密钥 |
trivy repo / trivy git | Git 仓库(含历史) | 扫历史提交里残留的敏感文件(新版本改名为 git,以官方文档为准) |
trivy rootfs | 已解包的根文件系统 | 扫从镜像导出的 rootfs,或嵌入式固件目录 |
trivy config | IaC 文件 | Terraform、CloudFormation、K8s YAML、Dockerfile 的配置检查 |
trivy k8s | 运行中的 K8s 集群 | 扫集群里实际的工作负载与 RBAC |
trivy sbom | 已有的 SBOM 文件 | 拿上游给的 SBOM 直接比对漏洞,不用重新解包镜像 |
漏洞库来源与更新策略。Trivy 从多个上游源(各发行版安全公告、GitHub Advisory、NVD 等)聚合数据,发布成 trivy-db 这个 OCI 制品,默认从 ghcr.io 拉取。默认行为是启动时检查更新,本地缓存有效期以官方默认值为准。生产环境建议固定节奏:CI 里靠 job 级缓存共享,避免每个 job 都去拉一次;内网则自建一份镜像并定期同步。
关键参数。下面这些是日常真正会用到的:
| 参数 | 作用 |
|---|---|
--severity HIGH,CRITICAL | 只输出指定级别,把噪音压下去 |
--ignore-unfixed | 忽略没有修复版本的漏洞,这是收敛噪音最有效的一刀 |
--exit-code 1 | 发现漏洞时返回非零退出码,CI 门禁的关键 |
--format table|json|sarif|cyclonedx|spdx | 人看用 table,机器处理用 json,接代码扫描面板用 sarif,出物料清单用 cyclonedx 或 spdx |
--scanners vuln,misconfig,secret | 选择扫描器,默认只跑 vuln;查密钥要显式加上 secret |
--ignorefile .trivyignore | 指定忽略文件,默认读当前目录的 .trivyignore |
--timeout 10m | 大镜像或网络慢时调大,否则会被超时中断 |
--parallel N | 并行分析的工作数,机器核多可以调大 |
--vex ./openvex.json | 用 VEX 文档声明不受影响的漏洞,走正规豁免而非硬忽略 |
检测优先级与 EOL 发行版
扫描结果出来之后,处理顺序应该是:先看 CRITICAL,再看 HIGH,并且只优先处理有 Fixed Version 的那部分——有修复版本意味着升级依赖或换基础镜像就能消掉,投入产出比最高。没有修复版本的漏洞记录在案、持续跟踪上游动态即可,不要因为它把发布流程卡死。MEDIUM 与 LOW 一般只做趋势统计,不进阻断条件。
另一个高频问题是 OS 发行版 EOL。当基础镜像用的是已经停止维护的发行版时,上游不再发补丁,Trivy 会扫出一大批标记为 unfixed 的漏洞,报告瞬间变得不可读。这种情况下真正的修法不是写忽略文件,而是换基础镜像。实践中的优先级大致是:受支持的 slim/alpine 版本 > distroless > 完整发行版。换完之后 unfixed 数量通常会明显下降,因为新版本的组件本身就更靠近上游。

