使用 unionfs-fuse chroot,无法访问 /dev/*

使用 unionfs-fuse chroot,无法访问 /dev/*

我结合 unionfs-fuse 创建了一个 chroot 监狱,这样我就不需要在其中安装另一个系统。

但是,生成的系统的 /dev 条目不可读。这会导致需要访问/dev/random/dev/null和 的程序出现问题/dev/urandom

我尝试自己解决这个问题,方法是创建一个由持久文件组成的目录,并使用mknod如上所述的方式创建上述文件的等效项这里,然后创建一个 unionfs:

# unionfs-fuse -o cow /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/

进而,

# chroot chroot/

但是,当我尝试:

# head -c 10 /dev/random | hexdump -C

我收到错误:

head: cannot open `/dev/random' for reading: Permission denied

我应该如何解决这个问题?

(我不需要访问/devlike/dev/sd*或中的其他文件/dev/mem。)

答案1

解释在于mount.fuse手册页:

文件系统默认挂载nodev,nosuid,只能由特权用户覆盖

使用该nodev选项,内核将禁止对已安装文件系统中的设备的所有访问。使用该nosuid选项,内核会忽略 setuid 和 setgid 属性。当非 root 用户安装文件系统时,这两个选项都是安全所必需的:否则安装用户可以创建 setuid root shell 或设备,让他绕过文件系统访问所有磁盘。

allow_other如果非 root 用户要访问该文件系统,您还需要该选项。

unionfs-fuse -o cow,dev,suid,allow_other /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/

如果您想限制哪些设备在 chroot 中可见,那么联合挂载并不是实现此目的的方法。相反,放弃dev并安装一个包含您所需的最小/dev.您可以将其设为 tmpfs:

unionfs-fuse -o cow,suid,allow_other /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
mount -t tmpfs -o mode=755 chroot-dev /chroot/chroot/dev
cp -a /dev/null /dev/zero /dev/urandom /chroot/chroot/dev
mkdir /chroot/chroot/dev/pts
mount --bind /dev/pts /chroot/chroot/dev/pts

您可以绑定挂载一个包含准备就绪的设备的目录,而不是 tmpfs。您需要绑定安装/dev/pts才能在 chroot 中获取伪终端。

相关内容