可以访问文件系统的chroot jail

Modified on: Sat, 30 Jun 2018 09:57:00 +0800

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

但是,有没有办法让chroot jail具有对主文件系统的读访问权限?另外,我还希望chroot更喜欢自己的文件。例如,如果其中存在/usr/bin/wget,那么它应优先于系统的/usr/bin/wget

(我实际上正在寻找与Sandboxie相似的内容。)

以上是否可行?

最佳答案

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

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

(参见man mount,“绑定”一节坐骑“)。从现在开始对/chroot/x/y的任何访问都与访问/x/y完全相同:相同的文件列表,相同的内容,相同的inode。

但请注意,这会将整个目录置于原样:chroot中可以写入目录的进程将能够写入外部的“真实”目录。如果你想让chroot里面的mount只读,你需要在bind之后显式地只读重新安装:

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

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

要首选文件的内部副本,或允许在不影响原件的情况下在一些现有文件或目录中书写,您可以使用联合文件系统。这些允许您将多个目录树叠加在一起,指定写入的位置和读取的顺序。适用于Linux的通用联合文件系统包括aufsUnionfsunionfs-fuse。前两个是内核模块,而最后一个使用FUSE在用户空间中运行文件系统。内核模块通常更快,但FUSE版本可能更容易设置,尽管您可能希望避免使用chroot中的外部用户空间工具。您可以准备所需的联合文件系统,然后进行chroot。

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

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

这会在/chroot/bin中创建一个union mount,如果存在,则从/jail/bin优先级中提供文件,然后尝试/other/bin/,否则显示/bin中的文件。 -o cow使其成为copy-on-write:尝试写入,例如/chroot/bin/foo将复制/bin/foo/jail/bin/foo并保存修改。如果您不想要这种行为,请将该选项保留。其他文件系统的配置略有不同,但原理是相同的。

无论你设置哪种方式,都可以:

chroot /chroot

让一切按照你想要的方式运作。


相关问答

添加新评论