上线前夜,被问一句「这个镜像里有没有已知的漏洞」,最怕的不是有洞,而是手头没有工具能马上回答。Trivy 是 Aqua Security 开源的安全扫描器,一条命令就能把容器镜像、代码目录、Kubernetes 集群里的已知漏洞、错误配置、泄露的密钥翻出来。它的目标清单很长:容器镜像、文件系统、git 仓库、虚拟机镜像、K8s 集群都能扫,主流编程语言和操作系统也基本覆盖。今天现查的数据照样硬气:39,204 star,Apache-2.0 许可证,昨天还有提交。
项目名片
| 项 | 值 |
|---|---|
| 仓库 | aquasecurity/trivy |
| 数据 | 39,204 star / 846 fork / 322 open issues(2026-11-11 抓取) |
| 技术栈 | Go,单二进制发行 |
| 许可证 | Apache-2.0 |
| 最新版本 | v0.76.2(2026-11-05 发布) |
| 最近提交 | 2026-11-10 |
| 运行方式 | 本地命令行 / Docker / CI 插件 |
它解决什么问题
一个业务镜像是基础镜像层层叠出来的,里面塞着系统软件包和一堆依赖库,谁也说不清哪一层带了带 CVE 编号的旧版本。市面上的安全扫描又常常是重量级平台,装一套要周折一周。Trivy 把扫描压成一条命令:不挑语言不挑系统,容器镜像、文件系统、git 仓库、K8s 集群都能当目标(README 原文:Trivy has scanners that look for security issues, and targets where it can find those issues)。一句话说清边界:它替掉的是「不知道漏洞在哪」的信息差,替不掉的是修复本身——扫出来的洞,还是要靠升级依赖、改 Dockerfile 来补。
核心机制
- 扫描靠本地缓存里的漏洞数据库做匹配,数据库要定期更新,第一次跑会先下载,CLI 里有 --download-db-only 参数专门用来单独下库。
- 扫镜像时,它按优先级从 docker、containerd、podman 本地引擎或远程仓库取镜像层,解包识别系统包和依赖库,再对数据库查 CVE,顺手生成一份软件物料清单,软件许可证也在扫描清单里。
- 除漏洞外还内置 IaC 检查(Dockerfile、Terraform、K8s 描述文件)和密钥检测,用 --scanners 参数开关。
- 退出码可控:加 --exit-code 1,CI 里扫出问题就返回失败,直接当流水线门禁用。
跑起来
macOS 用 Homebrew 一条命令:
brew install trivy
trivy --version
Linux 有官方 apt 仓库,也可以用安装脚本:
REPO=aquasecurity/trivy
RAW=raw/main/contrib/install.sh
curl -sfL github.com/$REPO/$RAW
脚本下到本地后,用下面这行完成安装:
sudo sh install.sh -b /usr/bin
不想装二进制,用官方镜像也能跑,扫一个现成镜像试试:
docker run aquasec/trivy image nginx:alpine
trivy --ignore-unfixed image nginx:alpine
结果是一张按危险等级排序的表,从 CRITICAL 到 UNKNOWN 逐级列出包名、当前版本和修复版本,对照着看就知道该升级哪个包。觉得结果还是吵,就在命令里加 --ignore-unfixed 参数过滤一遍。扫自己的项目目录,连漏洞带密钥一起查:
trivy fs --scanners vuln,secret,misconfig .
有 K8s 集群的,先看一份汇总报告:
trivy k8s --report summary cluster
整条路径看这张图:
从零到能用
- 装好后先执行 trivy --download-db-only,把漏洞库下到本地缓存,之后扫描不再等下载。
- 扫一个现成镜像:trivy image 加镜像名,几十秒后出结果表。
- 结果太吵就加 --ignore-unfixed,只看有补丁可修的条目。
- 扫自己的项目目录,把 vuln、secret、misconfig 三种扫描器一起开。
- CI 里加 --exit-code 1 和 --severity HIGH,CRITICAL,高危直接卡流水线。
- 要长期屏蔽某个 CVE,往项目根目录的 .trivyignore 文件里一行写一个编号。
适合谁用 / 别用
适合两类人:一是自建镜像没人审的小团队,发布前扫一遍,心里有底;二是想在 CI 里加安全门禁的开发者,官方还配了 trivy-action 这个 GitHub Action,Kubernetes 侧另有 trivy-operator。
别用的边界也要说清:需要漏洞运营平台、工单流转、合规报表的组织别指望它,Trivy 只管扫不管治理,官方商业版 Aqua 才是干这个的;把误报治理当核心诉求的团队也一样,它擅长发现,误报管理只有 .trivyignore 这么个起点,流程要自己搭。
三个真实的坑
- docker run 方式扫不到宿主机上的本地镜像,除非把容器引擎的 socket 挂进容器。官方安装文档原话:For scanning container images with Trivy, mount the container engine socket from the host into the Trivy container。文档同时建议把缓存目录也挂出来持久化,否则容器每次都要重新下载漏洞库。
- 默认把未修复的漏洞全列出来,老镜像一扫几百条,其中很多根本没有补丁可修。CLI 文档里 --ignore-unfixed 的说明原文是 display only fixed vulnerabilities,只显示有修复版本的条目;想长期屏蔽特定 CVE,用默认加载的 .trivyignore 文件。
- 多个任务共用缓存目录时可能报 database lock。这个错误常见到官方专门为它补了文档链接,见 issue #9531(feat: add documentation URL for database lock errors)。并发跑 CI 时,错开漏洞库更新时间,或者给后跑的加 --skip-db-update 参数。
小结
安全检查最难的不是扫,而是「今天扫了吗」。Trivy 把这件事压成一条命令,CI 里加两行参数就能当门禁。上线前夜那句「有没有漏洞」,以后用一条命令回答。
参考资料
- 仓库:https://github.com/aquasecurity/trivy
- 安装文档:https://trivy.dev/docs/latest/getting-started/installation/
- CLI 参数:https://trivy.dev/docs/latest/guide/references/configuration/cli/trivy_image/
- v0.76.2:https://github.com/aquasecurity/trivy/releases/tag/v0.76.2
- issue 9531:https://github.com/aquasecurity/trivy/issues/9531
默认评论
Halo系统提供的评论