Docker 镜像是在某个时间点构建的,然后它们由这些镜像的用户获取,并基于它们创建容器。查看 Linux 发行版(如 Ubuntu)上出现更新的频率,这是否意味着图像在发布到图像存储库后的第二天就已经过时了?
假设有人为他们的应用创建了一张图片:
FROM ubuntu
RUN apt update -y # or whatever the command to update on Ubuntu is
WORKDIR /myapp
COPY ./* ./
# and some other stuff
应用程序在某一天构建(使用ubuntu:latest
从那天开始),所有最新的补丁都通过 应用RUN apt update -y
,并且图像被推送到 Docker 存储库。现在,如果第二天在 Ubuntu 的 apt repo 上发布了一些重要的更新(比如一些 openssl 补丁)。我的应用程序呢?在我手动决定重建映像并再次推送之前,现在是否不安全?也许我们实际上不应该关心图像/容器是否过时而只担心运行容器的主机是否是最新的?如果是这样,为什么?
我将在答案中总结我的想法,而不是发表评论:
是的,但仅限于任何操作系统和平台上的任何服务器也是如此。可以说,容器的漏洞窗口平均可能更短,因为它们比“普通”服务器更频繁地升级其基础操作系统层,但这并不意味着它们应该被忽略,当然这并不总是正确的——它是很容易想象,与重新部署其他容器相比,修补频率更高的虚拟机。
如果你安装一个普通的 Ubuntu 虚拟机并放置 30 天,你很可能会有未应用的安全修复程序。对于保持部署 30 天的容器也是如此,这意味着在这两种情况下,如果您不能确保操作系统级别保持最新(例如,通过重新部署整个来自新操作系统映像的容器/虚拟机)。
这当然取决于您的应用程序的依赖项是什么。您的应用程序“不安全”的程度与假设的安全固定包对您的应用程序的重要性有关。
如果您正在运行一个使用 log4j 的 Java 应用程序,并且在 Ubuntu 存储库中修复了一个严重漏洞,那么无论您是在容器还是虚拟机上运行,您都同样容易受到攻击,直到您更新该软件包 - 无论是通过
apt-get
包含新软件包的新 OS 映像或重新部署整个 vm/container 来完成不是重要部分。基本问题“我的应用程序是安全的还是受过时软件包中的漏洞影响”并不是真正的 Docker 甚至 Ubuntu 特定的问题,除了 VM 和容器之间明显不同的一种情况,即所有容器与主机共享内核,因此无法从容器内修补内核漏洞,而是直接依赖于部署容器的主机上运行的内核版本。
要点:
大多数容器映像会定期更新以包含更新,包括安全更新。
容器不像基础系统那样容易受到攻击,因为:
如果您真的担心某个特定图像,请自己重建它。
Dockerfile
很可能在 Github 或类似网站上找到。一般来说,我不会太担心这个。另一方面,如果您实际上是依靠第三方建筑来提供您的图像,那么一如既往地只信任信誉良好的来源。
对于生产用途,出于完全相同的原因,通常建议始终构建自己的图像。