What's Next for Containers ? User Namespaces

er74 9年前

原文 http://dockone.io/article/530


【编者的话】本文翻译自Red Hat官方博客,文中从namespace介绍起,并介绍namespace对容器的帮助,其后,介绍了namespace使用不当的后果,以及 namespace自身缺陷,并在最后解释了为什么Red Hat不在企业产品中使用namespace的原因。

什么是用户命名空间呢? 继续 apartment complex 的类比,过去,用户和组的编号在每个容器和底层主机一直是相同的,就像公共频道10在一栋公寓楼的每个单元上通常是一样的。

但想象一下,如果不同公寓的人们从不同的有线和卫星电视公司接收电视信号,频道10对每个人来说就是不一样的。对某人来说可能是体育,而对其他人来说则是新闻。

在旧的linux内核中(linux内核版本3.8以前),有一个单一数据结构,这是用来保存用户和群组。从内核版本3.8开始,用户命名是不可变的。用户可以通过一个CLONE_NEWUSER标记,使用clone()系统调用,这样做之后,一个分离的用户命名空间就创建好了。你可以把这些作为新命名空间内的嵌套数据结构。在这个新的命名空间中,有一个用户和组的虚拟设置。这些以uid/gid 0开头的用户和组,会映射到命名空间外一个非信任的(非root)uid/gid。

在现代linux内核中,管理员可以创建大约40亿的用户,具体来说是4,294,967,294(无符号32位整数)。40亿用户可以被映射到每个用户命名空间中,这为管理员提供了充足的可伸缩性。

useradd -u 4294967294 testuser

你可以自己尝试4294967295...

用户命名空间与容器

有了一个用户命名空间,不同的容器就可以有完全不同的用户(uid)和群组(gid)编号。容器A中的用户500可以映射到容器外用户1500,容器B中的用户500则可以映射到容器外用户2500.

那我为什么做这些呢?因为对某一容器内的root访问,这是特别有用的。想象一下,容器A中的root用户(uid 0)映射到容器外用户uid 1000,容器B中的root用户映射到容器外用户uid 2000。和网络端口映射相似,管理员可以在容器内分配给用户uid 0(root),而不用在底层主机分配给用户uid 0。同时,在容器内,这也允许一个用户自由地增加或删除用户。

第一次听到这些,可能觉得不错,但还有后话。回到apartment complex analogy,想象一下,每个租户可以定制他们电力和自来水管道。每一个人都是他们自己的微型主管人。如果一个用户在给他们的公寓接电源时,没有使用适当的标准线路,这将给其他租户造成危害。

完成工作

检查一下内核提交日志,用户命名空间是在内核版本3.8添加的,Red Hat Enterprise Linux 7使用的是内核3.10,但命名空间在Red Hat Enterprise Linux 7.1无法工作,出什么事了呢?通过Fedora Project,广大Linux社区和内部,Red Hat可以和用户命名空间一起正常工作很长一段时间了,我们将其视为一个重要的功能,并鼓励容器采用这项功能。但Red Hat现在禁用这些,因为我们认为用户命名空间需要在上游社区孵化更长时间,才能让用户充分理解安全影响,以及如何减轻或补救任何漏洞或攻击,这些漏洞或攻击向量可能会将我们的用户暴露给恶意活动。

新技术通常是不安全的,无论何时,一个常规用户在容器内被分配为root,就有可能在容器外逐步升级为root。因此,当我们把用户命名空间作为企业组合内部功能时,只有拥有root权限的用户可以创建它们。在限制可能暴露给新的攻击向量时,阻止非信任用户利用用户命名空间是很重要的。这是一个有目的的,战略的,以及社区主导的方法,这个方法可以让用户安全地对用户命名空间施加杠杆效应。Red Hat相信,在命名空间可以被非root用户在企业产品,如Red Hat Enterprise Linux,全面地施加杠杆作用之前,社区还有很多工作需要完成。

在所有的Red Hat企业产品中,包括专注于Linux容器的解决方案,如Red Hat Enterprise Linux Atomic Host and OpenShift Enterprise 3,我们不会允许这些功能(无论是否在内核中),直到我们确定这些功能已经适合在企业中使用。在命名空间中的案例中,它们并不适合企业使用。作为致力于尖端Linux技术项目和企业硬件化过程的重要组成部分,上游的Fedora社区已经在最新的 Fedora Cloud, Fedora Server和Fedora Workstation允许这项特色。这提供了一个极好的测试平台,用来检验这项特色在实践中的表现,以及让社区对这项特色有持续性创新。

Red Hat Enterprise Linux的目标,以及其所有专业产品是为用户在部署应用时,提供一个稳定,安全,并容易管理的操作环境。Red Hat只允许root用户使用命名空间的方式,是高标准(我们为产品安全所设置的)的反映。软件正在迅速改变,但在特色功能和安全之间有一个持久的斗争,Red Hat正在努力推动这两者前进。

原文链接: What's Next for Containers ? User Namespaces (翻译:洪国安 审校:)