Trivy 是由 Aqua Security 开发的一款开源通用安全扫描器 (Universal Security Scanner)。它专为云原生环境设计,能够高效、全面地扫描各种目标,以查找漏洞、错误配置、敏感信息、许可证违规等安全问题。Trivy 以其易用性、快速扫描能力和广泛的扫描范围,成为DevSecOps实践中不可或缺的工具。

Trivy 的目标是提供一个简单易用但功能强大的安全扫描解决方案,帮助开发者和运维人员在软件开发生命周期 (SDLC) 的早期阶段(“左移”)识别并修复安全风险,从而降低最终部署环境中的安全漏洞暴露面。


一、为什么需要 Trivy?

在现代云原生和DevOps环境中,软件供应链的复杂性日益增加。传统的手动安全审计和后期渗透测试已经无法满足快速迭代和持续部署的需求。面临的挑战包括:

  1. 快速迭代下的安全盲点:容器镜像、Kubernetes 配置、IaC 模板等组件更新频繁,手动审查容易遗漏。
  2. 供应链安全风险:所使用的基础镜像、第三方库可能包含已知漏洞,需要持续监控。
  3. 配置错误:Kubernetes 集群、云基础设施和应用程序配置不当常常是导致数据泄露或服务中断的常见原因。
  4. 敏感信息泄露:代码库、镜像或配置文件中意外包含了API密钥、密码等敏感信息。
  5. 缺乏自动化检查:安全检查未能有效地集成到CI/CD流程中,导致安全问题“流向”生产环境。

Trivy 旨在解决这些问题,提供一个集成的、自动化的安全扫描解决方案:

  • 全面的扫描范围:覆盖从代码到容器、到运行时环境的多个层面。
  • 左移安全 (Shift-Left Security):在开发和构建阶段捕获安全问题,降低修复成本。
  • 自动化与CI/CD集成:无缝融入现有CI/CD管道,实现自动化安全门禁。
  • 易用性:单一的二进制文件,简单的命令行接口,快速上手。
  • 速度与效率:优化扫描性能,减少对开发流程的阻碍。

二、Trivy 核心功能与概念

Trivy 提供了一系列丰富的扫描功能,支持多种目标和安全检查类型。

2.1 漏洞扫描 (Vulnerability Scanning)

这是 Trivy 最核心的功能,用于在操作系统包、应用程序依赖项(如Go Modules, npm, pip, Maven等)中发现已知的安全漏洞。

  • 漏洞数据库:Trivy 维护一个庞大的漏洞数据库,整合了来自全球各地的公共漏洞信息 (如NVD - 国家漏洞数据库) 和各发行版、语言生态系统的特定漏洞数据。此数据库会定期更新。
  • 扫描对象:容器镜像、本地文件系统、Git 仓库、虚拟机镜像等。

2.2 错误配置扫描 (Misconfiguration Scanning)

Trivy 可以扫描Infrastructure as Code (IaC) 文件(如Terraform, Kubernetes manifest, Dockerfile, CloudFormation, Ansible)和Kubernetes集群,以发现不符合安全最佳实践或存在潜在风险的配置。

  • 扫描对象
    • IaC 文件:Dockerfile, Kubernetes (YAML), Helm Charts, Terraform, CloudFormation, Ansible, ARM 等。
    • 运行时环境:Kubernetes 集群的配置对象。

2.3 敏感信息扫描 (Secret Scanning)

检测代码库、容器镜像、文件系统中的硬编码敏感信息,如API密钥、密码、私钥等。

2.4 软件物料清单 (SBOM - Software Bill of Materials) 生成

生成关于软件组件的清单,提供了构成应用程序的开源和第三方组件的详细信息。这对于供应链安全和合规性审计至关重要。

2.5 许可证扫描 (License Scanning)

识别代码库或镜像中使用的各种开源许可证,帮助用户遵守法律和合规性要求。

2.6 Kubernetes 集群扫描

直接扫描运行中的Kubernetes集群,检查部署的工作负载 (Pod, Deployment) 以及集群配置 (RBAC, Network Policies) 中的漏洞和错误配置。

2.7 云基础设施扫描 (Cloud Infrastructure Scanning)

扫描云账户中的配置,发现不安全或不合规的设置。目前主要支持AWS。

三、安装 Trivy

Trivy 是一个单一的二进制文件,安装非常简单。

Docker Desktop 用户 (Linux):

1
docker pull aquasec/trivy:latest

macOS (使用 Homebrew):

1
brew install trivy

Linux (使用 apt/yum):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Debian/Ubuntu
sudo apt-get install wget apt-transport-https gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

# RHEL/CentOS
sudo rpm --import https://aquasecurity.github.io/trivy-repo/rpm/public.key
sudo tee /etc/yum.repos.d/trivy.repo << EOF
[trivy]
name=Trivy repository
baseurl=https://aquasecurity.github.io/trivy-repo/rpm/\$releasever/base/\$basearch/
gpgcheck=0
enabled=1
EOF
sudo yum install trivy

或者下载二进制文件:

访问 Trivy GitHub Release 页面 下载适合您操作系统的最新二进制文件,然后将其添加到您的 $PATH

四、Trivy 使用示例

4.1 容器镜像漏洞扫描

扫描指定Docker镜像中的操作系统包和应用依赖项漏洞。

1
2
3
4
5
# 扫描一个公共的Nginx镜像
trivy image nginx:latest

# 扫描本地Docker守护进程中的镜像 (如果没指定tag,默认latest)
trivy image <IMAGE_ID_OR_NAME>

过滤结果:

1
2
3
4
5
# 只显示严重性为 CRITICAL 和 HIGH 的漏洞
trivy image --severity CRITICAL,HIGH alpine:3.15

# 将输出保存为JSON格式
trivy image --format json -o vulnerabilities.json alpine:3.15

示例输出片段 (表格格式):

1
2
3
4
5
6
7
8
9
Running on Amazon Linux 2 (kernel 5.10.162-144.675.amzn2.x86_64)
...
┌───────────────────┬───────────────────┬───────────┬───────────────────────────────────┬───────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability ID │ Severity │ Installed Version │ Fixed Version │
├───────────────────┼───────────────────┼───────────┼───────────────────────────────────┼───────────────────────────────────────────────────────────────┤
│ glibc │ CVE-2023-33434 │ HIGH │ 2.26-64.amzn2.0.4 │ 2.26-64.amzn2.0.5 │
│ openssl │ CVE-2023-0464 │ HIGH │ 1:1.0.2k-25.amzn2.0.7 │ 1:1.0.2k-25.amzn2.0.8 │
│ expat │ CVE-2022-43680 │ MEDIUM │ 2.1.0-12.amzn2.0.3 │ 2.1.0-12.amzn2.0.4 │
└───────────────────┴───────────────────┴───────────┴───────────────────────────────────┴───────────────────────────────────────────────────────────────┘

4.2 文件系统漏洞扫描

扫描本地目录或文件中的操作系统包和应用依赖项漏洞。

1
2
3
4
5
# 扫描当前目录下的文件和依赖
trivy fs .

# 扫描指定的应用程序目录
trivy fs /path/to/my/app

4.3 Git 仓库扫描 (IaC 错误配置与敏感信息)

Trivy 可以直接扫描Git仓库,查找IaC错误配置和敏感信息。
需要注意的是,对于 IaC 扫描,Trivy 依靠其 Aqua Security 的内置策略引擎。

1
2
3
4
5
6
# 扫描本地Git仓库中的错误配置和敏感信息
trivy repo .

# 扫描远程Git仓库中的错误配置和敏感信息 (Trivy 会先克隆)
# 注意:这需要网络连接和可能的认证
trivy repo https://github.com/aquasecurity/tfsec-example.git

4.4 Kubernetes 集群扫描

直接扫描运行中的 Kubernetes 集群,发现工作负载和配置中的漏洞及错误配置。

1
2
3
4
5
6
7
8
# 扫描整个Kubernetes集群
trivy k8s cluster

# 扫描指定Namespace下的所有工作负载
trivy k8s namespace my-app-namespace

# 扫描单个Deployment
trivy k8s deployment my-deployment -n my-app-namespace

4.5 云账户扫描 (AWS 示例)

扫描云账户中的配置错误。需要配置AWS凭证 (通过环境变量、AWS CLI配置或IAM角色)。

1
2
3
4
5
# 扫描默认AWS账户的配置
trivy aws

# 扫描指定AWS Region的EC2实例配置
trivy aws --region us-east-1 ec2

4.6 SBOM (软件物料清单) 生成

生成指定容器镜像的CycloneDX或SPDX格式的SBOM。

1
2
3
4
5
# 生成CycloneDX JSON格式的SBOM
trivy image --format cyclonedx --output sbom.json alpine:latest

# 生成SPDX JSON格式的SBOM
trivy image --format spdx-json --output sbom.spdx.json python:3.9-slim

4.7 敏感信息扫描

扫描文件中是否存在敏感信息。

1
2
# 扫描当前目录下的所有文件中的敏感信息
trivy fs --scanners secret .

4.8 许可证扫描

扫描文件中存在的开源许可证。

1
2
# 扫描当前目录下的所有文件中的许可证信息
trivy fs --scanners license .

五、与 CI/CD 的集成

将 Trivy 集成到 CI/CD 管道是实现 “Shift-Left Security” 的关键。它可以在构建、测试或部署阶段自动扫描新提交的代码、生成的容器镜像或部署配置文件。

集成流程示例:

GitHub Actions 示例 (扫描Docker镜像):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
name: Trivy Image Scan

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
build-and-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Build Docker image
run: docker build -t my-app:latest .

- name: Run Trivy scan on Docker image
uses: aquasecurity/trivy-action@master
with:
image-ref: 'my-app:latest'
format: 'table'
output: 'trivy-results.txt'
exit-code: '1' # 如果发现任何 HIGH 或 CRITICAL 漏洞,则退出码为1
severity: 'CRITICAL,HIGH'
ignore-unfixed: true # 只显示已修复的漏洞
# # For IaC scans as part of image scan, to check Dockerfile misconfigurations
# scan-type: 'image,config'

- name: Upload Trivy scan results
uses: actions/upload-artifact@v3
if: always()
with:
name: trivy-results
path: trivy-results.txt

六、Trivy 的优缺点

6.1 优点

  1. 易用性:单一的二进制文件,简单的命令行接口,学习曲线平缓。
  2. 速度快:通过优化漏洞数据库和高效的扫描算法,扫描速度通常非常快。
  3. 扫描范围广:支持多种目标(镜像、文件系统、Git、K8s、云)和多种扫描类型(漏洞、错误配置、敏感信息、SBOM、许可证)。
  4. CI/CD 友好:设计时考虑了自动化集成,可以轻松融入DevOps管道。
  5. 高精度:提供可靠的漏洞和配置问题检测,减少误报。
  6. 活跃的社区和持续维护:作为Aqua Security的开源项目,有强大的支持和快速的功能更新。
  7. 免费和开源:降低了安全工具的采购成本。

6.2 缺点

  1. 资源消耗:对于非常大的镜像或文件系统,首次扫描下载漏洞数据库可能需要一定时间,且扫描过程会占用CPU和内存资源。
  2. 误报/漏报:尽管精度高,但任何自动化扫描工具都无法完全避免误报(报告了不存在的漏洞)和漏报(未能发现实际存在的漏洞)。需要人工复查。
  3. 漏洞数据库更新延迟:漏洞数据库的更新总是滞后于实际漏洞的发现,即“0-day”漏洞可能无法立即识别。
  4. 配置复杂性:在特定场景下(如复杂的云环境集成、高级过滤规则),配置和自动化可能需要更深入的理解。

七、安全性考虑与最佳实践

  1. 定期更新 Trivy:确保您的Trivy版本始终是最新,以获取最新的功能、性能改进和漏洞数据库支持。
  2. 定期更新漏洞数据库:Trivy 数据库会定期更新,务必确保在扫描前执行 trivy sbom --update 或让CI/CD流程自动更新数据库。
  3. 在SDLC早期阶段集成:贯彻“左移”安全理念,在代码提交、镜像构建等早期阶段运行Trivy,尽早发现问题。
  4. 设置合理的安全策略:根据组织的风险承受能力,配置Trivy的--severity(严重等级)和--exit-code(退出码),使其在发现特定严重性问题时中断CI/CD流程。
  5. 减少基础镜像攻击面:使用轻量级的、最小化的基础镜像 (如 alpinedistroless) 可以显著减少Trivy需要扫描的组件数量,从而降低发现漏洞的概率。
  6. 审查和忽略误报:对于确认为误报的项,可以通过 .trivyignore 文件、命令行参数或CI/CD配置来忽略特定漏洞或配置警告。但应谨慎操作,并记录原因。
  7. 不要过度依赖自动化:Trivy 是一种强大的辅助工具,但不能完全替代人工安全审查和更深层次的渗透测试。它提供了快速的初步反馈。
  8. 保护敏感信息:Trivy 可以扫描敏感信息,但在运行扫描时,确保其运行环境本身是安全的,扫描报告的输出也应妥善处理,避免进一步泄露敏感信息。
  9. 输出报告管理:将扫描结果输出为JSON、SARIF等格式,便于机器解析、存储和集成到安全信息和事件管理 (SIEM) 系统或漏洞管理平台中。

八、总结

Trivy 作为一款通用的安全扫描器,以其全面的功能、卓越的性能和极佳的易用性,已成为云原生时代DevSecOps工具链中的重要组成部分。它有效地帮助团队在整个软件开发生命周期中,从代码到容器,再到云基础设施,持续地识别和管理安全风险。通过将Trivy深度集成到CI/CD流程中,组织可以显著提升其安全态势,实现更快速、更安全地交付软件的目标。