首页 > tips, TroubleShooting > 用openssh5搭建一个ssh chroot的环境

用openssh5搭建一个ssh chroot的环境

2011年4月3日 发表评论 阅读评论

  这两天在折腾ssh chroot的环境,我的想法是做一台”跳板机”,在上面有个ssh chroot的环境,大家ssh上来后只能ssh到别的机器上去,其他什么都干不了。最早是考察两条路:jailkit和openssh5.x
  jailkit这个东东说实话很棒,它能真正把每个用户jail到自己的主目录里,而且一堆脚本也非常有用,但它有个问题导致我最终弃用。就是它不支持ssh key agent forward,这个是干嘛的自己google,作为系统管理员的你肯定是懂的。
至于openssh5.x,据说,自openssh4.9x之后就直接支持chroot(通过配置参数chrootdirectory),但openssh的这个chroot的功能主要是为了那种仅能sftp的用户设计的,虽然也能实现ssh的chroot,但相对比较复杂,文档也非常少。而且,这种ssh chroot的环境并不是把大家都关在自己的主目录下,而是在系统里单建一目录,在这个目录下部署一套环境,然后大家都chrootdirectory到这个目录下。
  这样jailkit的实验方法就不提了,反正也没用起来,这里就说说openssh5的解决方案吧。
  centos5自带的openssh版本较低,直接升级到openssh的最新版(5.8p1),具体方法是去openssh的官网上抓下来openssh-5.8p1.tar.gz

tar xzvf openssh-5.8p1.tar.gz
cp openssh-5.8p1/contrib/redhat/openssh.spec /usr/src/redhat/SPECS/
cp openssh-5.8p1.tar.gz /usr/src/redhat/SOURCES/
rpmbuild -bb /usr/src/redhat/SPECS/openssh.spec

如果编译成功,会在/usr/src/redhat/RPMS/x86_64或/usr/src/redhat/RPMS/i386或其他目录下找到一堆openssh开头的rpm文件
直接rpm -Uvh *.rpm一下,openssh升级完毕
再修改/etc/ssh/sshd_config文件
在最后添加如下几行:

Match Group sshonly
ChrootDirectory /sshonly

然后重启sshd,

service sshd restart

openssh-server配置弄完了,下面开始搭建chroot的环境:

mkdir /sshonly
cd /sshonly
mkdir -p bin dev etc home lib lib64 tmp usr/bin
APPS="/bin/bash /usr/bin/sftp /usr/bin/scp /usr/bin/ssh"
for i in $APPS
do
    cp $i ./$i
    ldd $i > /dev/null
    if [ "$?" = 0 ]; then
        LIBS=`ldd $i | awk '{ print $3 }'`
        for l in $LIBS
        do
            mkdir ./`dirname $l` > /dev/null 2>&1
            cp $l ./$l
        done
    fi
done

如果这些都还不够,可以接着:

cd /sshonly
cp /lib/libnss_compat.so.2 /lib/libnsl.so.1 /lib/libnss_files.so.2 ./lib/
cp /lib64/libnss_compat.so.2 /lib64/libnsl.so.1 /lib64/libnss_files.so.2 lib64/

接着配环境:

mknod dev/null c 1 3
mknod dev/zero c 1 5
mknod dev/tty c 5 0
mknod dev/urandom c 1 9
mknod dev/random c 1 8

最后,再添加用户:

groupadd sshonly
useradd -d /sshonly/home/testuser testuser
passwd testuser
cd /home
ln -s ../sshonly/home/testuser .
chown -h testuser:testuser testuser
usermod -d /home/testuser -G sshonly testuser
touch /sshonly/etc/passwd
touch /sshonly/etc/group
grep testuser /etc/passwd >> /sshonly/etc/passwd
grep testuser /etc/group >> /sshonly/etc/group

上面第二句是为用户testuser设置密码。openssh5.x开始检查帐号状态,如果没设密码的帐号都会被锁住,所以这里一定要为用户testuser设置一个密码。
还有,当添加第二个及以上用户到chroot环境的时候,

grep testuser2 /etc/group >> /sshonly/etc/group

会导致关于sshonly组有两行(为什么会有两行,不解释),手工编辑文件/sshonly/etc/group,把前面那行删掉即可。

btw:
直到这个东西做完的时候,才发现还可以用pam认证来实现chroot ssh。

分类: tips, TroubleShooting 标签: ,
  1. 2011年11月17日15:45 | #1

    非常感谢,用这个参考得到了帮助。

  1. 2011年11月17日16:29 | #1