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