本站原创转载注明出处 by:vitter(vitter_at_safechina.net) My blog: http://blog.securitycn.net www.securitycn.net,www.vfocus.net,www.safechina.net
1、准备工作
下载ssh,http://www.ssh.com/ 下载针对Linux的非商业版本,当前最新版本为3.2.9.1,具体地址为: SSH服务器地址 http://www.ssh.com/support/downloads/secureshellserver/non-commercial.html http://ftp.ssh.com/pub/ssh/ [root@vitter_test src]# wget http://ftp.ssh.com/pub/ssh/ssh-3.2.9.1.tar.gz
2、安装ssh
[root@vitter_test src]# tar zxvf ssh-3.2.9.1.tar.gz [root@vitter_test src]# cd ssh-3.2.9.1 [root@vitter_test ssh-3.2.9.1]# ./configure --prefix=/usr/local/sshd --without-x(因为我没x所以去掉) [root@vitter_test ssh-3.2.9.1]# make [root@vitter_test ssh-3.2.9.1]# make install
3、设置ssh记录sftp日志
修改sshd的配置文件,默认/etc/ssh2/sshd2_config,也可以启动的时候手动指定:/usr/local/sshd/sbin/sshd2 -f /etc/ssh2/sshd2_config_my。 去掉这行注释,用于记录sftp的log:
SftpSysLogFacility LOCAL7
当然 subsystem-sftp sftp-server 这行也要去掉注释,否则不启用sftp 其他的配置我们不详细介绍了,网上介绍的很多,google即可
然后修改syslog的配置文件
[root@vitter_test etc]# vi /etc/syslog.conf 加上一行: local7.notice /var/log/sftp.log
则sftp的log会记录到/var/log/sftp.log中。
重启syslog服务
[root@vitter_test etc]# service syslog restart
启动ssh
[root@vitter_test etc]# /usr/local/sshd/sbin/sshd2 -f /etc/ssh2/sshd2_config
这时,登录sftp看看,是不是已经在/var/log/sftp.log中记录了sftp操作的详细日志了。
4、设置sftp用户chroot目录(锁定在固定目录下)
这一部是比较麻烦的,我也是经过了好些天,在openssh+patch+第三方软件和ssh之间测试了好些天才找到很好的解决方法,之前主要集中了openssh上,结果问题多多,最后才感觉用ssh简单点。
ssh配置文件支持chroot,但是记录log遇到问题,下面是解决方法。
4.1、[root@vitter_test etc]# vi /etc/ssh2/sshd2_config
找到下面几行: ## Chrooted environment
# ChRootUsers anonymous,ftp,guest # ChRootGroups sftp,guest
ChRootUsers和ChRootGroups控制哪些用户和组将要chroot目录。
我的设置是
ChRootGroups nobody
针对组,之后在添加新用户的时候方便。
4.2、添加sftp用户: [root@vitter_test etc]# useradd -d /ok -g nobody -s /usr/local/ssh/bin/ssh-dummy-shell ok
4.3、用下面脚本生成chroot用户目录下需要的文件
[root@vitter_test etc]# cat /root/chroot_ssh_dir.sh
#/bin/bash
if [ $# -ne 1 ]; then echo "Usage: $0 username" 1>&2 exit 1 fi
user=$1
SSH_PATH="/usr/local/sshd" #注释:后面的路径是你安装的ssh的目录 CHROOT_PATH=`grep -E $user: /etc/passwd|awk -F':' '{print $6}'`
mkdir -p $CHROOT_PATH/$SSH_PATH/bin/ mkdir -p $CHROOT_PATH/dev
ln $SSH_PATH/bin/sftp-server $CHROOT_PATH/$SSH_PATH/bin/sftp-server ln $SSH_PATH/bin/sftp-server2 $CHROOT_PATH/$SSH_PATH/bin/sftp-server2 ln $SSH_PATH/bin/ssh-dummy-shell $CHROOT_PATH/$SSH_PATH/bin/ssh-dummy-shell for a in $(ldd $SSH_PATH/bin/sftp-server | awk '{print $3}') do [ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a` cp -f $a $CHROOT_PATH$a; done
for a in $(ldd $SSH_PATH/bin/sftp-server2 | awk '{print $3}') do [ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a` cp -f $a $CHROOT_PATH$a; done
for a in $(ldd $SSH_PATH/bin/ssh-dummy-shell | awk '{print $3}') do [ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a` cp -f $a $CHROOT_PATH$a; done
[root@vitter_test etc]# /root/chroot_ssh_dir.sh ok 这样就把ok用户所需的文件生成到了ok的用户目录下。
4.4、修改syslog服务启动脚本:
[root@vitter_test etc]# vi /etc/init.d/syslog
在 daemon klogd $KLOGD_OPTIONS echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog 和 return $RETVAL. 之间加上sftp: daemon klogd $KLOGD_OPTIONS echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog sftp return $RETVAL 然后在 restart() { stop start }
后面加上:
sftp() { for dir in `grep -E ':99:' /etc/passwd|grep -v '^nobody'|awk -F':' '{print $6}'` #注释:99是nobody的gid号,这样以后添加新的nobody组用户后,只需要重启下syslog服务即可。 do ls $dir/dev/log > /dev/null 2>&1 if [ $? -eq 0 ];then rm -f $dir/dev/log fi ln /dev/log $dir/dev/log done }
4.5、重启syslog服务
[root@vitter_test etc]# service syslog restart
然后看下用户chroot目录下的dev下是不是新生成了个log文件,这个是记录日志的关键
至此一切ok。
5、如果以后添加新用户的话,只需要重复4.2、4.3、 4.5、即可。
注: 在nfs系统中我遇到了/dev/log 因为是nfs系统,而用户chroot目录是xfs系统文件,出现了ln硬链接失败(因为跨文件系统了)问题,只好再改下/etc/sysconfig/syslog里面的 SYSLOGD_OPTIONS="-m 0 -r" 为:SYSLOGD_OPTIONS="-m 0 -r -p /data/log" 然后syslog启动脚本改成 ln /data/log $dir/dev/log 另外就是这样改了之后可能会导致部分服务记录日志有问题,比如crond和sendmail,所以不建议修改。
本博原创,如转载请注明出处:http://blog.vfocus.net,谢谢。
本文的引用网址: /blog/mt-tb.cgi/178
本篇文章来源于 Vitter's Blog 原文链接:http://blog.vfocus.net/archives/000416.html
补充1:
优化了下脚本,4.2 4.3 4.5可以在这一个脚本里面完成 #/bin/bash
#chroot user dir. by:vitter(zhangweizhi@world2.cn)2007.7() { echo "Usage: $0 username /home/username" 1>&2 exit } if [ $# -ne 2 ];then usage fi
usage
user=$1 home=$2
SSH_PATH="/usr/local/sshd" group="nobody"
/usr/sbin/useradd -d ${home} -g ${group} -s ${SSH_PATH}/bin/ssh-dummy-shell ${user}
#CHROOT_PATH=`grep -E $user: /etc/passwd|awk -F':' '{print $6}'` CHROOT_PATH=$home
/bin/mkdir -p $CHROOT_PATH/$SSH_PATH/bin/ /bin/mkdir -p $CHROOT_PATH/dev
#/bin/ln $SSH_PATH/bin/sftp-server $CHROOT_PATH/$SSH_PATH/bin/sftp-server #/bin/ln $SSH_PATH/bin/sftp-server2 $CHROOT_PATH/$SSH_PATH/bin/sftp-server2 #/bin/ln $SSH_PATH/bin/ssh-dummy-shell $CHROOT_PATH/$SSH_PATH/bin/ssh-dummy-shell /bin/cp $SSH_PATH/bin/sftp-server $CHROOT_PATH/$SSH_PATH/bin/sftp-server /bin/cp $SSH_PATH/bin/sftp-server2 $CHROOT_PATH/$SSH_PATH/bin/sftp-server2 /bin/cp $SSH_PATH/bin/ssh-dummy-shell $CHROOT_PATH/$SSH_PATH/bin/ssh-dummy-shell for a in $(ldd $SSH_PATH/bin/sftp-server | awk '{print $3}') do [ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a` /bin/cp -f $a $CHROOT_PATH$a; done
for a in $(ldd $SSH_PATH/bin/sftp-server2 | awk '{print $3}') do [ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a` /bin/cp -f $a $CHROOT_PATH$a; done
for a in $(ldd $SSH_PATH/bin/ssh-dummy-shell | awk '{print $3}') do [ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a` /bin/cp -f $a $CHROOT_PATH$a; done
/sbin/service syslog restart
补充2:实现用key认证不用密码认证。
如果想要用key来认证,不用密码验证的话,按照下面的方法来做,很简单:
1、在sftp客户端服务器(linux的)上用ssh的ssh-keygen2生成证书,注意如果装了openssh没卸载的话,不要用成他的了,/usr/local/sshd/bin/ssh-keygen2生成如下: [root@web-host5 ~]# /usr/local/ssh/bin/ssh-keygen2 (当然你可以加参数具体该命令帮助见:http://www.ssh.com/support/documentation/online/ssh/winhelp/40/ssh-keygen2.html) Generating 2048-bit dsa key pair 11 o.oOo.oOoo.o Key generated. 2048-bit dsa, root@web-host5, Tue Aug 18 2009 19:40:35 +0800 Passphrase : Again : Key is stored with NULL passphrase. (You can ignore the following warning if you are generating hostkeys.) This is not recommended. Don't do this unless you know what you're doing. If file system protections fail (someone can access the keyfile), or if the super-user is malicious, your key can be used without the deciphering effort. Private key saved to /root/.ssh2/id_dsa_2048_a Public key saved to /root/.ssh2/id_dsa_2048_a.pub 不加参数的话,在用户的.ssh2目录下生成id_dsa_2048_a id_dsa_2048_a.pub random_seed 三个文件,默认是dsa 2048位。
如果是普通用户同理,用普通用户去生成证书: [sftptest@web-host5 ~]$ /usr/local/ssh/bin/ssh-keygen Generating 2048-bit dsa key pair 5 .oOo.oOo.oOo Key generated. 2048-bit dsa, sftptest@manager, Tue Aug 18 2009 12:19:41 +0800 Passphrase : Again : Key is stored with NULL passphrase. (You can ignore the following warning if you are generating hostkeys.) This is not recommended. Don't do this unless you know what you're doing. If file system protections fail (someone can access the keyfile), or if the super-user is malicious, your key can be used without the deciphering effort. Private key saved to /export/sftptest/.ssh2/id_dsa_2048_a Public key saved to /export/sftptest/.ssh2/id_dsa_2048_a.pub 同理在Windows的客户端机器上用ssh-keygen2.exe生成;
2、在服务器上用户上传的chroot目录下,跟dev等目录相同的父目录下创建一个.ssh2的目录;
3、把在客户端生成的用户下的.ssh2目录下的id_dsa_2048_a.pub文件scp到服务器的刚才创建的.ssh2目录下: [root@web-host5 ~]# scp .ssh2/id_dsa_2048_a.pub sftptest@172.16.16.11:/.ssh2/
4、在服务器的.ssh2的目录下编辑一个名为authorization文件,内容如下: Key id_dsa_2048_a.pub 这里面就是指定客户端生成的那个public key。认证就全靠这个了,可以指定多个用户多行。 [root@web-host5 ~]# ls authorization id_dsa_2048_a.pub
5、回到客户端,在你使用的用户,也就是刚才用ssh-keygen2生成的那个用户的.ssh目录下编辑一个名为identification文件,内容如下: IdKey id_dsa_2048_a 这里是客户端连接的时候调用的private key,没有这个我们也连不上的。
然后就可以用/usr/local/ssh/bin/sftp登录了,这里必须用ssh的不能用系统openssh默认的那个sftp,因为我们上面identification配置的就是ssh的。 [root@web-host5 ~]# /usr/local/ssh/bin/sftp -oPort=22222 sftptest@172.16.16.11 sftp> quit 成功登录,同理普通帐号的也一样 [sftptest@web-host5 ~]$ /usr/local/ssh/bin/sftp -oPort=22222 172.16.16.11 sftp> quit
|