TL;DR:不論你的基底映像看起來多麼權威:
- 務必確認映像已正確設定並啟用上游安全更新來源。
- 在最終業務映像中,務必加入
RUN apt-get update && apt-get upgrade -y(或等價指令)。 - 務必每週或每月排程你自己的重建流程。
背景 #
- Docker 官方映像(DOI)的唯一事實來源是 https://github.com/docker-library/official-images 的 master 分支。他們使用一種稱為「Library definition files」的格式,定義哪些倉庫中的哪些標籤應被主動重建,以及對應 Dockerfile 的位置(git 倉庫 URL 與 commit ID)。這些
repo:tag被稱為目前維護中的映像。- 這些被引用的 Dockerfile 倉庫中,大多數但並非全部由 Docker 公司本身 維護。可參考一個範例。
- https://doi-janky.infosiftr.net/ 上的 Jenkins 工作會分析所有 DOI 的 Dockerfile,產生 DOI 之間的最新相依關係,並寫入 https://github.com/docker-library/meta。
- 根據這些中繼資料,每次 DOI Dockerfile 的 PR 被合併時,都會在 https://doi-janky.infosiftr.net/ 觸發其所有下游 DOI(即
FROM它的映像)重建並推送到 Docker Hub。- 不保證會有定期、無條件重建。
觀察 #
- Docker 公司的 DOI 不會在 Dockerfile 中執行
RUN apt upgrade(或等價指令),其他 DOI 供應方也沒有被要求這麼做。 - 即使某個 DOI 供應方在 Dockerfile 中有作業系統升級步驟,若沒有定期、無條件重建,安全修補(若有)仍不會被安裝。
- 部分 DOI 使用的發行版預設關閉了安全更新來源。可參考:
docker run --rm mysql:9.6.0 tail /etc/yum.repos.d/oracle-linux-ol9.repo。
因此,目前維護中的 DOI 並不保證在建置當下是無 CVE 的。也因此,一次「無變更重建」(未包含 RUN apt upgrade 或等價指令)不會修補任何問題。
參考資料: