use*_*000 7 chroot mount devices unionfs
我已经与 unionfs-fuse 结合创建了一个 chroot 监狱,这样我就不需要在里面安装另一个系统。
但是,生成的系统的 /dev 条目不可读。这会导致需要访问/dev/random、/dev/null和 的程序出现问题/dev/urandom。
我试图通过使包括持久性文件的目录,并使用使上述文件的等价物来解决自己的问题mknod所描述这里,然后创建的unionfs:
# unionfs-fuse -o cow /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
Run Code Online (Sandbox Code Playgroud)
进而,
# chroot chroot/
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试:
# head -c 10 /dev/random | hexdump -C
Run Code Online (Sandbox Code Playgroud)
我收到错误:
head: cannot open `/dev/random' for reading: Permission denied
Run Code Online (Sandbox Code Playgroud)
我应该如何解决这个问题?
(我不需要访问/devlike/dev/sd*或/dev/mem. 中的其他文件。)
解释位于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/
Run Code Online (Sandbox Code Playgroud)
如果您想限制哪些设备在 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
Run Code Online (Sandbox Code Playgroud)
您可以绑定挂载一个包含准备就绪的设备的目录,而不是 tmpfs。您需要绑定安装/dev/pts才能在 chroot 中获取伪终端。