4

在过去的几天里,我一直在试图让 docker 容器在 Gentoo Hardened 上正确运行。

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

然而,在解决这个问题后,我又遇到了另一个问题:PaX 标志。

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

不幸的是,必须尝试的程序列表包括 nodejs、python 和几乎所有其他现代解释器,更不用说 mongodb。可能还有其他问题可执行文件,但这些是罪魁祸首,也是您经常希望在容器中看到的东西。

更不幸的是,即使 docker 映像应该能够包含由扩展属性标记的文件,但需要此类标志的通用软件的官方映像(尤其是 mongodb 和 nodejs)似乎都没有这些。

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

解决这个问题的正确方法是什么?就此而言,是否有其他人似乎没有这个问题的特殊原因,正如大量谷歌搜索所表明的那样?是否有我错过的另一个内核选项(我经常这样做)或设置它们的特定推荐方法,以便它保持安全并实际工作?除了关闭 PaX,就是这样。

4

1 回答 1

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并手动执行上述命令。

于 2016-08-16T18:13:52.883 回答