如果我使用创建 uts 命名空间unshare
并将主机名设置为foo
,
$ unshare --map-root-user --uts /bin/sh
# echo $$
31882
# readlink /proc/31882/ns/uts
uts:[4026532825]
# hostname foo
然后我如何在 rootless 内部使用该用户命名空间podman
而不运行sudo
,例如这不起作用并返回“错误:找不到指定的 UTS 命名空间路径:stat [proc-ns-link]:权限被拒绝”
$ podman run -ti --uts=ns:/proc/31882/ns/uts alpine:3 /bin/hostname
Error: cannot find specified UTS namespace path: stat /proc/31882/ns/uts: permission denied
但这确实有效,
$ sudo podman run -ti --uts=ns:/proc/31882/ns/uts alpine:3 /bin/hostname
foo
答案1
我不熟悉,podman
但如果有人需要使用进入另一个命名空间,/proc/31882/ns/uts
那么他必须使用setns
系统调用。
为了将自身与新的网络、IPC、时间或 UTS 命名空间重新关联,调用者必须在其自己的用户命名空间和拥有目标命名空间的用户命名空间中都具有 CAP_SYS_ADMIN 功能。参考:https://man7.org/linux/man-pages/man2/setns.2.html
因此,如果没有CAP_SYS_ADMIN
(sudo) 功能,调用者就无法进入另一个命名空间。如果这可能的话,那就是一个安全问题。
附加说明:将 suid 位设置为podman
二进制将允许运行功能podman
而CAP_SYS_ADMIN
无需提及,sudo
但我希望您不要期待这个答案。