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


117

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

传统上,仅通过执行程序包管理器命令来应用安全更新,以在操作系统上安装程序包的更新版本(例如RHEL上的“ yum更新”)。但是随着诸如Docker之类的容器技术的出现,容器映像实际上将应用程序平台都捆绑在一起,如何使具有容器的系统保持最新状态?主机和容器都有各自独立的软件包集,需要在主机上进行更新和更新不会更新容器内的任何软件包。随着RHEL 7的发布,尤其是Docker容器成为特色,很高兴听到Redhat推荐的处理容器安全性更新的方法是什么。

关于以下几种选择的想法:

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

因此,这些方法似乎都不令人满意。


1
到目前为止,我所见过的最好的主意是Project Atomic。我不认为这是非常黄金时间做好准备,虽然。
迈克尔·汉普顿

1
Valko,您最终得到了什么工作流程?我正在运行长期容器(例如托管php-cgi),到目前为止,我发现的是:docker pull debian/jessie更新映像,然后重建现有映像,然后停止容器并再次运行它们(与新图片)。我构建的映像与以前的映像具有相同的名称,因此通过脚本完成启动。然后,我删除“未命名”图像。我当然希望有更好的工作流程。
miha 2014年

1
miha:这听起来与我最终所做的类似。基本上,不断进行更新和重建所有映像,作为发布新版本的一部分。然后使用新映像重新启动容器。
Markus Hallmann 2014年

1
最好的答案在这里有很大帮助,因为其中包含主COMMANDLINES到底该怎么做约翰内斯Ziemke说的脚本:
哈德森桑托斯

有趣的问题。我自己想知道。如果您在一台Docker主机上运行20个应用程序,则必须升级基础映像,重建并重新启动!20个应用程序,您甚至都不知道安全更新是否影响了它们全部或其中之一。例如,当安全更新仅影响libpng时,您必须重建Apache的映像。因此,您最终会进行不必要的重建和重新启动...
Dalibor Filus,

Answers:


47

Docker映像将应用程序和“平台”捆绑在一起是正确的。但是通常图像由基本图像和实际应用程序组成。

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


3
谢谢,这听起来很合理。仍然只是希望更新平台,可以这么说,不必触发整个应用程序的重新打包(例如,考虑到由于更新了一个基本映像而不得不重建100个不同的应用程序映像)。但这可能是Docker哲学将所有内容捆绑在一个映像中的必然结果。
Markus Hallmann 2014年

3
@ValkoSipuli您总是可以编写脚本来自动执行该过程。
dsljanus

为什么不在容器内进行apt-get升级,dnf升级,pacman -syu等等效?您甚至可以创建一个执行该操作的Shell脚本,然后运行该应用程序,然后将其用作容器的入口点,以便在启动/重新启动容器时,它会升级其所有软件包。
亚瑟·凯

8
@ArthurKay的两个原因:1)您扩大了容器的大小,因为所有升级的软件包都将添加到容器层,同时将过时的软件包保留在映像中。2)它击败了(容器)映像的最大优势:运行的映像与您构建/测试的映像不同,因为您在运行时更改了程序包。
Johannes'fish'Ziemke '15

7
我不了解一件事:如果您是一家公司,购买作为docker集装箱运输的软件,那么每次安全问题出现时,您是否必须等待该软件的制造商重建应用程序包? ?哪家公司会以这种方式放弃对其开放漏洞的控制?
Sentenza

7

这些容器应该是轻量的并且可以互换。如果您的容器存在安全问题,则可以重建已修补容器的版本并部署新容器。(许多容器使用标准基础映像,该映像使用诸如apt-get之类的标准软件包管理工具来安装其依赖项,重建会从存储库中提取更新)

尽管您可以在容器内打补丁,但扩展性不佳。



0

首先,您过去传统上运行的许多更新将完全不在容器本身内部。容器应该是您过去习惯看到的整个文件系统的一个相当轻量级的子集。您必须更新的软件包将是DockerFile的一部分,并且由于拥有DockerFile,因此您应该能够跟踪那些需要更新的软件包和容器ID。即将发布的Cloudstein用户界面将为您跟踪这些DockerFile成分,以便人们可以构建最适合其容器的更新方案。希望这可以帮助


-1

通常,它甚至比您提供的三个选择还要差。大多数docker镜像不是使用程序包管理器构建的,因此您不能仅将其镜像到docker镜像并发布更新。您将需要重建或重新获取Docker映像。

在大多数情况下,您需要重建或依靠他人重建安全补丁这一事实似乎并不合理。

我当时正在考虑在docker容器中部署声纳和雷达,但是知道它们不会获得我的容器获得的常规安全更新会破坏交易。管理我的容器的安全更新很麻烦,而不必处理以某种方式手动将安全更新分别应用于每个docker映像的麻烦。


1
您的帖子不会被视为答案,因为您没有提供该问题的答案。请添加它作为对问题的评论,并删除您的“答案”。StackExchange不是论坛,而应被视为问答,专家可以回答他们可以提供帮助的问题。
菲利普-Zyan K Lee- Stockmann,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.