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

浙公网安备 33010602011771号