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。遇到問題時,你可以在這兩個地方找到詳細的文件和社群支援。


相關閱讀: