如何处理 docker 容器中的安全更新?

How can I deal with security updates in my docker containers?

我们希望避免在 docker 文件中包含 "yum update",因为它可能会根据构建 docker 图像的时间生成不同的容器,但显然这可能会造成一些如果需要更新基本系统,则会出现安全问题。最好的选择真的是拥有一个组织范围的基础系统映像并更新它吗?问题是每次应用安全更新时都需要在整个组织中重建和部署所有应用程序。

一个对我来说似乎有点不可行的替代方案是简单地忽略容器内的安全更新,只担心主机上的安全更新。这里的思考过程是,要让攻击者进入容器,主机上需要有一个漏洞,docker-engine 中的另一个漏洞才能进入容器,然后是另一个漏洞利用容器内的某些东西,这似乎是一系列不太可能发生的事件。随着用户命名空间和 seccomp 配置文件的引入,这似乎进一步降低了风险。

无论如何,我如何处理容器内的安全更新,同时对 CI/CD 管道的影响最小,或者理想情况下不必经常重新部署整个基础架构?

您可以通过引入中间更新层来减少构建的不可重复性。

创建像这样的图像:

FROM centos:latest
RUN yum update -y

构建镜像,标记并推送。现在你的构建不会改变,除非你决定改变它们。

您可以将其他 Dockerfile 指向 myimage:latest 以在您决定这样做后获得自动更新,或者指向特定版本。

我设置 CI 系统的方式是,成功(手动)构建带有更新的基础映像会触发依赖它的任何映像的构建。

报告了安全问题?检查更新包是否可用或在 Dockerfile 中进行临时修复。触发构建。 稍后您将拥有所有应用程序的固定版本,可以部署。

大多数主要发行版都会经常发布新的基础映像,其中包括最新的关键更新和必要的安全修复程序。这意味着您可以简单地拉取最新的基础镜像来获取这些修复并重建您的镜像。

而且由于您的容器正在使用 yum,您可以利用 yum 来控制更新哪些包。 Yum 允许您设置发布版本,以便您可以将更新固定到特定的 OS 发布。

例如,如果您使用的是 RHEL 7.2,您的 Dockerfile 可能类似于:

FROM rhel:7.2
RUN echo "7.2" > /etc/yum/vars/releasever
RUN yum update -y && yum clean all

这确保您将继续使用 RHEL 7.2 并且仅接收关键软件包更新,即使您进行了完整的 yum 更新。

有关可用的 yum 变量或其他配置选项的更多信息,请查看 'yum.conf' 手册页。

此外,如果您需要对更新进行更细粒度的控制,您可以查看 'yum-plugin-versionlock' 包,但这很可能无法满足您的需求。