经验法则:
- 确保为镜像配置了适当的安全软件升级源,以免
apt-get upgrade(或等效命令)不执行任何操作。 - 在 Dockerfile 中加入
RUN apt-get update && apt-get upgrade -y(或等效命令)。 - 在涉及静态链接的 Go 程序这种少见情况下,请将其删除,或在
docker build过程中从源代码重新构建。 - 安排每周或每月自行重新构建镜像。
背景 #
- Docker 官方镜像(DOI)的唯一事实来源是 https://github.com/docker-library/official-images 的 master 分支。该项目使用一种称为“库定义文件”(Library definition files)的格式,定义应主动重新构建哪些仓库中的哪些标签,以及在哪里查找相应的 Dockerfile(Git 仓库 URL 和提交 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引用它的 DOI)重新构建并推送到 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 上阅读或评论(发表评论需要登录)