【从零造容器】User Namespace 与 Rootless 容器:不需要 root 也能跑
内容提要
本文介绍了用户命名空间在无权限容器中的应用。通过创建用户命名空间,普通用户可以在自己的命名空间内获得root权限,而在宿主机上仍为普通用户。文章详细讲解了UID/GID映射的设置、newuidmap工具的使用以及Podman的实现架构。同时,讨论了无权限容器在网络、端口绑定和OverlayFS等方面的限制及安全性问题。
关键要点
-
用户命名空间允许普通用户在自己的命名空间内获得root权限,而在宿主机上仍为普通用户。
-
创建用户命名空间需要使用CLONE_NEWUSER标志,普通用户可以通过unshare(CLONE_NEWUSER)来创建。
-
UID/GID映射通过写入/proc/PID/uid_map和/proc/PID/gid_map来实现,使容器内的进程看到自己是root。
-
newuidmap工具用于映射多个UID,允许容器内运行多个用户。
-
rootless容器在网络、端口绑定和OverlayFS等方面存在限制,无法创建veth pair和绑定低端口。
-
Podman是rootless容器的标杆实现,支持创建用户命名空间和其他命名空间。
-
用户命名空间的安全性受到关注,存在一些漏洞可能导致非特权用户访问更多的内核攻击面。
-
在实现rootless支持时,需要先创建用户命名空间并设置UID/GID映射,网络和存储需要单独处理。
延伸解读
用户命名空间的优势与应用
用户命名空间允许普通用户在不需要root权限的情况下创建和管理容器,这为开发者和运维人员提供了更大的灵活性。通过这种机制,用户可以在自己的命名空间内获得root权限,降低了对系统安全的风险,同时也简化了容器的管理流程。
无权限容器的局限性
尽管无权限容器提供了便利,但在网络、端口绑定和文件系统等方面存在显著限制。例如,无法绑定低端口和创建veth pair,这可能影响某些应用的部署和性能。因此,在选择使用无权限容器时,需仔细评估其适用场景。
安全性考量
用户命名空间虽然设计为安全的隔离机制,但历史上出现的多个漏洞表明,非特权用户仍可能接触到内核的攻击面。这使得某些发行版选择禁用或限制用户命名空间的使用,用户在使用时需关注安全配置,确保系统的整体安全性。
延伸问答
用户命名空间是什么?
用户命名空间允许普通用户在自己的命名空间内获得root权限,而在宿主机上仍为普通用户。
如何创建用户命名空间?
创建用户命名空间需要使用CLONE_NEWUSER标志,普通用户可以通过unshare(CLONE_NEWUSER)来创建。
UID/GID映射是如何实现的?
UID/GID映射通过写入/proc/PID/uid_map和/proc/PID/gid_map来实现,使容器内的进程看到自己是root。
Podman在rootless容器中的作用是什么?
Podman是rootless容器的标杆实现,支持创建用户命名空间和其他命名空间。
无权限容器有哪些限制?
无权限容器在网络、端口绑定和OverlayFS等方面存在限制,无法创建veth pair和绑定低端口。
用户命名空间的安全性如何?
用户命名空间的安全性受到关注,存在一些漏洞可能导致非特权用户访问更多的内核攻击面。