绿盟扫描到一个关于vsftpd的bug,内容如下:

登录服务器查看相关的信息

vsftp的版本为2.0.5,需要升级到2.3.5以上版本,要不直接就升级到3.0.3版本

官方地址为 https://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz

上传至服务器:

解压,发现报错:

$tar -xzvf vsftpd.3.0.3.tar.gz
$make

发现错误:

[color=Red]/lib/libpam.so.0: could not read symbols: File in wrong format 
collect2: ld returned 1 exit status[/color] 
make: *** [vsftpd] Error 1 

我们的系统是64位系统,修改编辑源代码安装目录下的vsf_findlibs.sh, 将其中路径中的lib替换成lib64

使用vim编辑,快速替换:%s?lib/?lib64/?

然后再执行编译,#make

#make install

安装之后,拷贝当前目录内容到本地安装目录:

cp vsftpd /usr/local/sbin/ 
cp vsftpd.conf.5 /usr/local/share/man/man5 
cp vsftpd.8 /usr/local/share/man/man8 
cp vsftpd.conf /etc/

修改配置如下:

为了让vsftpd支持本地用户登录,讲身份认证模块拷贝至系统目录中

#cp RedHat/vsftpd.pam /etc/pam.d/vsftpd

服务启动脚本的制作

在standalone 模式中,经常用上面的命令启动服务比较麻烦,我们做一个脚本来启动和停止服务。建立一个新文件/etc/rc.d/init.d/vsftpd,把以下内容复制到文件中:

#!/bin/bash
#
# vsftpd      This Shell script takes care of starting and stopping
#             standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program 
#              that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x /usr/local/sbin/vsftpd ] || exit 0
RETVAL=0
prog="vsftpd"
start() {
        # Start daemons.
        if [ -d /etc/vsftpd ] ; then
                for i in `ls /etc/vsftpd/*.conf`; do
                        site=`basename $i .conf`
                        echo -n $"Starting $prog for $site: "
                        /usr/local/sbin/vsftpd $i &
                        RETVAL=$?
                        [ $RETVAL -eq 0 ] && {
                           touch /var/lock/subsys/$prog
                           success $"$prog $site"
                        }
                        echo
                done
        else
                RETVAL=1
        fi
        return $RETVAL
}
stop() {
        # Stop daemons.
        echo -n $"Shutting down $prog: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
        return $RETVAL
}
# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        RETVAL=$?
        ;;
  condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
            RETVAL=$?
        fi
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        exit 1
esac
exit $RETVAL

保存文件,再给该文件加上执行权限:

# chmod 755 /etc/rc.d/init.d/vsftpd

这样我们就可以通过下面的方法来管理服务了:

# service vsftpd {start|stop|restart|condrestart|status}

我们卸载本地rpm安装的vsftpd

首先查看vsftpd的版本rpm -qa|grep vsftpd

然后卸载rpm -e vsftpd.*版本号 --nodeps

重启vsftpd服务:

# service vsftpd restart
Shutting down vsftpd: [OK ]
Starting vsftpd for vsftpd: [OK ]

部署过程中接到提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()

在登陆时提示500 OOPS: vsftpd: refusing to run with writable root inside chroot()。根本原因在于,从vsftpd_2.3.5版开始,取消了根目录的可写权限。因此,网上的普遍解决方案是以下两种:

方案一
$ chmod a-w /vaf/ftp
 
方案二
$ vim /etc/vsftpd.conf add the following
  allow_writeable_chroot=YES

在上面的部署过程中,我采用的是方案二

报错:

[root@51ka-dx-1 pam.d]# ftp localhost
Trying ::1...
ftp: connect to address ::1拒绝连接
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (localhost:root): root
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

解决:

修改 /etc/pam.d/vsftpd

将其中的/lib替换成/lib64

:%s?lib/?lib64/?