可以访问文件系统的 chroot Jail

可以访问文件系统的 chroot Jail

chroot 监狱似乎只是一个不同的世界,与实际文件系统没有交互。因此,整个环境必须在 chroot 内复制,这意味着在其中完整安装系统。

但是,是否有某种方法可以使 chroot Jail 具有对主文件系统的读取权限?此外,我还希望 chroot 能够优先选择自己的文件。例如,如果/usr/bin/wget它存在于其中,那么它应该优先于系统的/usr/bin/wget.

(我实际上正在寻找类似的东西沙盒.)

以上是否可行?

答案1

您可以使用以下命令将目录绑定安装到 chroot 根目录中:

mount -o bind /x/y /chroot/x/y

(看man mount,“绑定安装”部分)。从现在开始,任何访问都/chroot/x/y与访问完全相同/x/y:相同的文件列表、相同的内容、相同的索引节点。

但请注意,这会将整个目录按原样放置:chroot 内的一个进程可以写入该目录将能够写入“真实”目录外部。如果要使 chroot 内的挂载为只读,则需要在绑定后显式重新挂载为只读:

mount -o remount,ro /chroot/x/y

原始 /x/y 将保持读写状态,但副本现在将是只读的。

更喜欢文件的内部副本,或者要允许写入某些现有文件或目录而不影响原始文件或目录,您可以使用联合文件系统。这些使您可以将多个目录树相互叠加,指定写入的位置以及解析读取的顺序。 Linux 的常见联合文件系统包括奥夫斯,联合文件系统, 和UnionFS熔断器。其中前两个是内核模块,而最后一个则使用保险丝在用户空间中运行文件系统。内核模块通常速度更快,但 FUSE 版本可能更容易设置,尽管您可能希望避免使用 chroot 中的外部用户空间工具。您可以准备所需的联合文件系统,然后 chroot 到它们中。

在每种情况下,基本方法都是相同的,例如:

unionfs-fuse -o cow /jail/bin:/other/bin:/bin /chroot/bin

这将创建一个联合挂载,其中如果/chroot/bin文件/jail/bin存在,则给出优先级,然后尝试/other/bin/,否则显示来自的文件/bin-o cow使其成为写时复制:尝试写入,例如,/chroot/bin/foo将复制/bin/foo/jail/bin/foo并保存修改。如果您不希望出现这种行为,请忽略该选项。其他文件系统的配置略有不同,但原理是相同的。

无论您采用哪种方式设置,您都可以:

chroot /chroot

并让一切按照您想要的方式运行。

答案2

mount -o bind 应该对完整目录执行此操作。

mount -o bind /bin /chroot/bin
chroot /chroot

最终会在 chroot 中得到系统 /bin 的副本。

要让您的 bash 副本取代 /chroot/bin/bash 以与我们今天相同的方式处理它,请将其放入 /chroot/usr/local/bin 并相应地设置 PATH。

相关内容