【从零造容器】User Namespace 与 Rootless 容器:不需要 root 也能跑

💡 原文中文,约5900字,阅读约需14分钟。
📝

内容提要

本文介绍了用户命名空间在无权限容器中的应用。通过创建用户命名空间,普通用户可以在自己的命名空间内获得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和绑定低端口。

用户命名空间的安全性如何?

用户命名空间的安全性受到关注,存在一些漏洞可能导致非特权用户访问更多的内核攻击面。

➡️

继续阅读