容器安全掃描工具推薦

在現代軟件開發中, 我們會使用一些公共鏡像作爲基礎鏡像來快速構建我們的應用鏡像,並將其部署到生產環境中。

隨着越來越多的應用程序被容器化,容器安全也隨之變得越來越重要。在項目的流水線中, 我們可以使用漏洞掃描器進行掃描並提前獲得反饋,實現 “安全左移” ,也可以更好的實踐敏捷。

**基於容器的應用程序的安全痛點 **

現在,我們使用先進的技術來構建我們的應用程序,如 NodeJS、 Java 和 Kotlin 等,然後將代碼庫存儲在託管的 Git 平臺上,如 GitHub、Gitlab 等。代碼庫由我們的業務代碼和依賴關係組成;對於依賴項,我們可以使用專業的掃描工具來確保安全,比如 NodeJS 的 npm audit , GitHub 的 Dependabot;至於我們的業務代碼,可以使用其他的一些安全工具可以掃描,比如 SoneQube 等。 

因此,對於依賴( Dependencies)和我們的業務代碼,這些都在我們的控制之下,我們可以確保應用程序的安全性,並且在 Pipeline 上獲得快速反饋;同時在我們將應用程序部署到生產環境之前可以通過使用各種工具建立信心。但是,通常情況下我們的應用程序運行的系統環境是不受我們控制的,可能存在潛在的安全漏洞。在這我們可以換位思考一下,如果我們不能保證我們的應用程序運行的系統的環境安全,就會導致各種各樣意想不到的問題,如黑客攻擊、用戶信息泄露、財產損失,更會對公司的聲譽造成損害。所以,確保我們產出物(Artifact)的安全是很重要的。

保持容器鏡像安全的 兩個方案

方案 1:在鏡像註冊表中定期掃描

通過這種方式,我們需要爲鏡像註冊表添加一個安全掃描程序,掃描程序可以是一個定時任務(Cron Job) 作業,也可以是由特定的人觸發的可執行操作。

如果是一個定時任務,它將在特定時刻由定時任務自動觸發。例如,Docker Hub 會在特定的時間掃描他們的官方註冊表,當有任何漏洞被掃描出來時,它會向鏡像維護者發送報警信息。

方案 2:將掃描工具集成到 Pipeline 中

另一種方法是在 Pipeline 上對鏡像產物進行掃描,這樣更加簡單高效。當我們將代碼推送到代碼存儲庫時, Pipeline 將自動執行掃描鏡像的命令。因爲 Pipeline 每次都是無差別地執行,所以我們可以發現任何安全問題並及時報警修復。

現在,越來越多的團隊或公司使用敏捷來開發他們的項目。如果我們能夠儘早地發現任何安全問題或者漏洞,我們就可以在產品發佈之前降低產品的安全風險。Pipeline 是確保每一行代碼和基礎運行環境的安全性是的最好方法之一,因爲它可以在提交代碼時自動執行。

容器安全掃描工具對比

針對上述解決方案,我們調查了 Trivy、Claire、Anchore Engine、Quay、Docker hub 和 GCR 等幾種掃描工具,從不同維度進行對比。

參考 Trivy 官網

首先,我們可以將這些掃描工具按照其執行的環境簡單分類;因爲 Docker Hub、GCR 和 Quay 是需要在服務端也就是容器註冊中心運行的, 所以適合方案 1;Trivy、Clair 和 Anchor Engine 可以在 Pipeline 上工作,所以適合解決方案 2。

對於第一個維度:OS Package,這些所有的掃描工具都可以做到,但是對於第二個維度:Application dependencies,只有 Trivy 和 Anchore Engine 可以做到,對於第五個維度: Suitable for CI, 只有前三個符合條件。

對於漏洞數據庫的更新,Clair 會定期從一組配置的源中獲取漏洞元數據庫(Vulnnerability Database),並將數據存儲在其數據庫中,只要不獲取最新的漏洞元數據,每次執行都用之前的漏洞數據庫,漏洞數據庫的時效性有點差。Trivy 和 Anchore Engine 則是每次運行都將下載最新的漏洞數據庫並將其緩存在本地文件中,當掃描工具再次運行時,它將檢查並更新數據庫以保持數據庫爲最新狀態。 

同時,對於 Trivy、Clair 和 Anchore Engine,這三者的社區非常活躍,所以我們不能用沒有人來幫你解決你的問題來評判;而且作爲一種工具,它必須易於使用並且有良好的文檔可供參考。經過調研,發現 Trivy 的文檔非常詳細,非常友好, 而且 Trivy 的使用方式更加友好,比如我們可以過濾掉(.trivyignore)你指定的漏洞,對於最新發現的漏洞,官方沒有給出修復版本,這時候我們就可以忽略這個漏洞繼續構建,但 Anchore Engine 做不到。

2020 年 3 月 16 日,領先的雲原生應用和基礎設施安全平臺供應商 Aqua Security 宣佈,其開源的 Trivy 漏洞掃描器將作爲一個集成選項添加到其使用的雲原生平臺、CNCF 的 Harbor 註冊表和 Mirantis Docker Enterprise 中。你可以在這裏找到這篇文章:https://blog.aquasec.com/trivy-vulnerability-scanner-joins-aqua-family。

Trivy 集成到流水線中的使用方法

Trivy 支持多種掃描方式,如掃描容器鏡像、Git 倉庫和文件系統等;下面,我們使用 GitHub Actions 以 Docker 運行 Trivy 掃描構建好的鏡像產出物來展示 Trivy 的強大之處,下面是 GitHub Actions 的部分代碼:

- name: Trivy scanner
  run: |
         docker run --rm -v 
/var/run/docker.sock:/var/run/docker.sock \
           aquasec/trivy image --severity HIGH,CRITICAL 
--exit-code 1 dashboard:${{ github.sha }}

在這需要對以下幾個參數做特別說明:

  1. -v/var/run/docker.sock:/var/run/docker.sock 如果想掃描本地主機上的鏡像,需要掛載 docker.sock

  2. --severity 設置要掃描的漏洞級別

  3. --exit-code 發現漏洞時 Trivy 的退出狀態 (默認值:0);在 Pipeline 中,如果將該值設置爲 1,且有漏洞被發現,則 Pipeline 將退出,而不會繼續運行。如果將其設置爲 0,則 Pipeline 將繼續運行,但會報告結果。所以,如果你想在發現漏洞後阻止 Pipeline 繼續執行,可以設置它爲 1。

想了解更多關於參數和使用方法的信息,請訪問 Trivy 的官方網站:https://github.com/aquasecurity/trivy。

總結

無論你在哪裏,安全都是一個非常重要的問題。我們可以將 “安全左移(Shift Left Security)”,這樣就可以減少生產環境中的安全風險;對於掃描工具 Trivy 來說,它對於保證鏡像的安全性非常有用,它不僅可以掃描鏡像,還可以掃描 Git 倉庫,文件系統等。最後,非常感謝同事張思楚、王亦晨和邢硯敏等人的大力支持和指導,在他們熱心幫助和辛苦付出之下才有了這篇文章。


本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/47bGMmsine_6LGpjtTIIOA