經驗法則:
- 確保映像檔已設定適當的安全性軟體升級來源,避免
apt-get upgrade(或等效命令)未執行任何動作。 - 在 Dockerfile 中加入
RUN apt-get update && apt-get upgrade -y(或等效命令)。 - 在涉及靜態連結 Go 程式的少數情況下,請刪除該程式,或在
docker build過程中從原始碼重新建置。 - 排定每週或每月自行重新建置。
背景 #
- Docker 官方映像檔(Docker official images,DOI)的唯一真實來源,是 https://github.com/docker-library/official-images 的 master 分支。該專案使用名為「Library definition files」的格式,定義哪些儲存庫中的哪些標籤應主動重新建置,以及其 Dockerfile 的位置(Git 儲存庫 URL 與 commit ID)。這些
repo:tag稱為目前仍維護的映像檔。- 這些被參照的 Dockerfile Git 儲存庫中,大多數但非全部由 Docker Inc. 本身維護。此處提供一個例子。
- 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 Inc. 的 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 或等效命令)不會修復任何問題。
參考資料:
評論
在 GitHub 上閱讀或評論(發表評論需要登入)