Docker 作为 root 用户运行的安全性

27
一篇Docker 博客文章指出:

Docker容器默认情况下非常安全,特别是如果您将进程作为非特权用户(即非root用户)在容器内运行时。

那么,如果我在docker下以root用户身份运行,会有什么安全问题呢?我的意思是,如果我像非特权用户一样小心处理我的进程,那么它就很安全,那么作为根用户在容器中对主机有何危害呢?我只是想了解它,如果作为root运行不安全,如何隔离它?哪些系统调用可能会暴露主机系统呢?
2个回答

25

当你以root身份运行时,可以访问更广泛的内核服务。例如,您可以:

  • 操作网络接口、路由表、netfilter规则;
  • 创建原始套接字(一般来说,“异类”套接字,使用的代码比老式TCP和UDP少得多);
  • 挂载/卸载/重新挂载文件系统;
  • 更改文件所有权、权限、扩展属性,覆盖常规权限(即使用略微不同的代码路径);
  • 等等。

(有趣的是,所有这些示例都受到capabilities的保护。)

关键点在于,作为root用户,您可以执行更多的内核代码;如果该代码存在漏洞,则可以作为root触发它,而不是作为普通用户。

此外,如果有人找到了一种方法来跳出容器,如果您以root身份跳出,您可以造成比作为普通用户更多的损害,显然。


当您运行的Docker使用非root用户执行任意操作时,您几乎可以保证安全。 - Mustafa
1
我想在容器中获得root访问权限,但要确保它不能破坏主机系统。这使得实现单应用程序单容器的理念更加容易。 - CMCDragonkai
1
关于跳出容器的最后一句话有点误导性。如果您可以跳出容器,无论您在容器内是谁,您都会以LXC进程本身在主机操作系统上运行的身份跳出。这通常是root用户。尽管如此,将容器进程作为非特权用户运行仍然是一个好主意,因为这使得跳出容器变得更加困难(至少在理论上是这样)。 - nateware
1
我觉得人们不太考虑在容器中如果你是root用户可以做什么。我利用了你的应用程序,也许我不能越狱,但是容器中的所有内容都属于我。你会花多久时间才能注意到有人更新了你的运行容器?特别是因为你可能没有像tripwire这样的东西安装在里面,因为那是一个容器... - xenoterracide

7

您可以通过在docker中向/proc/sysrq-trigger回显来重新启动主机。在docker中以root身份运行的进程可以执行此操作。

这似乎是不以root身份在docker中运行进程的非常好的理由;)


9
我收到了 bash: /proc/sysrq-trigger: Read-only file system 的错误信息。 - Vincent Robert
8
嗯... 经过两年后,他们终于修复了一些东西? - wrzasa

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