【问题标题】:Are there known security risks in running docker with user namespace disabled?在禁用用户命名空间的情况下运行 docker 是否存在已知的安全风险?
【发布时间】:2014-01-23 05:29:56
【问题描述】:

我一直在使用 DigitalOcean 的 Dokku 映像在 Ubuntu 中使用 Docker。一切似乎都很好。只是检查docker的安装是如何完成的,我发现lxc-checkconfig报告User namespace: Disabled

This tutorial说明这是因为内核不是用CONFIG_USER_NS=y编译的所以可以通过重新编译来实现。

由于一切正常,我想知道我是否缺少有关此用户命名空间的某些东西,例如,安全优势。

那么,为什么要通过启用用户命名空间来添加功能?如果我一直禁用它会有什么风险或已知问题?

【问题讨论】:

    标签: ubuntu-12.04 virtualization docker lxc


    【解决方案1】:

    答案是:没有用户命名空间存在潜在风险。我从这个article on LXC on Ubuntu推断出这个:

    特权

    容器管理工具必须以 root 用户运行 特权。编写了一个名为 lxc-setup 的实用程序 为工具提供所需的文件功能以允许 非 root 用户以足够的权限运行工具。然而,作为 容器中的根还不能被可靠地包含,这不是 值得。因此建议不要使用 lxc-setup,并且 为 LXC 管理员提供所需的 sudo 权限。

    > 用户命名空间,预计下个 Long 可用 期限支持 (LTS) 版本,将允许容器的遏制 root 用户,以及减少所需的权限数量 创建和管理容器。

    我并不完全清楚确切风险的答案,但现在您知道在 ubuntu 的下一个 LTS(我认为 14.04 将于 2014 年 4 月推出)中拥有用户命名空间会带来好处。

    非常感谢任何可以改进答案的额外信息。

    【讨论】:

      【解决方案2】:

      从 0.7.3 开始,Docker 还没有使用用户命名空间。因此,从安全角度来看,启用它不会改变任何事情。

      一旦用户命名空间代码(以及相关的用户空间工具)稳定,Docker 将使用它来提供额外的安全性。

      如您引用的文档所示,用户命名空间将允许“包含容器根用户”。这意味着 容器内 的 root 用户不一定会映射到 容器外 的 root 用户(即在主机上)。这样,一个进程可以在容器中以 root 身份运行,但实际上被映射到外部的普通(非特权)用户。

      未来,用户命名空间可能还允许启动容器而不需要主机上的 root 权限;但这需要一段时间,因为容器设置中的许多步骤都需要这些权限(例如设置网络)。

      【讨论】:

      • 听起来很棒!这也会解决github.com/dotcloud/docker/issues/3124 吗?
      • 这会有所帮助,因为这意味着可以映射 UID。所以如果用户在主机上是101,在容器里是1000,就可以透明地映射他们。
      【解决方案3】:

      如“User namespaces have arrived in Docker!”(Phil EstesESTESP)中详述,此will be available in the experimental branch of docker 1.9(2014 年 11 月)。 PR 12648.

      用户命名空间的最重要的特性之一是它允许容器对 uid 和 gid 范围有与主机系统不同的视图。
      具体来说,可以为一个进程(在我们的例子中,我们容器内的进程)提供一组来自主机 uid 和 gid 空间的映射,这样当进程认为它以 uid 0 运行时(通常称为“root”),它实际上可能以 uid 1000、10000 甚至 34934322 运行。这完全取决于我们在用户命名空间内创建进程时提供的映射。

      当然,应该清楚的是,从安全角度来看,这是一个很棒的功能,因为它允许我们的容器以 root 权限继续运行,但实际上在主机上没有任何 root 权限

      在“Experimental: User namespace support”文档页面上查看更多信息(对于experimental docker build,来自experimental.docker.com)。

      docker daemon --userns-remap=default
      

      请注意,在运行启用了实验性用户命名空间的 Docker 守护程序时,某些标准 Docker 功能目前不兼容,例如与主机(--pid=host--net=host 等)或与其他容器共享命名空间。

      这种用户映射能力目前是针对每个守护进程,而不是针对每个容器(这需要进行 Linux 内核演进,但不是)。 与主机共享命名空间(--pid=host、--net=host 等)

      最后:

      由于需要通过提供的映射来隔离 Docker 守护进程的层数据本地缓存中的内容,一旦您使用带有用户命名空间的实验性构建,图形目录的根目录(默认为/var/lib/docker)将具有与重新映射的根 uid 和 gid 相关的额外间接级别

      例如,如果我提供给 --userns-remap 标志的重映射用户具有以 ID 10000 开头的下级用户和组范围,那么使用该重映射设置运行的所有图像和容器的图形目录的根目录将居住在/var/lib/docker/10000.10000
      如果您使用实验版本但不提供用户命名空间重新映射,您当前的内容将迁移到 /var/lib/docker/0.0 以区别于重新映射的图层内容。

      【讨论】:

        猜你喜欢
        • 2017-05-04
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多