Trivy(发音为 /ˈtraɪvi/)是由 Aqua Security 开发的开源综合安全扫描器,在 GitHub 上拥有超过 35,000 个 star,是目前最受欢迎的开源安全扫描工具之一。

Trivy 的核心优势在于其全面性——它能够扫描多种目标(容器镜像、文件系统、Git 仓库、虚拟机镜像、Kubernetes 集群),并检测多种安全问题(已知 CVE 漏洞、IaC 配置错误、敏感信息泄露、软件许可证、SBOM 生成)。对于现代 DevSecOps 团队来说,Trivy 几乎可以覆盖从代码提交到生产部署的整个安全扫描链路。

本文将从安装开始,逐步介绍 Trivy 的核心功能、实战用法以及如何在 CI/CD 流水线中集成 Trivy,帮助开发者和安全工程师快速上手这个强大的安全工具。

为什么选择 Trivy?

在 Trivy 出现之前,安全扫描领域通常是碎片化的:你需要用不同的工具来扫描容器镜像、检查 IaC 配置、查找代码中的密钥泄露。Trivy 将这些能力整合到一个统一的 CLI 工具中,具有以下突出特点:

1. 多目标扫描支持

Trivy 可以扫描以下目标:

  • 容器镜像:Docker、OCI 兼容镜像(本地或远程仓库)
  • 文件系统:本地目录、项目源码
  • Git 仓库:远程 Git 仓库(无需克隆)
  • 虚拟机镜像:AWS EC2 AMI、Azure VM 等
  • Kubernetes 集群:运行中的集群资源配置

2. 多维度安全检测

Trivy 能够发现以下类型的安全问题:

  • 已知漏洞(CVE):基于 OS 包和软件依赖的漏洞数据库
  • IaC 配置错误:Terraform、CloudFormation、Kubernetes YAML 等的最佳实践违规
  • 敏感信息泄露:硬编码的 API 密钥、密码、令牌
  • 软件许可证合规:识别项目中使用的开源许可证类型
  • SBOM 生成:生成软件物料清单(Software Bill of Materials)

3. 易于集成

Trivy 提供丰富的集成选项:

4. 速度快、资源占用低

Trivy 使用 Go 语言编写,启动速度快,内存占用低,适合在 CI/CD 流水线中频繁运行。

安装 Trivy

Trivy 支持多种安装方式,以下是几种最常用的方法:

方法一:使用 Homebrew(macOS/Linux)

brew install trivy

方法二:使用 Docker

docker run aquasec/trivy --version

方法三:下载二进制文件

GitHub Releases 下载对应平台的二进制文件:

# Linux x86_64
wget https://github.com/aquasecurity/trivy/releases/download/v0.50.0/trivy_0.50.0_Linux-64bit.tar.gz
tar -xzf trivy_0.50.0_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/

方法四:使用 apt/yum(Linux 发行版)

# Ubuntu/Debian
sudo apt-get install wget 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 generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

# CentOS/RHEL
sudo yum install trivy

验证安装

trivy --version
# 输出示例:Version: 0.50.0

快速上手:扫描第一个容器镜像

让我们从一个简单的例子开始——扫描一个公开的 Docker 镜像,看看 Trivy 能发现什么。

扫描 Python 官方镜像

trivy image python:3.9-slim

Trivy 会输出类似以下的结果:

python:3.9-slim (debian 11.7)
=====================================
Total: 123 (UNKNOWN: 0, LOW: 45, MEDIUM: 52, HIGH: 24, CRITICAL: 2)

+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
|     LIBRARY      |   VULNERABILITY ID  | SEVERITY | INSTALLED VERSION | FIXED VERSION |               TITLE                   |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
| libssl1.1        | CVE-2023-5678       | CRITICAL | 1.1.1w-0+deb11u1  | 1.1.1w-0+deb11u2 | OpenSSL: X.509 Email Address ...     |
| openssl          | CVE-2023-6129       | HIGH     | 1.1.1w-0+deb11u1  | 1.1.1w-0+deb11u2 | OpenSSL: POLY1305 MAC implementation... |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+

输出包含以下关键信息:

  • 漏洞总数:按严重程度分类(UNKNOWN、LOW、MEDIUM、HIGH、CRITICAL)
  • 漏洞详情表:每个漏洞的库名、CVE ID、严重程度、当前版本、修复版本、漏洞描述

只输出高危和严重漏洞

在实际工作中,我们通常更关注高危和严重漏洞。可以使用 --severity 参数过滤:

trivy image --severity HIGH,CRITICAL python:3.9-slim

以 JSON 格式输出(便于自动化处理)

trivy image --format json python:3.9-slim > results.json

核心功能详解

1. 扫描文件系统

除了容器镜像,Trivy 还可以扫描本地文件系统,查找项目依赖中的漏洞。这对于在开发阶段早期发现安全问题非常有用。

# 扫描当前目录
trivy fs .

# 扫描指定目录
trivy fs /path/to/project

# 只扫描特定语言的依赖
trivy fs --scanners vuln --language python /path/to/project

Trivy 支持的语言包括:Python、Node.js、Java、Go、Ruby、PHP、.NET、Rust 等主流编程语言。

2. 扫描 Git 仓库

Trivy 可以直接扫描远程 Git 仓库,无需先克隆到本地:

# 扫描公共 GitHub 仓库
trivy repo https://github.com/aquasecurity/trivy

# 扫描指定分支
trivy repo https://github.com/aquasecurity/trivy@main

这对于审计第三方开源项目的安全性非常方便。

3. 扫描 Kubernetes 配置

Kubernetes 配置错误是导致安全事件的主要原因之一。Trivy 可以检查 Kubernetes YAML 文件是否符合安全最佳实践:

# 扫描单个 YAML 文件
trivy config deployment.yaml

# 扫描目录下的所有配置文件
trivy config ./k8s-manifests/

Trivy 会检测以下问题:

  • 容器以 root 用户运行
  • 未设置资源限制(CPU/内存)
  • 使用了 latest 标签
  • 特权模式启用
  • 敏感信息通过环境变量硬编码

示例输出:

k8s-manifests/deployment.yaml
=============================
Tests: 15 (SUCCESSES: 12, FAILURES: 3, EXCEPTIONS: 0)
Failures: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 1, HIGH: 1, CRITICAL: 0)

+-----------+------------+-----------------+----------+---------------------------------------+
| TYPE      | MISCONF ID |    CHECK        | SEVERITY |              MESSAGE                  |
+-----------+------------+-----------------+----------+---------------------------------------+
| Kubernetes| KSV012     | Image Tag       | MEDIUM   | Container 'app' uses 'latest' tag     |
| Kubernetes| KSV001     | Privileged      | HIGH     | Container 'app' runs in privileged mode|
+-----------+------------+-----------------+----------+---------------------------------------+

4. 生成 SBOM(软件物料清单)

SBOM 是软件供应链安全的重要组成部分。Trivy 可以生成标准格式的 SBOM:

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

# 生成 CycloneDX 格式的 SBOM
trivy image --format cyclonedx python:3.9-slim > sbom.cyclonedx.xml

生成的 SBOM 可以用于合规审计、漏洞影响分析等场景。

5. 检测敏感信息泄露

Trivy 可以扫描代码中是否包含硬编码的敏感信息(API 密钥、密码、令牌等):

trivy fs --scanners secret ./my-project

Trivy 内置了多种敏感信息检测规则,包括:

  • AWS Access Key
  • GitHub Token
  • Slack Webhook URL
  • Private Key
  • Database Connection String

CI/CD 集成实战

将 Trivy 集成到 CI/CD 流水线是实现"安全左移"的关键步骤。以下是几种常见平台的集成示例。

GitHub Actions

在项目根目录创建 .github/workflows/trivy.yml

name: Trivy Security Scan

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  trivy-scan:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: 'python:3.9-slim'
          format: 'table'
          severity: 'CRITICAL,HIGH'
          exit-code: '1'  # 发现高危漏洞时失败

这个工作流会在每次推送或 PR 时自动扫描指定的容器镜像,如果发现高危或严重漏洞,CI 会失败。

GitLab CI

.gitlab-ci.yml 中添加:

trivy-scan:
  image:
    name: aquasec/trivy:latest
    entrypoint: [""]
  script:
    - trivy fs --exit-code 1 --severity HIGH,CRITICAL .
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Jenkins Pipeline

pipeline {
    agent any

    stages {
        stage('Security Scan') {
            steps {
                sh '''
                    docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
                        aquasec/trivy image --exit-code 1 --severity HIGH,CRITICAL \
                        my-app:latest
                '''
            }
        }
    }
}

进阶用法

1. 忽略特定漏洞

有时某些漏洞在你的场景中不可利用,你可以创建 .trivyignore 文件来忽略它们:

# .trivyignore
CVE-2023-1234
CVE-2023-5678

或者使用 --ignorefile 参数指定自定义忽略文件:

trivy image --ignorefile .trivyignore python:3.9-slim

2. 缓存漏洞数据库

Trivy 默认每次扫描都会更新漏洞数据库,这在 CI/CD 环境中会导致额外的网络开销。你可以使用缓存来加速:

# 首次扫描时下载数据库
trivy image --download-db-only

# 后续扫描使用本地缓存
trivy image --skip-db-update python:3.9-slim

在 GitHub Actions 中,你可以使用 actions/cache 来持久化数据库:

- name: Cache Trivy DB
  uses: actions/cache@v3
  with:
    path: ~/.cache/trivy
    key: trivy-db-${{ hashFiles('~/.cache/trivy/db/trivy.db') }}
    restore-keys: trivy-db-

3. 自定义报告模板

Trivy 支持使用 Go template 自定义输出格式:

trivy image --format template --template "@contrib/html.tpl" python:3.9-slim > report.html

Trivy 内置了几种模板:

  • @contrib/html.tpl:HTML 报告
  • @contrib/junit.tpl:JUnit XML 格式(适合 CI/CD)
  • @contrib/sarif.tpl:SARIF 格式(适合 GitHub Code Scanning)

4. 与 Trivy Operator 集成(Kubernetes)

对于运行中的 Kubernetes 集群,你可以部署 Trivy Operator 来持续监控集群中的安全风险:

helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm install trivy-operator aqua/trivy-operator --namespace trivy-system --create-namespace

Trivy Operator 会自动扫描集群中的工作负载,并将结果存储为 Kubernetes CRD,你可以在 Dashboard 中查看或通过 API 查询。

常见问题排查

问题 1:扫描速度慢

原因: 首次扫描需要下载漏洞数据库(约 100-200MB)。

解决方案: 使用 --skip-db-update 跳过数据库更新,或预先下载数据库:

trivy image --download-db-only
trivy image --skip-db-update python:3.9-slim

问题 2:误报过多

原因: Trivy 的漏洞数据库可能包含一些在你的场景中不可利用的漏洞。

解决方案: 使用 .trivyignore 文件忽略已知误报,或调整 --severity 参数只关注高危漏洞。

问题 3:私有镜像扫描失败

原因: Trivy 无法访问需要认证的私有镜像仓库。

解决方案: 设置环境变量或使用 --registry-token 参数:

export TRIVY_USERNAME=myuser
export TRIVY_PASSWORD=mypassword
trivy image registry.example.com/my-private-image:latest

问题 4:内存不足

原因: 扫描大型镜像或文件系统时可能消耗较多内存。

解决方案: 增加容器的内存限制,或使用 --light 模式减少内存占用:

trivy image --light python:3.9-slim

总结

Trivy 是一个功能强大且易于使用的开源安全扫描工具,它的核心价值在于:

  1. 全面性:支持多种扫描目标和检测类型,覆盖从代码到生产的全链路安全需求
  2. 易用性:简单的 CLI 接口,丰富的文档和社区支持
  3. 集成友好:原生支持主流 CI/CD 平台和 Kubernetes
  4. 性能优秀:Go 语言实现,启动快、资源占用低

对于任何重视安全的开发团队来说,将 Trivy 纳入日常开发流程都是一个明智的选择。它可以帮助你在早期发现并修复安全问题,降低生产环境中的安全风险。

下一步行动建议:

  1. 在你的本地开发环境中安装 Trivy,尝试扫描几个常用的容器镜像
  2. 将 Trivy 集成到你的 CI/CD 流水线中,设置适当的安全阈值
  3. 定期审查扫描结果,建立漏洞修复的工作流程
  4. 探索 Trivy Operator,为你的 Kubernetes 集群添加持续安全监控

Trivy 的官方文档位于 https://trivy.dev,GitHub 仓库地址是 https://github.com/aquasecurity/trivy。遇到问题时,你可以在这两个地方找到详细的文档和社区支持。


相关阅读: