首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>本站原创>linux原创>文章内容
ssh-3.2记录sftp日志,并且chroot锁定用户目录解决方案
来源:www.vfocus.net 作者:vitter 发布时间:2009-08-18  

本站原创转载注明出处
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


 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·OPENVPN安装手册
·openssh记录sftp详细日志,并chr
·用linux构建仗剑江湖mud游戏服务
·Linux高可用(HA)集群笔记heartbe
·关于日志记录系统设计思想
·unix入侵及防御心得(一)(2)
·unix入侵及防御心得(一)(1)
·linux下的Informix安装配置
·Informix的数据库优化
·Linux下apache运行mysql,cgi,p
·Linux下安装Oracle817完美解决版
·改的一个非GBK的JSP的webshell
  相关文章
·Linux下安装Oracle817完美解决版
·Linux下apache运行mysql,cgi,p
·linux下的Informix安装配置
·Informix的数据库优化
·在 RHEL3 上安装 Oracle 10g
·openssh记录sftp详细日志,并chr
·用mod_gzip对Apache1.3做Web压缩
·lvs+heard负载均衡文档(DR)
·Linux高可用(HA)集群笔记heartbe
·OPENVPN安装手册
·改的一个非GBK的JSP的webshell
·unix入侵及防御心得(一)(2)
  推荐广告
CopyRight © 2002-2018 VFocuS.Net All Rights Reserved