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

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

我有以下容器设置。

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

  1. 主 Docker 守护进程运行我的应用程序容器,向外界公开 80/443。
  2. 插件 Docker Daemon运行客户提供的一些容器,通过 80/443 与我的应用程序通信。

我想让客户访问插件 Docker Daemon这样客户就可以部署/启动/停止自己的容器。客户只能访问 API,而不能访问主机 (SSH)。

我目前面临的问题是,如果客户运行的容器执行了一些不安全的操作docker run -v /:/host/root Ubuntu rm -rf /host/root,该怎么办?

我的问题是我能做些什么来防止插件 Docker Daemon从挂载根目录/或任何其他目录之外/home/user/

  • 是否有一个选项可以启动 Docker Daemon /home/user/
  • 我可以使用一些 LSM(Linux 安全模块 SELinux/Apparmor)魔法来阻止 docker 守护进程挂载除用户主目录或 var/docker/libs 之外的部分或全部主机路径吗?
  • --userns-remap幫助我達到我的目標嗎?
  • 除了虚拟机之外还有其他可用选项吗?

服务器完全属于单个客户。因此,安全或数据泄露不是我的主要关注点。我真正想防止的是插件守护进程正在做一些愚蠢的事情,这会影响我在主 Docker 守护进程。我希望保持精益并坚持使用 docker 唯一的工作流程,并且不会为创建 VM 设置额外的工作流程。

答案1

SELinux 将阻止任何未正确标记的内容作为卷挂载到 docker 容器内,作为证明,这里使用单个文件,相同的策略适用于目录:

$ 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

并且将记录 AVC 拒绝:

$ 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)。

相关内容