CentOS安装vsftpd-3.0.2及安全配置

编程语言
0 894

FTP的登录一般有三种方式,分别是:

  • 匿名用户形式:默认安装的情况下,系统只提供匿名用户访问,只需要输入用户anonymous/ftp,并将自己的Email作为口令即可登录。
  • 本地用户形式:以/etc/passwd中的用户名为认证方式。
  • 虚拟用户形式:支持将用户名和密码保存在文件或数据库中,将登录用户映射到指定的系统账号(/sbin/nologin)来访问资源,其中这些虚拟用户是FTP的用户。

这里我们选择了vsftpd这一款常用的FTP服务器软件来搭建FTP服务器。


#准备工作#

这里采用基于PAM的虚拟用户,需要先用yum来安装PAM的组件:

# yum install pam
# yum install pam-devel
# yum install db4-utils

 另外,在默认配置下vsftpd需要使用nobody用户和/usr/share/empty这个目录,查看这两个东西是否存在,如果不存在则添加之(默认是都有了) :

# id nobody
uid=99(nobody) gid=99(nobody) 组=99(nobody)
# ls /usr/share/empty

#vsftpd的安装#

vsftpd的源码包里并没有configure文件, 所以没办法类似安装其他软件那样指定安装路径,要修改只有两种方法:

  • 修改Makefile文件
  • 修改.c源文件 

为了不至于过于麻烦, ,这里没有做任何修改,直接编译安装:

# wget https://olex-secure.openlogic.com/content/openlogic/vsftpd/3.0.2/vsftpd-3.0.2.tar.gz
# tar zxf vsftpd-3.0.2.tar.gz
# cd vsftpd-3.0.2
# make && make install

注:x86_64位系统在make的时候可能会提示错误: 

/usr/bin/ld: cannot find -lcap

这是因为其只会去/lib/或/usr/lib/下查找,而x86_64应该去/lib64/和/usr/lib64/中查找才对,所以需要修改vsf_findlibs.sh文件: 

# cp vsf_findlibs.sh vsf_findlibs.sh.default
# vim vsf_findlibs.sh

// 统一把/lib/改成/lib64/,而/usr/lib则改成/usr/lib64

修改完之后再来编译安装: 

# make clean
# make && make install

# vsftpd -v
vsftpd: version 3.0.2

这个时候表示安装已经成功。由于采用的是默认安装,所以应用这些默认配置: 

  • 主程序文件:/usr/local/sbin/vsftpd
  • 主配置文件:/etc/vsfptd.conf
  • PAM认证文件:/etc/pam.d/vsftpd
  • 匿名用户主目录:/var/ftp
  • 匿名用户的下载目录:/var/ftp/pub

接下来修改配置文件并且创建默认的共享目录: 

# mkdir /etc/vsftpd/
# cp /usr/local/src/vsftpd-3.0.2/vsftpd.conf /etc/vsftpd/vsftpd.conf
# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.default

# mkdir -p /var/ftp/pub
# chown root:root /var/ftp
# chmod 755 /var/ftp

然后尝试启动ftp服务器: 

# /usr/local/sbin/vsftpd &
[1] 18181

在本地连接FTP服务器进行测试(如果当前系统没有ftp命令可以yum安装一个) :

# ftp 12.24.67.13
Connected to 12.24.67.13 (12.24.67.13).
220 (vsFTPd 3.0.2)
Name (12.24.67.13:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> nlist
227 Entering Passive Mode (12,24,67,13,100,50).
150 Here comes the directory listing.
nginx-1.7.8.tar.gz
php-5.6.4.tar.gz
are.tar
226 Directory send OK.
ftp> bye

注:由于默认是允许匿名用户登录的,所以用户名输入anonymous而口令直接回车输入空即可登录。 

至此,vsftpd已经安装完毕并可以正常启动,但是这种允许匿名的连接方式是不安全的,所以下面我们仍然需要进行一些安全配置来加固。 

#vsftpd的安全配置# 

vsftpd的安全原则主要有两个:

  • 只允许支持虚拟用户登录,关闭本地用户和匿名用户。
  • 不允许使用root权限运行。

1)首先创建虚拟用户口令明文文件,使用前面安装的db4-utils组件生成口令认证文件: 

# vim /etc/vsftpd/access.txt

brishenzhou
brishenzhou_pwd

# db_load -T -t hash -f /etc/vsftpd/access.txt /etc/vsftpd/access.db

注:access.txt中一行用户名+一行密码,保持这样。 

2)编辑vsftpd的PAM认证文件: 

# vim /etc/pam.d/vsftpd

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/access
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/access

注:这里使用的就是/etc/vsftpd/access.db文件。 

3)所有的虚拟用户都需要使用一个系统本地用户,所以这里创建一个不需要登录的系统本地用户,并且设定它的主目录是/data/vsftpd: 

# id vsftpd
id: vsftpd:无此用户
# groupadd vsftpd
# mkdir -p /data/vsftpd/pub
# useradd -g vsftpd -d /data/vsftpd -s /sbin/nologin vsftpd
# id vsftpd
uid=504(vsftpd) gid=504(vsftpd) 组=504(vsftpd)

# chown -R vsftpd:vsftpd /data/vsftpd
# chmod a-w /data/vsftpd
# chmod 777 /data/vsftpd/pub

注:由于需要启用chroot,这里的根目录/data/vsftpd必须不可写,所以不能上传文件,可以新增一个pub的目录来放上传的文件。 

4)配置vsftpd开启虚拟用户选项: 

# vim /etc/vsftpd/vsftpd.conf

#禁止匿名用户
anonymous_enable=NO
local_enable=YES
write_enable=YES

#不启动锁定用户名单,所有的用户都将被锁定不允许访问上级目录,只允许访问其主目录
chroot_local_user=YES
chroot_list_enable=NO

#启动log
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/etc/vsftpd/vsftpd.log

#开启虚拟用户
guest_enable=YES
#FTP虚拟用户对应的系统用户
guest_username=vsftpd
#PAM认证文件/etc/pam.d/vsftpd
pam_service_name=vsftpd

virtual_use_local_privs=YES

4)最后让vsftpd加载指定的配置文件来启动: 

# vsftpd /etc/vsftpd/vsftpd.conf &
[1] 19570

这个时候可以测试匿名用户是否可以登录: 

# ftp 12.24.67.13
Connected to 12.24.67.13 (12.24.67.13).
220 (vsFTPd 3.0.2)
Name (12.24.67.13:root): anonymous
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> bye

可以看到匿名用户已经没办法登录,接下来看虚拟用户:

# ftp 12.24.67.13
Connected to 12.24.67.13 (12.24.67.13).
220 (vsFTPd 3.0.2)
Name (12.24.67.13:root): brishenzhou
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> nlist
227 Entering Passive Mode (12,24,67,13,54,136).
150 Here comes the directory listing.
226 Directory send OK.
ftp> bye

注:上面输入的密码是前面设置的对应brishenzhou用户的密码,密码是brishenzhou_pwd。

可以看到登录成功,并且登录上去看到的是系统本地用户vsftpd的目录:/data/vsftpd/。

如果是使用FlashFTP等软件登录,可以配置如下:

#vsftpd的启动/关闭#

为了方便,这里写一个service启动vsftpd的脚本: 

# vim /etc/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 +x /etc/init.d/vsftpd

另外,由于使用的是单独启动模式,而不是xinetd,所以修改文件:

# vim /etc/xinetd.d/vsftpd

disable:yes

之后,就可以使用以下命令来开启/关闭vsftpd了:

service vsftpd start
service vsftpd stop

#vsftpd的卸载# 

用于没有给vsftpd-3.0.2的安装指定安装目录,所以在卸载的时候需要把以下对应的文件删除:

# rm /usr/local/sbin/vsftpd
# rm /usr/local/man/man5/vsftpd.conf.5
# rm /usr/local/man/man8/vsftpd.8
# rm /etc/xinetd.d/vsftpd
# rm -rf /etc/vsftpd
# rm -rf /var/ftp
# rm -rf /data/vsftpd