我有以下容器设置。
在裸机服务器上安装并运行两个 Docker Daemons。
- 主 Docker 守护进程运行我的应用程序容器,向外界公开 80/443。
- 插件 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)。