如何处理 Docker 容器内的安全更新?

Mar*_*ler 135 security linux redhat containers docker

将应用程序部署到服务器上时,应用程序与其自身捆绑的内容与它期望从平台(操作系统和已安装的包)提供的内容之间通常存在分离。其中一点是平台可以独立于应用程序进行更新。例如,当需要将安全更新紧急应用于平台提供的包而不重建整个应用程序时,这很有用。

传统上,安全更新只是通过执行包管理器命令来在操作系统上安装更新版本的包(例如 RHEL 上的“yum update”)来应用的。但是随着容器技术的出现,比如 Docker,其中容器镜像本质上同时捆绑了应用程序平台,保持容器系统最新的规范方法是什么?主机和容器都有自己的、独立的、需要更新的包集,在主机上更新不会更新容器内的任何包。随着 RHEL 7 的发布,其中 Docker 容器特别突出,听到 Redhat 推荐的处理容器安全更新的方法是很有趣的。

关于几个选项的想法:

  • 让包管理器更新主机上的包不会更新容器内的包。
  • 必须重新生成所有容器镜像来应用更新似乎打破了应用程序和平台之间的分离(更新平台需要访问生成 Docker 镜像的应用程序构建过程)。
  • 在每个正在运行的容器中运行手动命令似乎很麻烦,并且下次从应用程序发布工件更新容器时,更改有被覆盖的风险。

所以这些方法似乎都不令人满意。

Joh*_*mke 57

Docker 镜像捆绑了应用程序和“平台”,这是正确的。但通常图像是由基础图像和实际应用程序组成的。

因此,处理安全更新的规范方法是更新基础映像,然后重建应用程序映像。

  • 有一点我不明白:如果你是一家公司,购买了一个作为docker容器发货的软件,每次出现安全问题时,你是否需要等待软件制造商重新构建应用程序包? ? 哪家公司会以这种方式放弃对其公开漏洞的控制? (11认同)
  • @ArthurKay 有两个原因:1)您扩大了容器大小,因为所有升级的包都将添加到容器层,同时将过时的包保留在映像中。2)它破坏了(容器)图像的最大优势:您运行的图像与您构建/测试的图像不同,因为您在运行时更改了包。 (10认同)
  • 谢谢,这听起来很合理。只是仍然希望更新平台可以这样说不必触发重新打包整个应用程序(例如考虑由于单个基本映像获得更新而必须重建 100 个不同的应用程序映像)。但也许这对于将所有内容捆绑在一个图像中的 Docker 哲学来说是不可避免的。 (3认同)
  • @ValkoSipuli 您可以随时编写脚本来自动化该过程。 (3认同)

小智 7

容器应该是轻量级和可互换的。如果您的容器存在安全问题,您可以重建已打补丁的容器版本并部署新容器。(许多容器使用标准基础镜像,使用标准包管理工具如 apt-get 来安装它们的依赖项,重建将从存储库中提取更新)

虽然您可以在容器内打补丁,但这不会很好地扩展。