Trivy 的特征
Trivy 是一種適用于 CI 的簡單而全面的容器漏洞掃描程序。軟件漏洞是指軟件或操作系統中存在的故障、缺陷或弱點。Trivy 檢測操作系統包(Alpine、RHEL、CentOS等)和應用程序依賴(Bundler、Composer、npm、yarn等)的漏洞。
Trivy 很容易使用,只要安裝二進制文件,就可以掃描了。掃描只需指定容器的鏡像名稱。與其他鏡像掃描工具相比,例如 Clair,Anchore Engine,Quay 相比,Trivy 在準確性、方便性和對 CI 的支持等方面都有著明顯的優勢。
推薦在 CI 中使用它,在推送到 Container Registry 之前,您可以輕松地掃描本地容器鏡像,Trivy具備如下的特征:
1. 檢測面很全,能檢測全面的漏洞,操作系統軟件包(Alpine、Red Hat Universal Base Image、Red Hat Enterprise Linux、CentOS、Oracle Linux、Debian、Ubuntu、Amazon Linux、openSUSE Leap、SUSE Enterprise Linux、Photon OS 和 Distrioless)、應用程序依賴項(Bundler、Composer、Pipenv、Poetry、npm、yarn 和 Cargo);
2. 使用簡單,僅僅只需要指定鏡像名稱;
3. 掃描快且無狀態,第一次掃描將在 10 秒內完成(取決于您的網絡)。隨后的掃描將在一秒鐘內完成。與其他掃描器在第一次運行時需要很長時間(大約10分鐘)來獲取漏洞信息,并鼓勵您維護持久的漏洞數據庫不同,Trivy 是無狀態的,不需要維護或準備;
4. 易于安裝,安裝方式:
- $ apt-get install trivy
- $ yum install trivy
- $ brew install trivy
無需安裝數據庫、庫等先決條件(例外情況是需要安裝 rpm 以掃描基于 RHEL/CentOS 的圖像)。
Trivy 的安裝
這里安裝 Trivy 的環境是 Centos7,安裝的版本是 0.16.0,安裝的命令如下:
- $ wget https://github.com/aquasecurity/trivy/releases/download/v0.16.0/trivy_0.16.0_Linux-64bit.rpm
- $ rpm -ivh trivy_0.16.0_Linux-64bit.rpm
- 準備中... ################################# [100%]
- 正在升級/安裝...
- 1:trivy-0:0.16.0-1 ################################# [100%]
- $ trivy -v
- Version: 0.16.0
Trivy 的簡單使用
下面介紹一些 Trivy 的簡單使用的命令和一些測試的結果。主要從幾個方面來測試 Trivy 的性能指標:
- 鏡像大小對 Trivy 掃描速度的影響;
- 掃描的鏡像大小和網絡流量使用情況的關系;
- 掃描的結果是否容易解析;
鏡像大小對 Trivy 掃描速度的影響
- 當鏡像位于本地,大小 90MB 左右時候的掃描:
執行命令:
- $ trivy registry.cn-hangzhou.aliyuncs.com/choerodon-tools/javabase:0.5.0
掃描結果:
時間:第一次掃描會 DownLoad DB,大概花十分鐘以內(14M,看網速),國外的主機 10s 以內,第二次掃描十秒鐘以內完成。
- 當鏡像位于本地,大小 408MB 左右時候的掃描:
執行命令:
- $ trivy registry.cn-hangzhou.aliyuncs.com/choerodon-tools/mysql:5.7.17
執行結果:
時間:10秒左右。
- 當掃描的鏡像位于線上,大小為 316M 左右時候的掃描:
執行結果:
時間:20s左右
結論:本地掃描鏡像的大小對掃描速度影響不大,線上掃描與本地掃描的方式對掃描的速度影響不大。
掃描的鏡像大小和網絡流量使用情況的關系
- 線上掃描之前網絡流量使用情況:
掃描鏡像大小:316M 左右
- 掃描之后服務器的磁盤,網絡流量使用情況:
結論:接收到的網絡流量等于線上鏡像的大小,鏡像被下載放在服務器磁盤的某處(目前本服務器未裝 Docker)。
注:再次全量掃描相同的鏡像,接收流量和磁盤使用占比均不再增加。
掃描的結果是否容易解析
- 使用 JSON 輸出掃描的結果:
掃描鏡像,openjdk:15-ea-jdk-buster
大小:316M 左右
時間:10s 左右
返回結果:標準的 josn 格式的文件
其他更多可使用命令
1. 掃描鏡像文件
- $ docker save ruby:2.3.0-alpine3.9 -o ruby-2.3.0.tar
- $ trivy --input ruby-2.3.0.tar
2. 按嚴重性篩選漏洞:
- $ trivy -–severity HIGH,CRITICAL ruby:2.3.0
3. 按類型篩選漏洞:
- $ trivy -–vuln-type os ruby:2.3.0
4. 跳過漏洞數據庫的更新
Trivy 在開始運行時總是更新其漏洞數據庫。這通常很快,因為這是一個差異更新。但是,如果您甚至想跳過這一步,請使用 -–skip update 選項。
- $ trivy -–skip-update python:3.4-alpine3.9
5. 僅下載漏洞數據庫
您還可以要求 Trivy 簡單地檢索漏洞數據庫。這對于初始化連續集成系統中的工作人員非常有用。在第一次運行中,-–only update 選項將被忽略。
- $ trivy -–download-db-only
- $ trivy -–download-db-only -–only-update alpine
6. 忽略未修復的漏洞
默認情況下,Trivy 還會檢測未修補/未修復的漏洞。這意味著即使更新了所有包,也無法修復這些漏洞。如果要忽略它們,請使用 -–ignore unfixed 選項。
- $ trivy –-ignore-unfixed ruby:2.3.0
7. 指定退出代碼
默認情況下,即使檢測到漏洞,Trivy 也會以代碼 0 退出。如果要使用非零退出代碼退出,請使用 -–exit code 選項。此選項對 CI/CD 很有用。在下面的示例中,僅當發現關鍵漏洞時,測試才會失敗。
- $ trivy -–exit-code 1 python:3.4-alpine3.9
- $ trivy -–exit-code 0 –severity MEDIUM,HIGH ruby:2.3.0
- $ trivy -–exit-code 1 –severity CRITICAL ruby:2.3.0
8. 忽略指定的漏洞
- $ cat .trivyignore
- CVE-2018-14618
- CVE-2019-1543
- $ trivy python:3.4-alpine3.9
9. 指定緩存目錄:
- $ trivy -–cache-dir /tmp/trivy/ python:3.4-alpine3.9
10.清除鏡像緩存
-–clear cache 選項刪除鏡像緩存。如果更新具有相同 tag 的鏡像(例如使用最新 tag 時),此選項非常有用。
- $ trivy -–clear-cache
--reset 選項刪除所有緩存和數據庫。在此之后,需要很長時間才能在本地重建漏洞數據庫。
- $ trivy -–reset
11.使用輕量級數據庫:
- $ trivy -–light alpine:3.10
輕量級數據庫不包含諸如描述和引用之類的漏洞詳細信息。因此,數據庫的大小更小,下載速度更快。當您不需要漏洞詳細信息時,此選項非常有用,并且適用于CI/CD。
要查找其他信息,可以在 NVD 網站上搜索漏洞詳細信息。
網站地址:https://nvd.nist.gov/vuln/search
將 Trivy 集成進 CI
Trivy 有對 CI 友好的特點,并且官方也以這種方式使用它,想要集成 CI 只需要一段簡單的 Yml 配置文件即可,如果發現漏洞,測試將失敗。如果不希望測試失敗,請指定 –exit code 0。由于在自動化場景(如CI/CD)中,您只對最終結果感興趣,而不是對完整的報告感興趣,因此請使用 –light 標志對此場景進行優化,以獲得快速的結果。
集成 GitLab CI 的 Yml 配置可以參考:https://github.com/aquasecurity/trivy#gitlab-ci
使用注意點
- 國內拉取漏洞數據庫慢。
- 同一臺服務器,多個鏡像掃描的時候不可并行執行。
- 可以使用 -–light 使用輕量級數據庫來優化執行掃描的效率。
原文地址:https://mp.weixin.qq.com/s/B_18zvoVobSUNaOIGUpqBg