Alice 和 Bob 已被授予对主机的虚拟根访问权限docker
group.
The docker
组通过套接字文件授予他们访问 Docker API 的权限。目前 Docker 中没有任何工具可以区分 Docker API 的用户。 Docker 守护进程以 root 身份运行,并且凭借 Docker API 允许的功能,Alice 和 Bob 将能够解决您尝试设置的任何障碍。
用户命名空间
使用用户命名空间隔离停止用户inside容器以特权或不同用户身份脱离容器,因此实际上容器进程现在以非特权用户身份运行。
一个例子是
- Alice 被授予对在namespace_a 中运行的容器A 的ssh 访问权限。
- Bob 被授予对namespace_b 中容器B 的ssh 访问权限。
由于用户现在仅位于容器内,因此他们将无法修改主机上彼此的文件。假设如果两个容器映射相同的主机卷,则没有全局读/写/执行的文件将不会受到其他容器的影响。由于他们无法控制守护进程,所以他们无法采取任何行动来突破。
Docker 守护进程
命名空间并不保护 Docker 守护进程和 API 本身,这仍然是一个特权进程。围绕用户名称空间的第一种方法是在命令行上设置主机名称空间:
docker run --privileged --userns=host busybox fdisk -l
The docker exec
, docker cp
and docker export
命令将向有权访问 Docker API 的人员提供任何已创建容器的内容。
限制 Docker 访问
可以限制对 API 的访问,但不能让用户在docker
group.
允许有限的一组docker
命令通过sudo
或提供sudo
访问对 docker 参数进行硬编码的脚本:
#!/bin/sh
docker run --userns=whom image command
对于自动化系统,可以通过附加的 shim API 提供访问权限,并在 Docker API 前面进行适当的访问控制,然后将“受控”请求传递给 Docker。dockerode or docker-py可以轻松插入 REST 服务并与 Docker 交互。