在this blog article中,我在评论中找到了以下引文:
Ben Firshman
是的 - 你是对的我应该指出Docker套接字的安全问题。这是目前生产中实用的主要阻碍因素,我们一定会寻求帮助,使其更好地运作,正如您在待办事项列表中所注意到的那样。
虽然我确信这对许多人来说是有意义的,但对于我们其他人来说,有人可以用明确的术语来解释这个"安全问题"是什么?我认为它指的是:
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
docker-compose文件中的。那是对的吗?如何被利用?这是否有效地禁止了生产使用的这种方法?如果是,是否有解决方法?
答案 0 :(得分:15)
对于我们其他人来说,有人可以用明确的术语解释这个"安全问题"是
docker /var/run/docker.sock
的所有者是运行容器的主机的root
,其默认组成员身份为docker
组。这就是为什么在另一个容器中加载var/run/docker.sock
会为您提供root权限的原因,因为现在您可以对root
组成员身份为docker
的用户执行任何操作。
这是否有效禁止此方法用于生产?如果是,是否有解决方法?
对于解决方法,这些帖子可能会有所帮助:https://integratedcode.us/2016/04/08/user-namespaces-sharing-the-docker-unix-socket/和https://integratedcode.us/2016/04/20/sharing-the-docker-unix-socket-with-unprivileged-containers-redux/
退一步后,了解需要挂载var/run/docker.sock
的用例并查看是否有其他方法来满足用例会很有用。遗憾的是,如果没有问题中的用例描述,很难提供避免安装unix插槽的替代方案。
祝你好运,并且为了做正确的事而感到荣幸!
答案 1 :(得分:2)
任何可以写入dockerd套接字的进程也有效地在主机上具有root访问权限... 那么,你能否在生产中使用它取决于你。
答案 2 :(得分:1)
已接受的答案提供了很好的解释,因此,我不会重复任何有关您装入root
拥有的文件这一事实的详细信息。
也许下面的示例对某些读者而言是微不足道的,但我很惊讶没有人提及它。
请记住您可以访问主机上非常特殊的文件-docker.sock
。
因此,如果您在容器中安装Docker:
apt-get update
apt-get install docker.io -y
或者作为容器创建的一线工具:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:latest sh -c "apt-get update ; apt-get install docker.io -y ; bash"
(在容器中用docker ps
检查是否看到主机上正在运行其他容器)。
现在,您可以完全控制主机中的其他容器。