我有以下容器设置。
在裸机服务器上安装并运行了两个 Docker 守护程序。
- Main Docker Daemon运行我的应用程序容器,将 80/443 暴露给外界。
- Plugin Docker Daemon运行客户提供的一些容器,这些容器通过 80/443 与我的应用程序通信。
我想让客户访问Plugin Docker Daemon的 API (2376),以便客户可以部署/启动/停止自己的容器。客户只能访问 API 而不能访问主机 (SSH)。
我目前面临的问题是,如果客户运行的容器执行不安全的操作,例如docker run -v /:/host/root Ubuntu rm -rf /host/root
.
我的问题是如何防止Plugin Docker Daemon在外部挂载根目录/
或任何其他目录/home/user/
,
- 是否可以选择启动 Docker 守护进程
/home/user/
? - 我可以使用一些 LSM(Linux 安全模块 SELinux/Apparmor)魔法来阻止 docker 守护进程挂载除用户 home 或 var/docker/libs 之外的部分或所有主机路径吗?
- 可以
--userns-remap
帮助我实现我的目标吗? - 除了虚拟机,它们还有其他可用的选项吗?
服务器完全属于单个客户。所以安全或数据泄露不是我最关心的问题。我真正想要防止的是Plugin Daemon中的某个人正在做一些愚蠢的事情,这会影响我在Main Docker Daemon中运行的容器。我想保持精简并坚持仅使用 docker 的工作流程,并且不会为 VM 创建设置额外的工作流程。
SELinux 将阻止任何未正确标记的内容作为卷安装在 docker 容器内,作为证明,这里使用单个文件,相同的策略适用于目录:
使用示例文件:
它的默认安全上下文是:
尝试在容器内使用此文件按预期失败:
并且将记录 AVC 拒绝:
将安全上下文更改为一个 Docker 后,可以使用:
容器现在可以访问该文件:
有关 Docker 和 SELinux 的更多信息,请参阅Red Hat 官方文档和Dan Walsh 的这篇文章。