某公司机房成功搭建OpenSSH Server跳板服务器
部署背景:
最近有一客户提出这么个需求,要在公司信息机房部署一台登录跳板服务器,让以后用户访问机房内的服务器都必须先登录这台跳板服务器,然后再ssh到其他服务器。具体要求为:
1)安全最大化,普通用户登陆到这台跳板服务器后只能执行ssh,ls等有限的基础命令。
2)把普通用户锁定在特定的目录下,这样即使被hack,也不会影响其他用户。
需求分析:
根据客户所提要求,那么就必须搭建一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
CentOS 5.5中自带的openssh是4.3p2版本的,必须升级到4.8p1以后,我选择升级到目前最高版本5.6p1。具体升级到openssh 5.6p1的方法可以参考我这篇文章:CentOS 5.5下升级OpenSSH-4.3p2到5.6p1
根据sshd_config的man中所述,实现chroot功能需要配置"ChrootDirectory"这个参数。
ChrootDirectory:定义了用户通过认证以后的chroot目录,此目录及其所有子目录的属主必须是root,且这些目录只有root帐号可以进行写操作,其他任何组和帐号都不可写。chroot以后,sshd会将用户的工作目录转到chroot目录中用户自己的主目录。如果ChrootDirectory定义的目录下没有相应的/home/username目录,则会直接转到chroot的/目录下。
下边是详细的配置过程:
1.新增用户ait(不创建其缺省主目录)
[root@server ~]# useradd -M ait
[root@server ~]# passwd ait
2.修改/etc/ssh/sshd_config文件 [root@server ~]# vi /etc/ssh/sshd_config #增加以下内容
Match User ait
ChrootDirectory /var/chroot
注:这里我指定chroot目录是/var/chroot
[root@server ~]# /etc/init.d/sshd restart #重启SSH服务
3.搭建基本的chroot环境
小贴士:
一个最基本的chroot环境至少有一个shell(例如sh,bash)和一些必要的系统设备文件(例如/dev/null,/dev/zero),如果要允许用户执行一些命令,那么还要准备相应的命令可执行文件和命令依赖的库文件。
[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