需求分析: 根据客户所提要求,那么就必须搭建一openssh server,利用ssh+chroot功能来实现。而在openssh 4.8p1以前的版本,要支持chroot,必须使用第三方的修改。但从openssh 4.8p1以后,chroot功能已经被内置了,为此可以直接在服务器系统(CentOS 5.5)上搭建。 系统平台: CentOS 5.5 i386 openssh 5.6p1 zlib-1.2.5 openssl-1.0.0c
根据sshd_config的man中所述,实现chroot功能需要配置"ChrootDirectory"这个参数。
ChrootDirectory:定义了用户通过认证以后的chroot目录,此目录及其所有子目录的属主必须是root,且这些目录只有root帐号可以进行写操作,其他任何组和帐号都不可写。chroot以后,sshd会将用户的工作目录转到chroot目录中用户自己的主目录。如果ChrootDirectory定义的目录下没有相应的/home/username目录,则会直接转到chroot的/目录下。
[root@server ~]# mkdir /var/chroot [root@server ~]# cd /var/chroot [root@server chroot]# mkdir {bin,dev,lib,lib64,etc,home} [root@server chroot]# mknod dev/null c 1 3 [root@server chroot]# mknod dev/zero c 1 5 #可选,这两个文件ssh命令需要,如缺少会报告:PRNG is not seeded [root@server chroot]# mknod dev/random c 1 8 [root@server chroot]# mknod dev/urandom c 1 9 #可选,ssh命令需要,如缺少会报告:Host key verification failed [root@server chroot]# mknod dev/tty c 5 0 #修改/var/chroot及其子目录的属主,并修改权限 [root@server chroot]# chown -R root.root /var/chroot [root@server chroot]# chmod -R 755 /var/chroot #允许用户写这些设备文件,不可写会有些命令报错 [root@server chroot]# chmod 0666 dev/{null,zero,tty}
然后将要允许用户执行的可执行文件和依赖的库文件复制到相应位置。例如必须给用户一个可用的shell,则我们一般用/bin/bash,那么执行ldd命令查看相关信息: [root@server chroot]# ldd /bin/bash linux-gate.so.1 => (0x00572000) libtermcap.so.2 => /lib/libtermcap.so.2 (0x0388b000) libdl.so.2 => /lib/libdl.so.2 (0x00839000) libc.so.6 => /lib/libc.so.6 (0x006b3000) /lib/ld-linux.so.2 (0x0068f000) 说明/bin/bash要正确执行,依赖于如下几个文件: /lib/libtermcap.so.2 /lib/libdl.so.2 /lib/libc.so.6 /lib/ld-linux.so.2 那么我们必须把/bin/bash和相应的库文件复制到对应的位置。 [root@server chroot]# cp -p /bin/bash /var/chroot/bin [root@server chroot]# cp -p /lib/libtermcap.so.2 /var/chroot/lib [root@server chroot]# cp -p /lib/libdl.so.2 /var/chroot/lib [root@server chroot]# cp -p /lib/libc.so.6 /var/chroot/lib [root@server chroot]# cp -p /lib/ld-linux.so.2 /var/chroot/lib 类似上边这样,对每个想要允许用户执行的文件都如此操作即可。 这里只是为了说明下具体过程,实际应用时肯定要用脚本来执行的。我从一网站抄来一个脚本(这里我命名为shell.sh),略加修改,内容如下:
# /bin/bash # 要允许执行的文件列表 cmdlist="/bin/bash /bin/ls /bin/cp /bin/mkdir /bin/mv /bin/rm /bin/rmdir" # chroot路径 chroot_path="/var/chroot"
# 判断依赖的库文件 lib_1=`ldd $cmdlist | awk '{ print $1 }' | grep "/lib" | sort | uniq` lib_2=`ldd $cmdlist | awk '{ print $3 }' | grep "/lib" | sort | uniq`
# 复制命令文件 for i in $cmdlist do cp -a $i $chroot_path/bin/ && echo "$i done" done
# 复制依赖的库文件(因为是i386,所以是lib,如果是x86_64,则是lib64,) for j in $lib_1 do cp -f $j $chroot_path/lib/ && echo "$j done" done
for k in $lib_2 do cp -f $k $chroot_path/lib/ && echo "$k done" done