unshare 如何在没有真正 root 的情况下使用 chroot?

Hor*_*rus 6 linux chroot linux-capabilities linux-namespaces

chroot需要CAP_SYS_CHROOT按照说明书进行。该unshare命令使用 chroot

该命令unshare -UrR newroot/无需运行即可工作root,这是有道理的,因为该-r标志使我们root位于名称空间内,从而为我们提供了CAP_SYS_CHROOT功能。

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

检查代码,使用时发生的唯一一件事-R是将newrootto设置为optarg,所以我无法理解为什么在一个示例中它有效,而在另一个示例中却无效。

bk2*_*204 6

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

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

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

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