我正在尝试设置一个 chroot jail,然后我做了:
which binary
ldd /bin/binary
然后我做了:
cp /lib64/{libs} $jail/lib64
cp /usr/lib64/{libs} $jail/usr/lib64
PS:在此设置过程中,我发现 /lib64 需要特殊权限 rx,只有 r-- 不起作用(在 chroot 内部或外部)。
将二进制文件复制到 $jail,创建 /home/jailuser 。
创建 proc、dev、sys 并安装它们。
找到 jailuser:users 的 uid 和 gid
更改主目录的所有权:
chown jailuser:users
chmod 700 (for dirs)
chmod 600 (for files)
将其他文件的所有权更改为root:root,有关权限,请参见前面。
然后root进入了监狱:
export USER=jailuser (and I did the same with LOGNAME, HOME)
cd $jail
chroot --userspec=$uid:$gid $jail $jail/binary
它确实起作用了,但是:
在我的本地机器中,只有所有非监狱用户权限均为 005 才有效。
在 KVM VPS 中尝试了相同的操作,但唯一有效的权限是 050!
请问有人知道吗:
1)为什么本地至少需要 005 才能工作,而远程至少需要 050 才能工作(两个系统相同)?
2) 有没有更好的方法在 chroot jail 中设置权限?(但保留 root:root 所有权,因此用户/进程无法修改“系统”文件)...
3)除了使用--userspec选项之外,有没有更好的方法以非特权用户身份启动这个监狱?
谢谢!
答案1
我想我明白了!我猜有时系统需要切换到 root 组内的用户,并且需要库(可能是系统或无人?),因此 lib64 和 usr/lib64 确实需要至少 050 权限。
我设置权限的最终脚本是这样的(已经测试并正常运行):
#Create vars
u=jailuser
g=users
home=/home/$u
jail=$home/jail
#Set normal home
u=jailuser
g=users
cd $home
find . -type d -exec chown $u:$g {} +
find . -type f -exec chown $u:$g {} +
find . -type d -exec chmod 700 {} +
find . -type f -exec chmod 600 {} +
#Set jail
u=root
g=root
cd $jail
find . -type d -exec chown $u:$g {} +
find . -type f -exec chown $u:$g {} +
find . -type d -exec chmod 511 {} +
find . -type f -exec chmod 100 {} +
#Set lib64
cd $jail/lib64
find . -type f -exec chmod 555 {} +
#Set usr/lib64
cd $jail/usr/lib64
find . -type f -exec chmod 555 {} +
#Set binary
chmod 511 $jail/binary
#Set etc
chmod 544 $jail/etc/passwd
chmod 544 $jail/etc/group
#Set tmp
chmod 777 $jail/tmp
#Set jailed home
u=jailuser
g=users
cd $jail$home
find . -type d -exec chown $u:$g {} +
find . -type f -exec chown $u:$g {} +
find . -type d -exec chmod 700 {} +
find . -type f -exec chmod 600 {} +
cd $home