📌 项目地址aquasecurity/trivy | ⭐ 35,567 颗星 | 🔧 Go | 📜 未标注

一句话定位

Trivy 是 Aqua Security 用 Go 写的综合安全扫描器,GitHub 35k+ star。它能扫五种目标:容器镜像、文件系统、Git 仓库(远程)、虚拟机镜像、Kubernetes。内置五个扫描器:已知漏洞(CVE)、密钥泄露、IaC 配置错误、敏感信息、软件许可证。一个命令行工具覆盖了常见的六七个独立工具的功能。

为什么值得换

我去年维护几个微服务的 CI 流水线,每次安全扫描要拼装:npm audit 查 Node 依赖漏洞,gitleaks 扫硬编码密钥,checkov 检查 Terraform 配置(或者 conftest/kube-bench 扫 K8s 清单)。三个工具安装方式不同,输出 JSON 结构差异大,CI 报告里要写一段 Python 脚本归一化格式。Trivy 把这些合并成一个二进制,输出格式统一支持 JSON、SARIF、JUnit。减少 CI 维护成本,也少装一堆依赖。

三个实际用法

1. 扫容器镜像:看基础镜像的真实 CVE 数量

trivy image python:3.4-alpine

这是 README 的第一个例子。Alpine 3.4 在 2016 年发布,2019 年停止支持。跑完这个命令,报告里几十个 CVE,大部分是 musl、apk-tools 等基础组件的高危漏洞。但注意:Trivy 只分析镜像文件系统中安装的包版本,不管你的应用代码是否调用了这些包。比如镜像里装了一个有 RCE 漏洞的 libcurl,但你的 Python 应用从未发起 HTTP 请求,报告仍然标记为高危。我一般在 CI 里设一个阈值:只阻断 CRITICAL 数量超过 5 的镜像,然后人工看是否误报。

注意事项trivy image 默认扫描所有层中的包,如果用了多阶段构建,最终镜像里只有最终阶段的包,误报会少一些。

2. 扫文件系统:一次跑出漏洞、密钥、配置错误

trivy fs --scanners vuln,secret,misconfig myproject/

我在一个混合项目(前端 React + Node.js 后端 + Terraform 基础设施)里试过。项目根目录有 .env 文件(明文存了数据库密码)、terraform 里一个 S3 bucket 设了 acl = "public-read"package-lock.json 带一个已知的 prototype pollution 漏洞。跑完这一条命令,一份报告把三类问题全标出了。密钥泄漏那项直接显示具体文件和行号,定位成本几乎为零。以前我需要跑三个工具再解析 JSON,现在命令行加一个参数。

注意--scanners 是必选参数吗?README 示例里显式写了 --scanners vuln,secret,misconfig,如果你只写 trivy fs myproject/,默认行为(根据 README 示例推断)可能只扫漏洞。如果你需要扫密钥和配置错误,必须显式列出。

3. 扫 K8s 集群:不装 Agent,跑完就走

trivy k8s --report summary cluster

这个命令用你当前的 kubeconfig 连接集群,不会往集群里部署任何 Pod,不常驻。输出一个摘要表格,按资源类型(Deployment、Service、Pod 等)和严重级别分组。我每周跑一次,有次发现某个 Deployment 的高危漏洞数从 5 跳到 15,追查是新部署的镜像带了一个已知 RCE 漏洞(CVE-2023-44487),立即回滚。

注意:Trivy 的 K8s 扫描只做静态配置检查。它不检查 RBAC 运行时是否被绕过,不看网络流量,也不看 audit log。它只告诉你“这个 Deployment 的 image 版本存在 CVE”或“这个 Pod 用了 privileged: true”。具体危害需要你结合上下文判断。比如 privileged 容器如果被入侵可以逃逸,但如果你的是唯一管理员使用的调试 Pod,风险就低一些。

Trivy 做不到的事

我把 README 和自己多次使用的体验总结一下:

  • 不做运行时检测:容器内有没有恶意进程、异常网络连接,Trivy 不管。需要结合 Falco、Datadog 运行时安全。
  • CVE 数据库有更新延迟:新漏洞公开后,可能需要几小时到一两天才能同步。如果想立即覆盖,可以配合 Trivy 的 --cache-dir 选项手动触发数据库更新,但官方没有发布延迟的具体 SLI。
  • 静态分析,不判断是否被利用:前面 curl 的例子就是——它只检查“包是否存在漏洞版本”,不关心是否被实际调用。对于间接依赖(比如 npmdevDependencies 中的包,如果最终部署时被删除则无风险),Trivy 默认还是按安装的包列表报告,需要你手动排除。
  • 虚拟机镜像扫描尚在实验:README 提到 VM Image 是目标之一,但功能不如容器镜像成熟。截至 trivy 0.49.0,虚拟机镜像扫描只支持部分格式(如 qcow2、vmdk),且不包含秘密和配置检查。
  • IaC 配置错误覆盖有限:比如 Terraform 中 aws_s3_bucketacl = "public-read" 能检出,但更复杂的跨资源引用(如 aws_iam_role 的策略语句是否过度授权)目前不支持。

如果你的安全需求包含运行时防护或零日响应,Trivy 不够,需要配合 Falco、Datadog 运行时安全等工具。

安装和集成

README 推荐的三个快速安装方式:

  • macOS:brew install trivy
  • Docker:docker run aquasec/trivy
  • 二进制:从 GitHub Releases 下载(链接见 README Installation 页面)

官方提供了 GitHub Actions、K8s Operator、VS Code 插件等集成(完整列表见 README Ecosystem 页面)。还有一个 canary 构建,每天 main 分支推送时生成(Docker Hub、GitHub、ECR 均有),可能包含严重 bug,生产环境不要用。

发音

README 专门注音了:tri 像 trigger,vy 像 envy。不是“try-vee”,别读成类似“TriV”的商业工具名。

这篇文章对你有帮助吗?

发表回复