作为非root用户在Docker容器中运行不可信代码的潜在安全问题是什么?

到目前为止,我已经看到大量的墨水泄漏了,关于Docker如何没有被隔离到允许任意容器在多租户环境中运行,这是有道理的。 “如果它在Docker的根目录下,请考虑它在主机中的根目录。” 那么非root的呢?

如果我想取一些不可信的代码并在一个容器中运行它,只要容器以非root用户的非sudo用户身份运行,是否可以安全地执行它? 做这样的事情有什么潜在的安全隐患?

我相当确定今天有这样的生产应用程序(CI系统,可运行的pastebins),但他们只是幸运的没有一个确定的攻击者,或者这是一个生产系统的合理的事情?

从Docker v1.12开始,如果在启用了用户命名空间的情况下将容器作为非root用户运行,则恶意参与者需要执行两级权限升级才能成为主机上的root用户:

  1. 在容器内从非root用户升级到root用户
  2. 将容器中的root用户升级到主机上的root用户

所以如果不信任的代码是以非root用户身份在Docker容器内部运行的话,攻击者在主机上成为root会稍微困难一些,因为我们在容器内增加了一个额外的步骤。 与使用root权限运行容器相比,这是安全性方面的唯一优势。

如果通过两层安全性进行特权升级,则应该有助于限制攻击面:

  1. 在不同信任级别上的工作负载(更具体地说是Docker容器,在这种情况下)应该通过使用遵循最小权限原则的覆盖networking来相互隔离。
  2. 在强制模式下启用可用的Linux安全模块(例如SELinux,AppArmor)

参考文献:

  • 在容器内使用非root权限运行: https : //groups.google.com/forum/#!msg/docker -user/e9RkC4y-21E/JOZF8H- PfYsJ
  • 覆盖networking: https : //docs.docker.com/engine/userguide/networking/get-started-overlay/
  • 用户名空间: https : //docs.docker.com/engine/security/security/#/other-kernel-security-features

所有容器共享相同的内核。 如果您的不受信任的代码pipe理执行内核利用,它可以在主机和/或任何其他正在运行的容器上做任何事情。