Docker和PaX主机

时间:2016-02-24 01:37:47

标签: docker linux-kernel pax

我花了最后几天一直在试图让Docker容器在Gentoo Hardened上正确运行。

我花了几天时间才发现的第一个问题是我自己的偏执狂:我把Docker root放入的分区是用nosuid和noexec挂载的。因此,devicemapper驱动程序对它进行了处理,因为它创建了许多循环设备来执行它的操作,但覆盖驱动程序没有,因为它从顶部继承了noexec标志,因此容器中的可执行文件不会运行。我会把这段知识留给有人在这里发现......

然而,除此之外,我绊倒了另一个问题:PaX标志。

PaX强制要求创建包含代码的新内存页的可执行文件标记有特殊的ELF标头或扩展文件系统属性,最好是两者,因为Gentoo的推荐设置是使用扩展属性并忽略ELF标头。不遵守规定的可执行文件在他们尝试的那一刻就会被杀死。

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

更不幸的是,尽管docker图像应该能够包含扩展属性标记的文件,但是需要这些标记的常见软件的官方图像 - 特别是mongodb和nodejs - 似乎都没有。

目前,我一直在通过在磁盘上找到实际文件并从容器外部设置其xattr来解决问题。这显然是个坏主意。

解决这个问题的正确方法是什么,就此而言,有没有其他人似乎有这个问题,因为大量的谷歌搜索似乎表明了这一点?或许,我错过了另一个内核选项,(我倾向于这么做)或者特定的推荐方式来设置它们以便它保持安全并且实际上有效吗?除了关闭PaX之外,就是这样。

1 个答案:

答案 0 :(得分:1)

我也一直在努力解决这个问题。以您出色的解释为灵感,我能够在有问题的docker容器中设置扩展属性。

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

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

请注意,docker容器本身需要安装attr包。如果您自己构建容器,则可以以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输入正在运行的容器,并手动执行上述命令。