linux - 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 设置newroot
为optarg
,所以我不明白为什么在一个示例中这是有效的,而在另一个示例中却没有。
解决方案
发生这种情况是因为unshare(2)
首先被调用,并且它CLONE_NEWUSER
作为标志之一传递,因为-U
. 关于该标志的手册注释:
取消共享用户命名空间,以便将调用进程移动到不与任何先前存在的进程共享的新用户命名空间。
clone(2)
与使用标志创建的子进程一样CLONE_NEWUSER
,调用者在新的命名空间中获得了一整套能力。
现在该进程在新命名空间中拥有全套功能,它可以调用chroot(2)
. 请注意,该调用发生在调用具有映射 ID 的进程之前,因此此时,该进程仍然在新用户命名空间中享有特权。execve
这些功能在调用启动新进程时被丢弃。
这就是您的chroot
命令失败的原因:因为它缺乏权限,而该unshare
命令在调用任何进程之前仍然具有特权。
推荐阅读
- reactjs - 无法将 npm 终端设置为 VS 代码/窗口
- javascript - 从 React js 发送一个 blob 视频文件到烧瓶服务器
- laravel - 为什么路线在 laravel-livewire 中不起作用?
- vba - Visio中的形状动画通过VBA
- java - Java CXF / JAX-WS 可以验证入站 XML 字符编码吗?
- svg - Html中的 SVG 问题
- javascript - 如何使 Filepond 图像可拖动?
- mysql - 连接到数据库时出错。用户“root”@“localhost”的访问被拒绝(使用密码:YES)
- react-native - useState() 具有初始值但未反映在状态变量中的钩子
- hdfs - Hue / Filebrowser 文件上传/下载 API?