我结合 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
我应该如何解决这个问题?
(我不需要访问/dev
like/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 中获取伪终端。