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 提供豐富的整合選項:
- GitHub Actions:trivy-action
- Kubernetes Operator:trivy-operator
- VS Code 外掛程式:trivy-vscode-extension
- CI/CD 平台:Jenkins、GitLab CI、CircleCI 等
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 是一個功能強大且易於使用的開源安全掃描工具,它的核心價值在於:
- 全面性:支援多種掃描目標和偵測類型,涵蓋從程式碼到生產的全鏈路安全需求
- 易用性:簡單的 CLI 介面,豐富的文件和社群支援
- 整合友好:原生支援主流 CI/CD 平台和 Kubernetes
- 效能優秀:Go 語言實現,啟動快、資源佔用低
對於任何重視安全的開發團隊來說,將 Trivy 納入日常開發流程都是一個明智的選擇。它可以幫助你在早期發現並修復安全問題,降低生產環境中的安全風險。
下一步行動建議:
- 在你的本機開發環境中安裝 Trivy,嘗試掃描幾個常用的容器映像
- 將 Trivy 整合到你的 CI/CD 流水線中,設定適當的安全閾值
- 定期審查掃描結果,建立漏洞修復的工作流程
- 探索 Trivy Operator,為你的 Kubernetes 叢集新增持續安全監控
Trivy 的官方文件位於 https://trivy.dev,GitHub 儲存庫位址是 https://github.com/aquasecurity/trivy。遇到問題時,你可以在這兩個地方找到詳細的文件和社群支援。
相關閱讀: