如何在不影响主机的情况下构建任意 Dockerfile 映像

信息安全 linux centos selinux 码头工人
2021-09-09 06:23:01

我正在构建一个服务器,它将直接从 Dockerfile 构建图像:

docker build -t arbitrarydocker .

此 docker 文件将与其他客户端 Dockerfile 构建在同一台服务器上,这些 Dockerfile 可能包含机密。如何锁定执行过程,docker build -t arbitrarydocker .使其不执行以下操作:

ADD /contents/of/host/secrets ./space/in/hacker/docker/container

我能想到的最好的方法是分叉该进程并使用一个编造的用户运行它,该用户对只有一个文件夹的目录访问权限有限,而该文件夹自己的机密以有限的功能保存。还想知道是否有办法在构建 dockerfile 后完全清除内存,以免数据泄漏到下一个客户端构建。

如果安全地做到这一点的唯一方法是每个客户端都有一个专用的构建服务器,那么我可以这样做,但我想避免它。

所有构建都在 Centos 上完成。

2个回答

我将在此处陈述显而易见的内容,并说“不要在您的构建器 VM 中包含 /contents/of/host/secrets”。不过,据推测,您正在发生一些事情,这使得显而易见的答案不太明显正确。

因此,让我们回到另一个明显的问题,并指出“任意 Docker 构建”实际上是“任意代码执行”,因为 Docker 构建过程是命令式的(不是声明性的),并且让您的 dockerfile 执行诸如下载和执行任意在 Docker 构建世界中,互联网上的代码完全是一件事。

换句话说,整个 Docker 构建过程都可能是恶意的,因此您应该从沙盒攻击者提供的代码的角度来考虑它。您需要在构建器(攻击者)的运行时环境和几乎所有其他东西之间建立一个强大的安全边界。您听说 docker 容器不是安全边界,但攻击者控制的 docker 容器甚至不假装是安全边界。builder 需要在自己的 VM 中运行,它与您自己的系统之间的所有访问都需要通过定义良好的通信渠道进行调解;没有后门访问。

考虑到这一点,让我们再回想一下/contents/of/host/secretsdocker 构建在构建器 VM 上运行。VM 被隔离是因为您不信任它,并且它无法访问您未有意与攻击者共享的机密。有你明智的解决方案。

对于清理:只需删除 VM。从您的“原始”高清图像重新启动它。

由于您发明的轮子之前已经被发明过很多次,我建议您查看现有的解决方案,了解它们如何解决您遇到的问题。

您可以从非特权容器中构建图像,这也将增加一些保护,以防止对主机的其他威胁(例如任意命令执行)。Kaniko就是一个可以做到这一点的工具的例子。