首页 > 解决方案 > unshare 如何在没有真正 root 的情况下使用 chroot?

问题描述

chroot需要CAP_SYS_CHROOT根据说明书。该unshare命令使用 chroot

该命令unshare -UrR newroot/将在不运行 as的情况下工作root,这是有道理的,因为-r标志使我们root进入命名空间,从而为我们提供了CAP_SYS_CHROOT能力。

问题开始于unshare -UR newroot/不需要运行时root,而unshare -U chroot newroot/会给我Operation not permitted错误。所以在第一个中,我不是要求root在用户命名空间内,第二个是相同的,但尝试手动执行。

检查代码,使用时唯一发生的事情-R是将 to 设置newrootoptarg,所以我不明白为什么在一个示例中这是有效的,而在另一个示例中却没有。

标签: linuxchrootlinux-capabilitieslinux-namespaces

解决方案


发生这种情况是因为unshare(2)首先被调用,并且它CLONE_NEWUSER作为标志之一传递,因为-U. 关于该标志的手册注释:

取消共享用户命名空间,以便将调用进程移动到不与任何先前存在的进程共享的新用户命名空间。clone(2)与使用标志创建的子进程一样CLONE_NEWUSER,调用者在新的命名空间中获得了一整套能力。

现在该进程在新命名空间中拥有全套功能,它可以调用chroot(2). 请注意,该调用发生在调用具有映射 ID 的进程之前,因此此时,该进程仍然在新用户命名空间中享有特权。execve这些功能在调用启动新进程时被丢弃。

这就是您的chroot命令失败的原因:因为它缺乏权限,而该unshare命令在调用任何进程之前仍然具有特权。


推荐阅读