Docker和PaX主机

我花了几天的时间试图让Docker容器在Gentoo Hardened上正常运行。

我花了数天才发现的第一个问题是由我自己的偏执狂所驱动的:我放置Docker根的分区挂载了nosuid和noexec。 因此,devicemapper驱动程序对它进行了处理,因为它创build了许多循环设备来完成它的工作,但覆盖驱动程序没有,因为它inheritance了顶部的noexec标志,所以容器中的可执行文件将不会运行。 我只是留下这个知识让别人来发现这里…

然而,那样的话,我绊倒了另外一个问题:PaX标志。

PaX强制要求创build包含代码的新内存页面的可执行文件需要使用特殊的ELF头文件或扩展的文件系统属性(最好是两者)来标记,因为推荐的Gentoo设置是使用扩展属性并忽略ELF头文件。 那些不合规的可执行文件在他们尝试的时候就会被杀死。

不幸的是,只需要尝试的程序列表包括nodejs,python,以及几乎所有其他现代的解释器,更不用说mongodb了。 可能还有其他问题的可执行文件,但这些是主要的元凶,也是你经常想要在容器中看到的东西。

更不幸的是,尽pipedocker图像应该能够包含由扩展属性标记的文件,但是对于需要这种标记的通用软件(特别是mongodb和nodejs)来说,没有一个官方图像似乎具有这些标记。

目前,我一直在解决这个问题,将实际的文件放在磁盘上,并从容器外面设置它的xattr。 这显然是一个非常糟糕的主意。

解决这个问题的正确方法是什么?就这一点而言,似乎没有其他人似乎有一个特别的理由,正如大量的Googlesearch似乎表明的那样? 是否有,也许,我错过了另一个内核选项,(我倾向于这么做)或一个特定的推荐方式来设置它们,使其保持安全,实际上工作? 除了closuresPaX,就是。

我也一直在努力。 以您的出色解释为灵感,我能够从Docker容器中设置扩展属性。

在容器中运行的基本命令是:

setfattr -n user.pax.flags -v "emr" /container's/path/to/binary 

请注意,docker容器本身将需要安装attr软件包。 如果您自己构build容器,则可以将上述命令安装并运行为RUN命令。 下面是一个扩展python官方图像的例子:

 FROM python:3-slim RUN apt-get update && apt-get install -y attr RUN setfattr -n user.pax.flags -v "emr" /usr/local/bin/python3.5 RUN setfattr -n user.pax.flags -v "emr" /usr/local/bin/pip 

如果没有,那么你可以使用docker exec container_name /bin/bash进入正在运行的容器,并手动执行上述命令。