• 【推荐】CentOS安装vsftpd3.0.3+安全配置


    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成。

    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://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz
    # tar zxf vsftpd-3.0.3.tar.gz
    # cd vsftpd-3.0.3
    # 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.3

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

    • 主程序文件:/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.3/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.3)
    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.3)
    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.3)
    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。

    注:如果在ftp连接中出现如下错误:

    500 OOPS: prctl PR_SET_SECCOMP failed

    则在/etc/vsftpd/vsftpd.conf文件中加入下面这句:

    #vim /etc/vsftpd/vsftpd.conf
    
    seccomp_sandbox=NO

    注:如果在ftp连接中出现如下错误

    425 Security: Bad IP connecting.

    则在/etc/vsftpd/vsftpd.conf文件中加入下面这句:

    #vim /etc/vsftpd/vsftpd.conf
    
    pasv_promiscuous=YES

    可以看到登录成功,并且登录上去看到的是系统本地用户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.3的安装指定安装目录,所以在卸载的时候需要把以下对应的文件删除:

    # 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
  • 相关阅读:
    奔跑吧DKY——团队Scrum冲刺阶段-Day 3
    奔跑吧DKY——团队Scrum冲刺阶段-Day 2
    奔跑吧DKY——团队Scrum冲刺阶段博客汇总
    奔跑吧DKY——团队Scrum冲刺阶段-Day 1-领航
    哈夫曼编码的实现
    电子政务作业——我为政府网站纠错
    20172309 2018-2019《程序设计与数据结构》课程总结
    # Do—Now——团队冲刺博客_总结篇
    数据结构之哈夫曼树
    关于在ViewPager的子页面中不能跳转的问题
  • 原文地址:https://www.cnblogs.com/brishenzhou/p/6141800.html
Copyright © 2020-2023  润新知