Docker和PaX主机

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

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

然而,随着这一切,我绊倒了另一个问题:PaX标志.

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

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

更不幸的是,即使码头图像应该能够包含由扩展属性标记的文件,但是需要这些标志的普通软件的官方图像 – 特别是mongodb和nodejs – 似乎都没有.

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

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

最佳答案 我一直在努力解决这个问题.以您出色的解释为灵感,我能够在有问题的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输入正在运行的容器,并手动执行上述命令.

点赞