如何禁止Docker守护进程将主机的根文件系统挂载到容器中

我有以下容器安装程序。

在裸机服务器上有两个Docker Daemon安装并运行。

  1. 主Docker Daemon运行我的应用程序容器,暴露80/443到外面的世界。
  2. 插件Docker Daemon运行客户提供的一些容器,通过80/443与我的应用程序进行通信。

我想让客户访问插件Docker守护程序的API(2376),以便客户可以部署/启动/停止自己的容器。 客户只能访问API,而不能访问主机(SSH)。

我目前面临的问题是,如果客户运行一个容器,如docker run -v /:/host/root ubuntu rm -rf /host/root ,那该怎么办?

我的问题是我能做些什么来防止插件Docker守护进程挂载root //home/user/之外的任何其他目录,

  • /home/user/启动Docker Daemon是否是一个选项?
  • 我可以使用一些LSM(Linux安全模块SELinux / Apparmor)魔术来防止docker守护进程挂载除home用户或var / docker / libs之外的部分或全部主机path吗?
  • 可以--userns-remap帮助我实现我的目标吗?
  • 除虚拟机之外,还有其他选项吗?

服务器完全属于单个客户。 所以安全或数据泄漏并不是我最关心的问题。 我真正想要阻止的是Plugin Daemon中的某个人正在做一些愚蠢的事情,这会影响在Docker Daemon中运行的容器。 我想保持精益,坚持docker工作的唯一工作stream程,不会为虚拟机创build设置额外的工作stream程。

SELinux将防止任何未正确标记的东西作为一个容器被安装在docker容器中,作为certificate,在这里使用单个文件,相同的策略适用于目录:

 $ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 30 

使用示例文件:

 $ cat sample_script.sh echo 'Hello, world' 

其默认的安全上下文是:

 $ ls -lrtZ sample_script.sh -rw-------. 1 david david unconfined_u:object_r:user_home_t:s0 20 Oct 3 17:18 sample_script.sh 

试图在容器中使用此文件失败,如预期的那样:

 $ docker run -v /home/david/sample_script.sh:/sample_script.sh --rm ubuntu bash sample_script.sh bash: sample_script.sh: Permission denied 

并且会loggingAVC拒绝:

 $ sudo ausearch -m avc -ts recent time->Mon Oct 3 17:39:28 2016 type=AVC msg=audit(1475512768.444:784): avc: denied { read } for pid=28720 comm="bash" name="sample_script.sh" dev="dm-13" ino=101062112 scontext=system_u:system_r:svirt_lxc_net_t:s0:c457,c992 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0 

在将安全上下文更改为一个Docker后,可以使用:

 $ sudo chcon -Rt svirt_sandbox_file_t sample_script.sh $ ls -lrtZ sample_script.sh -rw-------. 1 david david unconfined_u:object_r:svirt_sandbox_file_t:s0 20 Oct 3 17:18 sample_script.sh 

容器现在可以访问该文件:

 $ docker run -v /home/david/sample_script.sh:/sample_script.sh --rm ubuntu bash sample_script.sh Hello, world 

有关Docker和SELinux的更多信息,请参阅官方的Red Hat文档和Dan Walsh 撰写的本文 。

好,所以你停下来也许这个例子。 但似乎这个例子仍然有效: http : //reventlov.com/advisories/using-the-docker-command-to-root-the-host

而且因为你得到了一个root shell的将军。