开篇引导段:今天在 GitHub Trending 上看到一个有意思的项目:Trivy,这是 Aqua Security 开源的一款全能型安全扫描工具,能够在容器镜像、文件系统、Kubernetes 集群等多种目标中全面发现漏洞、错误配置和敏感信息。
一、项目概述
Trivy(发音类似 “trigger” + “envy”)是由 Aqua Security 开发并维护的一款综合性安全扫描器。它旨在帮助开发者和 DevOps 团队在软件开发生命周期的早期发现并修复安全问题。
核心能力:
- 多目标扫描:支持容器镜像、文件系统、远程 Git 仓库、虚拟机镜像、Kubernetes 集群
- 多维度检测:
- 操作系统包和软件依赖项(SBOM,软件物料清单)
- 已知漏洞(CVEs)
- IaC(基础设施即代码)问题和错误配置
- 敏感信息和密钥泄露
- 软件许可证合规性
项目数据:
- GitHub:https://github.com/aquasecurity/trivy
- stars 数量:持续增长中(Aquasecurity 官方维护)
- 编程语言:Go 1.26.3
- 开源协议:Apache License 2.0
- 下载量:Docker Hub 拉取次数可观,GitHub Release 下载活跃
二、技术原理
2.1 架构设计
Trivy 采用模块化架构,将 Targets(扫描目标) 和 Scanners(扫描器) 解耦,实现灵活的扫描能力组合。
┌─────────────────────────────────────────┐
│ Trivy CLI / API │
├─────────────────────────────────────────┤
│ Core Engine (Go) │
├──────────────┬──────────┬─────────────┤
│ Targets │ Scanners │ Database │
│ │ │ Cache │
├──────────────┼──────────┼─────────────┤
│ Container │ Vulner │ NVD/OSV │
│ Image │ ability │ Advisory │
│ Filesystem │ SBOM │ │
│ Git Repo │ Misconf │ Policy │
│ VM Image │ Secret │ Bundle │
│ Kubernetes │ License │ │
└──────────────┴──────────┴─────────────┘
2.2 核心技术栈与选型理由
从 go.mod 文件分析,Trivy 的技术选型体现了对企业级安全工具的严苛要求:
1. 容器与 OCI 标准支持
github.com/opencontainers/go-digest v1.0.0
github.com/opencontainers/image-spec v1.1.1
github.com/google/go-containerregistry v0.21.6
- 全面支持 OCI(Open Container Initiative)标准
- 能够解析 Docker、OCI、Helm 等多种镜像格式
2. 漏洞数据库集成
github.com/aquasecurity/trivy-db v0.0.0-20251222105351-a833f47f8f0d
github.com/aquasecurity/trivy-java-db v0.0.0-20240109071736-184bd7481d48
trivy-db:维护漏洞数据库(NVD、Red Hat、Debian 等)trivy-java-db:专门针对 Java 生态的漏洞数据库
3. 策略即代码(Policy as Code)
github.com/open-policy-agent/opa v1.16.2
github.com/aquasecurity/trivy-checks v1.12.2-0.20251219190323-79d27547baf5
- 使用 OPA(Open Policy Agent)的 Rego 语言编写检查规则
trivy-checks提供内置的 IaC 合规检查库
4. Kubernetes 深度集成
k8s.io/api v0.36.1
k8s.io/client-go v0.36.0
github.com/aquasecurity/trivy-kubernetes v0.9.1
- 直接使用 Kubernetes Go 客户端
- 支持集群扫描、RBAC 分析、Pod 安全策略检查
2.3 关键算法与数据流
漏洞匹配算法:
Trivy 使用 SBOM + 漏洞索引 的匹配方式:
- SBOM 生成:解析目标中的软件包列表(如
dpkg -l、rpm -qa、pip list等) - 标准化格式:转换为 CycloneDX 或 SPDX 格式
- 漏洞匹配:将软件包名称 + 版本与漏洞数据库中的 CPE(Common Platform Enumeration)匹配
- 影响分析:考虑漏洞的严重程度(CVSS Score)、可利用性、修复版本
数据流示例(容器镜像扫描):
# 1. 拉取镜像并解压层
trivy image python:3.4-alpine
# 内部流程:
# a. 通过 containerd/docker 客户端拉取镜像
# b. 解压各层,提取文件系统
# c. 扫描文件系统中的应用包管理器文件(如 requirements.txt、package.json)
源码片段分析(pkg/sbom/sbom.go 逻辑推断):
// 伪代码:SBOM 扫描核心逻辑
func (s *Scanner) Scan(target string) ([]Package, error) {
var packages []Package
// 1. 检测包管理器
if hasAPK(target) {
packages = append(packages, scanAPK(target)...)
}
if hasDPKG(target) {
packages = append(packages, scanDPKG(target)...)
}
if hasRPM(target) {
packages = append(packages, scanRPM(target)...)
}
// 2. 检测语言依赖
packages = append(packages, scanPip(target)...)
packages = append(packages, scanNPM(target)...)
packages = append(packages, scanGo(target)...)
// 3. 匹配漏洞
for _, pkg := range packages {
vulns := s.db.GetVulnerabilities(pkg.Name, pkg.Version)
pkg.Vulnerabilities = vulns
}
return packages, nil
}
2.4 创新特性
1. 虚拟机镜像支持(v0.20+)
Trivy 扩展了对 VM 镜像(如 AWS AMI、VMDK、QCOW2)的扫描能力:
github.com/masahiro331/go-disk v0.0.0-20260423015231-f7a470ebd472
github.com/masahiro331/go-ebs-file v0.0.0-20260422020928-9d24e29aac27
github.com/masahiro331/go-ext4-filesystem v0.0.0-20260423010602-fe51f5b5e52b
- 能够挂载虚拟磁盘,提取文件系统
- 支持 ext4、XFS、NTFS 等文件系统
2. 秘密检测(Secret Detection)
使用正则表达式和熵值分析检测敏感信息:
trivy fs --scanners secret myproject/
内置规则包括:
- AWS Access Key、Secret Access Key
- GitHub Token、GitLab Token
- 私钥文件(RSA、EC、Ed25519)
- 高熵字符串(可能是随机生成的密钥)
3. SBOM 导出
支持多种 SBOM 格式导出,符合 Supply Chain Security 要求:
# CycloneDX JSON 格式
trivy sbom --format cyclonedx-json alpine:3.17
# SPDX JSON 格式
trivy sbom --format spdx-json alpine:3.17
三、安装与快速开始
3.1 环境要求
- 操作系统:Linux、macOS、Windows(通过 WSL2)
- 依赖:无(静态编译的二进制文件)
- 可选:Docker(用于扫描容器镜像)
3.2 安装步骤
方式一:包管理器(推荐)
# macOS
brew install trivy
# Linux (Ubuntu/Debian)
sudo apt-get install trivy
# Linux (RHEL/CentOS)
sudo yum install trivy
方式二:官方二进制文件
# 从 GitHub Release 下载
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
方式三:Docker(无需安装)
docker run --rm aquasec/trivy image python:3.4-alpine
3.3 最简运行示例
扫描容器镜像:
# 扫描 Alpine Linux 镜像(会自动下载漏洞数据库)
trivy image alpine:3.17
# 输出示例:
# alpine:3.17 (alpine 3.17.6)
# ===========================
# Total: 5 (UNKNOWN: 0, LOW: 2, MEDIUM: 2, HIGH: 1, CRITICAL: 0)
扫描本地文件系统:
# 扫描当前目录(检测漏洞、秘密、错误配置)
trivy fs --scanners vuln,secret,misconfig .
扫描 Kubernetes 集群:
# 需要 kubeconfig 配置
trivy k8s --report summary cluster
四、使用方法与实战
4.1 基础用法
1. 扫描特定漏洞级别
# 仅显示 HIGH 和 CRITICAL 漏洞
trivy image --severity HIGH,CRITICAL python:3.9-slim
2. 忽略未修复的漏洞
# 不显示官方尚未发布修复方案的漏洞
trivy image --ignore-unfixed node:18-alpine
3. 输出为 JSON(CI/CD 集成)
# 输出 JSON 格式,便于自动化处理
trivy image --format json --output results.json nginx:latest
4.2 进阶用法
1. 自定义漏洞数据库镜像
在内网环境中,可以搭建 Trivy 数据库镜像:
# 设置环境变量
export TRIVY_DB_REPOSITORY=registry.example.com/trivy-db
# 扫描时会从私有镜像仓库拉取漏洞数据库
trivy image alpine:3.17
2. 使用自定义策略(Rego)
# 使用自定义 Rego 策略检查 Kubernetes 配置
trivy k8s --policy /path/to/custom/policies cluster
3. 生成 SBOM 并上传到仓库
# 生成 SBOM(CycloneDX 格式)
trivy sbom --format cyclonedx-json alpine:3.17 > sbom.json
# 将 SBOM 附加到容器镜像(OCI 规范)
skopeo copy docker://alpine:3.17 docker://registry.example.com/alpine:3.17 --additional-tag sbom=sbom.json
4.3 实际项目示例
场景一:CI/CD 流水线集成(GitHub Actions)
# .github/workflows/trivy-scan.yml
name: Trivy Security Scan
on:
push:
branches: [main]
pull_request:
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:latest'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
- name: Upload Trivy scan results to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
场景二:预提交钩子(Pre-commit Hook)
# .pre-commit-config.yaml
repos:
- repo: https://github.com/aquasecurity/trivy
rev: v0.50.0
hooks:
- id: trivy
name: Scan for vulnerabilities
entry: trivy fs --scanners vuln,secret,misconfig
language: system
pass_filenames: false
场景三:Kubernetes Admission Controller
使用 trivy-operator 在 Pod 创建时自动扫描镜像:
# 安装 trivy-operator
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm install trivy-operator aqua/trivy-operator \
--namespace trivy-system --create-namespace
# 创建 Pod 时自动扫描
kubectl run nginx --image=nginx:1.21 --dry-run=server
五、常见问题与解决方案
5.1 安装失败
问题:brew install trivy 下载速度慢或失败。
解决方案:
# 使用国内镜像(中科大)
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles
# 或直接使用二进制安装
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
5.2 运行时错误
问题:trivy image 扫描时提示 database error。
原因:漏洞数据库(trivy-db)下载失败或被防火墙拦截。
解决方案:
# 1. 手动下载数据库
trivy image --reset
# 2. 使用代理
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
trivy image alpine:3.17
# 3. 使用离线数据库
trivy image --offline-scan alpine:3.17
5.3 性能问题
问题:扫描大型镜像(如 ubuntu:latest)耗时过长。
解决方案:
启用缓存:
# Trivy 会自动缓存镜像层,第二次扫描会更快 trivy image --cache-dir /path/to/cache ubuntu:latest仅扫描特定目录:
trivy fs --security-checks vuln /app/dist并行扫描:
# 使用 GNU Parallel 并行扫描多个镜像 cat images.txt | parallel -j 4 trivy image {}
5.4 兼容性问题
问题:在 ARM64 架构(如 Apple Silicon M1/M2)上运行 Docker 版本时提示 exec format error。
解决方案:
# 使用原生二进制文件,而非 Docker 镜像
brew install trivy
# 或拉取多架构 Docker 镜像
docker pull --platform linux/arm64 aquasec/trivy
六、总结
Trivy 作为一款开源的全方位安全扫描工具,凭借其 多目标支持、多维度检测、易用性 在 DevSecOps 领域获得了广泛认可。
核心优势:
- 简单易用:单文件二进制,无依赖,一条命令即可扫描
- 全面覆盖:从容器镜像到 Kubernetes 集群,从漏洞到合规,一站式解决
- CI/CD 友好:原生支持 GitHub Actions、GitLab CI、Jenkins 等主流平台
- 活跃社区:Aqua Security 官方维护,漏洞数据库更新及时
适用场景:
- ✅ 容器镜像漏洞扫描(替代 Anchore、Clair)
- ✅ IaC 合规性检查(替代 Checkov、tfsec)
- ✅ 秘密检测(替代 TruffleHog、Gitleaks)
- ✅ SBOM 生成(符合 US Executive Order 14028 要求)
未来展望:
随着供应链安全(Supply Chain Security)的重要性日益凸显,Trivy 在 SBOM 标准化、签名验证(Sigstore/Cosign)、许可证合规 等方向持续演进。对于企业用户,Aqua Security 还提供了商业版本(Aqua Platform),在 Trivy 基础上增加了运行时防护、合规报告等企业级功能。
推荐阅读:
- 官方文档:https://trivy.dev/docs/latest/
- GitHub 仓库:https://github.com/aquasecurity/trivy
- Trivy Operator:https://github.com/aquasecurity/trivy-operator
- SBOM 最佳实践:https://www.linuxfoundation.org/blog/2022/08/sboms-are-a-building-block-everywhere
本文基于 Trivy main 分支(2026 年 6 月)的源码和文档撰写,具体功能以最新版本为准。