2. Trivy 基础:简介、安装方式与基本扫描命令
2.1 Trivy 简介
Trivy(Trident Vulnerability Scanner)是由 Aqua Security 开源的全方位容器安全扫描工具。它采用“一次扫描,全面覆盖”的设计理念,能够检测容器镜像、文件系统、Git 仓库、Kubernetes 集群等多种目标中的安全风险。
核心能力:Trivy 内置了 CVE 数据库、IaC 误配置规则、密钥检测引擎和 SBOM 生成器,无需额外配置即可开箱即用。
| 特性 | 说明 |
|---|---|
| 扫描类型 | 容器镜像、文件系统、Git 仓库、Kubernetes、AWS/Azure/GCP |
| 漏洞数据库 | NVD、Red Hat、Debian、Ubuntu、Alpine、Amazon Linux 等 |
| 误配置检测 | Dockerfile、Kubernetes YAML、Terraform、CloudFormation |
| 密钥扫描 | 、密码、令牌、私钥等 700+ 种模式 |
| SBOM 支持 | 生成 CycloneDX / SPDX 格式的软件物料清单 |
| 输出格式 | Table、JSON、SARIF、HTML、CycloneDX、SPDX |
为什么选择 Trivy? 在镜像供应链安全场景中,Trivy 的轻量级(单二进制)、快速更新(每小时同步 CVE)、以及丰富的 CI/CD 集成能力,使其成为扫描队列与仓库配额管理的首选工具。
2.2 安装方式
Trivy 支持多种安装方式,适应不同环境需求。以下列出三种最常用的安装方法:
2.2.1 二进制安装(Linux / macOS)
# Linux (amd64)
wget https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.tar.gz
tar zxvf trivy_0.50.1_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/
# macOS (Homebrew)
brew install aquasecurity/trivy/trivy
# 验证安装
trivy --version
2.2.2 容器方式运行
# 直接使用 Docker 运行
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy:0.50.1 image nginx:1.25
# 持久化缓存目录(推荐)
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $HOME/.trivy/cache:/root/.trivy/cache \
aquasec/trivy:0.50.1 image alpine:3.19
注意:容器方式运行时,必须挂载 Docker socket 才能扫描本地镜像。生产环境中建议使用
--cache-dir 持久化漏洞数据库,避免每次启动都重新下载。
2.2.3 Helm 安装(Kubernetes 环境)
# 添加 Helm 仓库
helm repo add aquasecurity https://aquasecurity.github.io/helm-charts
helm repo update
# 安装 Trivy-Operator(集群扫描)
helm upgrade --install trivy-operator aquasecurity/trivy-operator \
--namespace trivy-system \
--create-namespace \
--set="trivy.ignoreUnfixed=true"
# 验证 Pod 状态
kubectl get pods -n trivy-system
| 安装方式 | 适用场景 | 优势 | 局限 |
|---|---|---|---|
| 二进制 | CI/CD 节点、本地开发 | 单文件、无依赖、启动快 | 需手动更新版本 |
| 容器 | 容器化 CI/CD、临时扫描 | 环境隔离、版本管理方便 | 需挂载 Docker socket |
| Helm | Kubernetes 集群持续扫描 | 自动发现工作负载、策略集成 | 资源占用较高 |
2.3 基本扫描命令与输出格式
2.3.1 常用扫描命令
# 1. 扫描容器镜像(默认输出表格)
trivy image nginx:1.25
# 2. 扫描文件系统
trivy fs ./my-project/
# 3. 扫描 Git 仓库
trivy repo https://github.com/org/repo.git
# 4. 扫描 Kubernetes 资源
trivy k8s --namespace=production deployment/my-app
# 5. 仅扫描严重和高危漏洞
trivy image --severity CRITICAL,HIGH alpine:3.19
# 6. 忽略已修复的漏洞
trivy image --ignore-unfixed nginx:1.25
2.3.2 输出格式详解
Trivy 支持多种输出格式,满足不同消费端需求:
# Table 格式(默认,适合终端查看)
trivy image alpine:3.19
# JSON 格式(适合程序解析)
trivy image --format json alpine:3.19
# SARIF 格式(适合 GitHub / Azure DevOps 集成)
trivy image --format sarif alpine:3.19
# HTML 报告(适合审计归档)
trivy image --format html --output report.html alpine:3.19
# CycloneDX SBOM(生成软件物料清单)
trivy image --format cyclonedx alpine:3.19
# SPDX SBOM
trivy image --format spdx alpine:3.19
2.4 扫描队列与仓库配额场景中的 Trivy 定位
在本课程后续章节中,Trivy 将作为扫描队列的核心执行引擎。理解其基础能力有助于后续配置:
- 扫描队列调度:Trivy 的轻量级特性使其适合在队列中并行执行,每个扫描任务对应一个 Trivy 进程。
- 仓库配额管理:通过 Trivy 的
--severity和--ignore-unfixed参数,可以过滤出真正需要关注的漏洞,避免配额浪费。 - 结果持久化:JSON 输出格式便于将扫描结果存入数据库,用于后续的容量水位分析和趋势预测。
实践建议:在部署扫描队列前,先在本地用
trivy image --format json 测试目标镜像,确认扫描时间和结果结构,以便合理设置队列超时和配额阈值。