相依套件
容器掃描
容器掃描會檢查容器映像檔中的已知漏洞、過時套件與有風險的設定。映像檔將您的應用程式、基礎作業系統以及兩者之間的一切打包在一起,因此掃描涵蓋的範圍遠超過您自己的相依套件。它讀取的也是已完成的映像檔,這限制了它能得知映像檔是如何產生的程度。
更新日期
容器掃描如何運作
- 解開映像檔。掃描工具讀取映像檔的各個層,但不會執行它們。
-
列出內容。它讀取作業系統的套件資料庫與應用程式的資訊清單,例如複製進映像檔的
package-lock.json。 - 比對資料。它將套件與來自各發行版和資安公告資料庫的漏洞資料進行比對。
- 檢查設定。部分工具也會標示以 root 身分執行、或有機密殘留在某一層等問題。
應在哪裡執行掃描
| 階段 | 能帶來什麼 | 限制 |
|---|---|---|
| CI,在映像檔建置之後 | 在映像檔推送之前讓建置失敗 | 只是當天資安公告的快照 |
| 映像檔登錄庫 | 有新資安公告時重新掃描已儲存的映像檔 | 在映像檔發布之後才發現問題 |
| Kubernetes 准入控制 | 在部署時封鎖未經掃描或未通過的映像檔 | 需要政策,以及處理例外的方式 |
| 執行階段 | 顯示目前正在執行哪些映像檔,以及載入了哪些內容 | 需要在您的叢集上安裝代理程式 |
容器掃描工具
- 開源:Trivy 與 Grype 是常見的免費選擇,兩者都能輕鬆整合進 CI。
- 內建於登錄庫與平台:Docker Scout 與各大雲端映像檔登錄庫都提供掃描功能。
- 商業平台:Snyk 與 Anchore 加上了政策、報表與工作流程。
如何減少掃描結果
- 從較小的基礎映像檔開始。精簡版或 distroless 映像檔包含的套件較少,適用的資安公告也較少。
- 定期重新建置。基礎映像檔會持續修補,三月時沒有問題的映像檔,現在未必如此。
- 使用多階段建置。編譯器與建置工具不應留在最終映像檔中。
- 以 digest 釘選基礎映像檔。標籤可能在您不知情時改變,digest 則不會。
- 排定優先順序。許多發現尚無修正,或位於您的應用程式從未使用的套件中。請參閱 如何排定漏洞優先順序。
同樣的做法也適用於映像檔以外的範圍:如何減少漏洞雜訊 依序整理了適用於您所有掃描工具的方法。
容器掃描看不到什麼
- 編譯後的程式碼。映像檔中的 Go 或 Rust 執行檔只帶有有限的中繼資料,掃描工具必須自行推斷其中包含了什麼。
-
沒有套件紀錄的檔案。以
curl加入或直接複製進某一層的軟體,在套件資料庫中沒有任何紀錄。 - 建置使用過又遺留的內容。多階段建置會捨棄產生映像檔的工具。如果其中某個工具遭到入侵,最終映像檔中不會留下任何跡象。
- 它從何而來。掃描描述的是映像檔,而不是產生它的建置過程。
深入了解請參閱 Docker 映像檔 SBOM 遺漏了什麼,各種選項則請參閱 最佳 SBOM 工具。
近期的實例請參閱 PHP2Shell:官方 php 映像檔從原始碼編譯 PHP,因此執行環境沒有套件紀錄,必須逐一詢問每個映像檔的版本。
掃描映像檔與記錄建置
對於並非您自行建置的映像檔,以及叢集與設定,掃描工具是合適的工具。對於您自行建置的映像檔,CRACI 採取不同的做法。作為您的 GitHub Actions 執行器,它能看到進入建置的所有內容,包括基礎映像檔及其作業系統層,因此它記錄的是實際放進去的內容,而不是事後推斷。之後,它會在新漏洞公布時持續檢查這些 SBOM。
CRACI 不會掃描並非您自行建置的映像檔、叢集、VM 映像檔或設定錯誤。Trivy 可以,因此這些項目請繼續使用 Trivy。請參閱 CRACI 與 Trivy 比較。
容器掃描:常見問題
什麼是容器掃描?
這是檢查容器映像檔中已知漏洞、過時套件與有風險設定的過程,通常不需要執行映像檔。
應該在什麼時候掃描容器映像檔?
在 CI 中映像檔建置完成後掃描,並在有新資安公告時於登錄庫中再次掃描。只掃描一次,留下的只是一份很快就會過時的快照。
最好的免費容器掃描工具是哪一個?
Trivy 與 Grype 是使用最廣泛的免費選擇。兩者都能在 CI 中執行,並涵蓋作業系統與應用程式套件。
映像檔掃描與 SBOM 有什麼不同?
SBOM 列出映像檔中有哪些內容,掃描則檢查這些內容是否有已知問題。許多掃描工具會先建立 SBOM,再將它與資安公告比對。
為什麼我的容器映像檔有這麼多漏洞?
主要來自基礎映像檔,它帶入了作業系統的套件。使用較小的基礎映像檔並定期重新建置,就能消除大部分漏洞。
容器掃描工具能讀取編譯後的執行檔嗎?
部分可以。Go 與 Rust 執行檔可能帶有一些相依套件的中繼資料,但許多編譯後的程式碼幾乎無法提供掃描工具線索,因此它只能推斷其中包含了什麼。