ssh-3.2记录sftp日志,并且chroot锁定用户目录解决方案

本站原创转载注明出处
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://www.vfocus.net/blog/mt-tb.cgi/178
posted @ 2009-06-21 17:16  江湖行者  阅读(1890)  评论(0)    收藏  举报