无根容器
无根容器与常规容器相同,区别在于它们不需要root即可形成。无根容器仍处于早期阶段,无根容器出现的原因有很多。
添加新的安全层。如果容器运行时受到攻击,攻击者将无法获得主机的root特权。
允许多个非特权用户在同一台计算机上运行容器。
允许隔离嵌套容器。
Linux内核的一项新开发使此方案成为可能,允许无特权的用户创建新的用户空间。当用户创建并输入新的用户空间时,他将成为该空间的root用户,并获得生成容器所需的大多数特权。
网络连接
为了允许容器联网,通常创建虚拟以太网设备(VETH)负责联网。但只有root才有权创建此类设备,主要的解决方案是Slirp和LXC-user-nic。
(1)Slirp
Slirp最初被设计为面向非特权用户的Internet连接。随着时间的流逝,它成为虚拟机和仿真器(包括著名的QEMU)的网络堆栈,可对其修改调整以启用无根容器中网络连接。它把容器用户和网络名称空间分开并创默认路由设备。然后,它将设备的文件传递给默认网络名称空间的父级,使其可以与容器和Internet进行通信。
(2)LXC-User-Nic
另一种方法是运行setuid创建VETH设备。尽管它可以启用容器内的联网功能,但是它会要求容器文件以root权限运行。
存储管理
容器的复杂元素之一是存储管理。默认情况下,容器使用Overlay2(或Overlay)创建文件系统,但是无根容器不能做到这一点,大多数Linux不允许在用户名称空间中安装overlay文件系统。解决方案是使用其他驱动程序,例如VFS存储驱动程序。虽然有效但效率低。更好的解决方案是创建新的存储驱动程序,适应无根容器的需求。
兼容状态
以下容器引擎支持以下组件无根容器:
安全分析
从安全角度来看,无根容器中的漏洞还是配置错误都会导致容器中软件受到破坏,应该始终以有限特权运行软件,当漏洞产生时,影响将降至最低。LXE-user-nic具有多个漏洞,攻击者可利用漏洞提权,例如CVE-2017-5985和CVE-2018-6556。Slirp近年来也披露了多个漏洞。
Slirp–CVE-2020-1983:
在对该软件进行模糊测试时,发现了一个可能导致Slirp崩溃的漏洞。该漏洞分配编号为CVE-2020-1983。
这个问题与Slirp如何管理IP碎片有关。IP数据包的最大大小为65,535字节,错误是Slirp无法验证分段IP数据包的大小,当它对大于65,535的数据包进行分段时就会会崩溃。
libslirp中的其他漏洞可在容器上执行代码,甚至可从容器逃逸到主机以及其他容器。2020年发现了两个此类漏洞:CVE-2020-8608和CVE-2020-7039,受影响的Slirp版本是4.0.0至4.2.0。
总结
无根容器提供了一种新的容器解决方案,该方法增加了安全层。它会成为云容器中的下一个演变方向。虽然无根容器仍然存在许多局限性,其功能仍处于试验开发中,随着时间和技术的发展,无根容器可以完全发挥作用并代替传统容器。