【从零造容器】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权限,而在宿主机上仍为普通用户。
如何创建用户命名空间?
创建用户命名空间需要使用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和绑定低端口。
用户命名空间的安全性如何?
用户命名空间的安全性受到关注,存在一些漏洞可能导致非特权用户访问更多的内核攻击面。