关于修复和预防 Docker 镜像 CVE

最后更新: 2023-03-03 14:00:22 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

经验法则:

  1. 确保为镜像配置了适当的安全软件升级源,以免 apt-get upgrade(或等效命令)不执行任何操作。
  2. 在 Dockerfile 中加入 RUN apt-get update && apt-get upgrade -y(或等效命令)。
  3. 在涉及静态链接的 Go 程序这种少见情况下,请将其删除,或在 docker build 过程中从源代码重新构建。
  4. 安排每周或每月自行重新构建镜像。

背景 #

  1. Docker 官方镜像(DOI)的唯一事实来源是 https://github.com/docker-library/official-images 的 master 分支。该项目使用一种称为“库定义文件”(Library definition files)的格式,定义应主动重新构建哪些仓库中的哪些标签,以及在哪里查找相应的 Dockerfile(Git 仓库 URL 和提交 ID)。这些 repo:tag 称为当前维护的镜像。
    • 这些被引用的 Dockerfile Git 仓库中,*大多数(但并非全部)*由 Docker Inc. 自身维护。可参见此示例。
  2. https://doi-janky.infosiftr.net/ 上的 Jenkins 作业会分析所有 DOI 的 Dockerfile,生成 DOI 之间最新的依赖关系,并将其持久化到 https://github.com/docker-library/meta。
  3. 利用这些元数据,每当 DOI Dockerfile 的 PR 被合并后,https://doi-janky.infosiftr.net/ 都会触发其所有下游 DOI(即通过 FROM 引用它的 DOI)重新构建并推送到 Docker Hub。
    • 不保证会进行无条件的定期重新构建。

观察结果 #

  1. Docker Inc. 的 DOI 不会在 Dockerfile 中执行 RUN apt upgrade(或等效命令),其他 DOI 供应商也没有被要求这样做。
  2. 即使 DOI 供应商在 Dockerfile 中包含操作系统升级步骤,如果没有无条件的定期重新构建,也不会安装安全补丁(如果存在)。
  3. 一些 DOI 使用的发行版默认禁用了上游安全更新。示例可参见 docker run --rm mysql:9.6.0 tail /etc/yum.repos.d/oracle-linux-ol9.repo。

因此,当前维护的 DOI 无法保证在构建时不存在 CVE。所以,原样重新构建(不执行 RUN apt upgrade 或等效命令)不会修复任何问题。

参考资料:

评论

在 GitHub 上阅读或评论(发表评论需要登录)