鏡像漏洞掃描工具Trivy

head.png

Trivy的特徵

Trivy是一種適用於CI的簡單而全面的容器漏洞掃描程序。軟件漏洞是指軟件或操做系統中存在的故障、缺陷或弱點。Trivy檢測操做系統包(Alpine、RHEL、CentOS等)和應用程序依賴(Bundler、Composer、npm、yarn等)的漏洞。Trivy很容易使用,只要安裝二進制文件,就能夠掃描了。掃描只需指定容器的鏡像名稱。與其餘鏡像掃描工具相比,例如Clair,Anchore Engine,Quay相比,Trivy在準確性、方便性和對CI的支持等方面都有着明顯的優點。java

推薦在CI中使用它,在推送到container registry以前,您能夠輕鬆地掃描本地容器鏡像,Trivy具有以下的特徵:python

  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. 易於安裝,安裝方式:mysql

    • apt-get install
    • yum install
    • brew install

無需安裝數據庫、庫等先決條件(例外狀況是須要安裝rpm以掃描基於RHEL/CentOS的圖像)。git

Trivy的安裝

這裏安裝Trivy的環境是Centos7,安裝的版本是0.4.4,安裝的命令以下:github

rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.4.4/trivy_0.4.4_Linux-64bit.rpmsql

安裝結果以下圖所示即安裝成功:docker

image

Trivy的簡單使用

下面介紹一些Trivy的簡單使用的命令和一些測試的結果。主要從幾個方面來測試Trivy的性能指標:數據庫

  • 鏡像大小對Trivy掃描速度的影響;
  • 掃描的鏡像大小和網絡流量使用狀況的關係;
  • 掃描的結果是否容易解析;

鏡像大小對Trivy掃描速度的影響

  • 當鏡像位於本地,大小90MB左右時候的掃描:

命令:trivy registry.cn-hangzhou.aliyuncs.com/choerodon-tools/javabase:0.5.0npm

結果:json

圖片

時間:第一次掃描會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格式的文件

圖片

  • 其餘更多使用命令以下,結果可自行測試:

    • 按嚴重性篩選漏洞:

$ trivy --severity HIGH,CRITICAL ruby:2.3.0

  • 按類型篩選漏洞:

$ trivy --vuln-type os ruby:2.3.0

  • 跳過漏洞數據庫的跟新:Trivy在開始運行時老是更新其漏洞數據庫。這一般很快,由於這是一個差別更新。可是,若是您甚至想跳過這一步,請使用--skip update選項。

$ trivy --skip-update python:3.4-alpine3.9

  • 僅下載漏洞數據庫:您還能夠要求Trivy簡單地檢索漏洞數據庫。這對於初始化連續集成系統中的工做人員很是有用。在第一次運行中,--only update選項將被忽略。

$ trivy --download-db-only

$ trivy --download-db-only --only-update alpine

  • 忽略未修復的漏洞:默認狀況下,Trivy還會檢測未修補/未修復的漏洞。這意味着即便更新了全部包,也沒法修復這些漏洞。若是要忽略它們,請使用--ignore unfixed選項。

$ trivy --ignore-unfixed ruby:2.3.0

  • 指定退出代碼:默認狀況下,即便檢測到漏洞,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

  • 忽略指定的漏洞:

$ cat .trivyignore

CVE-2018-14618

CVE-2019-1543

$ trivy python:3.4-alpine3.9

  • 指定緩存目錄:

$ trivy --cache-dir /tmp/trivy/ python:3.4-alpine3.9

  • 清除鏡像緩存:--clear cache選項刪除鏡像緩存。若是更新具備相同tag的圖像(例如使用最新tag時),此選項很是有用。

$ trivy --clear-cachez

  • --reset選項刪除全部緩存和數據庫。在此以後,須要很長時間才能在本地重建漏洞數據庫。

$ trivy --reset

  • 使用輕量級數據庫:

$ trivy --light alpine:3.10

輕量級數據庫不包含諸如描述和引用之類的漏洞詳細信息。所以,數據庫的大小更小,下載速度更快。

當您不須要漏洞詳細信息時,此選項很是有用,而且適用於CI/CD。

要查找其餘信息,能夠在NVD網站上搜索漏洞詳細信息。(https://nvd.nist.gov/vuln/search網站

不推薦使用的選項:

--only-update,--refresh而且--auto-refresh被廢棄了,由於他們如今是沒必要要的。這些選項將在下一版本中刪除。

將Trivy集成進CI

Trivy有對CI友好的特色,而且官方也以這種方式使用它,想要集成CI只須要一段簡單的Yml配置文件便可,若是發現漏洞,測試將失敗。若是不但願測試失敗,請指定--exit code 0。因爲在自動化場景(如CI/CD)中,您只對最終結果感興趣,而不是對完整的報告感興趣,所以請使用--light標誌對此場景進行優化,以得到快速的結果。

集成GitLab CI的Yml配置能夠參考:

https://github.com/aquasecurity/trivy#gitlab-ci

使用注意點

  • 國內拉取漏洞數據庫慢。
  • 同一臺服務器,多個鏡像掃描的時候不可並行執行。
  • 可使用--light使用輕量級數據庫來優化執行掃描的效率。
參考資料: https://github.com/aquasecurity/trivy

本篇文章出自Choerodon豬齒魚社區汪翔。

相關文章
相關標籤/搜索