ftp服务器介绍与配置

一、 ftp服务,File Transfer Protocal 文件传输协议 

    1. ftp基于tcp协议,C/S架构 

        Server: wu-ftpd, proftpd ,pureftp,vsftpd:(Very Secure ftpd),IIS,ServU

        Client:

            GUI: flashfxp,cuteftp,filezilla(开源), gftp(Linux)

            CLI:ftp, lftp,wget, lftpget

    2. ftp的传输机制

            1) 命令连接和数据传输连接

ftp模型.png 

  最开始,只建立命令连接,当执行get命令时,开启另一端口建立文件传输连接,如果get多个文件,则建立多个连接。文件传输结束时,拆除相应的文件连接。 

            2) 数据连接的主动模式和被动模式 

                 主动和被动连接.png

主动连接:通常客户端会装有防火墙,不允许别人主动对客户端发起连接

被动连接:可以通过服务器端连接追踪机制来解决防火墙问题,无论访问哪个端口,端口必须和已经建立的链接产生关系。 

            主动模式下: 服务器工作在20号端口 

            被动模式下: 服务器工作在随机端口  

    3. 传输数据: 

            流式话数据: 可以存入硬盘

                                文本文件, 二进制文件 等

    

    4. 用户认证机制: 

        1) 系统用户

        2) 虚拟用户。通常存放在文件或者数据库中

                hash file 

                mysql 

        3) 匿名用户 

    5. 数据传输安全机制: 

        sftp :ssh提供基于ssh协议的ftp服务

        ftps :基于ssl的ftp 

    7. 响应码 

            1xx:信息码 

            2xx:成功状态吗 

            3xx:进一步提示补全信息的状态 

            4xx:客户端错误

            5xx:服务器端错误

二、 vsftpd 安装和配置 

     1. 安装vsftpd 

    # yum -y install vsftpd

      2. 重要的目录

    /etc/pam.d/vsftpd              认证文件存放目录    
    /etc/rc.d/init.d/vsftpd        服务脚本
    /usr/sbin/vsftpd               主程序文件 
    /etc/vsftpd/vsftpd.conf        主配置文件 
    /etc/vsftpd/ftpusers           用户黑名单
    /etc/vsftpd/user_list          用户限制名单 userlist_deny=NO 仅允许此名单用户登录,userlist_deny=YES 不允许用户名单的用户登录
    /var/ftp/pub                   共享文件所在位置

      3.  关于pam的认证文件

    ## 文件所在位置/etc/pam.d/vsftpd 关于认证文件 
        pam: Plugable Authentication Module: 插件式认证模块 
            1) nsswitch: 名称解析框架 
                模块: /lib64/libnss* , /usr/lib64/libnss* 
                配置文件: /etc/nsswitch.conf 
            2) 用户认证框架 
                模块化:/lib64/security/pam*.so 
                配置文件:/etc/pam.conf 和 /etc/pam.d/*

       4. chroot选项

    ## 对于ftp用户访问ftp服务时使用chroot禁锢用户 
    ## 在主配置文件/etc/vsftpd/vsftpd.conf中配置启动
        chroot_local_user=YES                         对于本地用户使用chroot, 将会把其家目录作为其root目录 
        chroot_list_enable=YES                        chroot_list里面的用户不受chroot影响 
        chroot_list_file=/etc/vsftpd/chroot_list      不受chroot指令的例外用户列表,需要手动添加,每行一个用户名。如果没有这个文件链接会失败

  chroot开启前效果 

                                        before_chroot.png

ftp登录用户可以进入系统根目录

chroot开启后效果 

                                       after_chroot.png

开启后,用户的家目录被当做root了

        5. 关于匿名用户的配置 

    anonymous_enable=YES                    允许匿名用户登录     
    anon_upload_enable=YES                  允许匿名用户上传文件
    anon_other_write_enable=YES             允许匿名用户执行其他写权限 
    anon_mkdir_write_enable=YES             允许匿名用户创建文件夹 

    ## 此时的权限为ftp用户配置的权限叠加文件本身权限总和的效果 
    ## 如果文件本身权限不允许其他用户修改,基本vsftpd.conf配置了匿名用户可修改,结果依然不能修改 
    ## 文件夹也一样,如果想要允许匿名用于在pub上传文件,需要将其other权限添加+w

         6. vsftp 控制登录用户的机制 

    ## /etc/vsftpd/ftpusers中的用户都不允许使用ftp服务, 这是在/etc/pam.d/vsftpd中定义;/etc/pam.d/vsftpd 中应该有如下一行        
        auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    ## /etc/vsftpd/user_list文件两种配置方法        
        ## 黑名单:
        userlist_enable=YES
        userlist_deny=YES
        ## 白名单
        userlist_enable=YES
        userlist_deny=NO

          7. 链接限制

        max_clients: 最大并发连接数        
        max_per_ip: 每IP可同时发起并发请求

          8. 传输速率 

        anon_max_rate: 匿名用户的最大传输速率,单位是“字节/秒”        
        local_max_rate: 本地用户最大传输速率, 单位是“字节/秒”

          9. 匿名用户上传的文件自动转换属主和属组 

        chown_uploads=YES
        chown_username=someuser  ## 使用特定用户作为上传的文件的属主,并使用其所在的组当做属组

          10. 上传文件的umask 

        anno_umask: 匿名用户上传文件的umask; 
        local_umask:

           11. 欢迎信息  

        banner_file=/path/to/some_banner_file        
        ftp_banner=some string
        dirmessage_enable=yes ## 需要在某ftp可访问的目录下创建.messages文件

           12. 虚拟用户: 所有虚拟用户都会被映射为一个系统用户, 访问时文件目录为此系统用户的家目录 

                  虚拟用户认证机制: hash编码的文件,奇数行为用户名,偶数行尾秘密

                  关系型数据库: pam-mysql第三方模块认证 

三、 详解配置虚拟用户 

    1. 安装mysql和pam_mysql(epel源提供) 

    # yum -y install vsftpd mysql-server mysql-devel pam_mysql

    2. 创建虚拟用户账号所映射的系统用户 

    # useradd -s /sbin/nologin -d /var/ftproot vuser     
    # chmod go+rx /var/ftproot

    3. 在数据库中添加虚拟用户

    mysql> create database vsftpd;    
    mysql> grant select on vsftpd.* to vsftpd@192.168.98.128 identified by 'vsftpd';
    mysql> flush privileges;
    mysql> insert into users(name,password) values('tom',password('tom'));
    mysql> insert into users(name,password) values('jerry',password('jerry'));

     4. 配置pam认的配置文件

    auth required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=192.168.98.128 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2    
    account required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=192.168.98.128 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

    ## 这里说明一下,host是vsftpd所在主机的主机地址,同时也是在mysql中被授权访问的主机地址。vsftpd会通过借助pam访问数据库获取数据。而vsftpd所在的主机为192.168.98.128,这里的host也是这个。 如果把vsftpd放在其他主机上与数据库分开管理也是可以的。 
    ## crypt 加密方式
    ##  0 明文
    ##  1 Y 
    ##  2 为mysql中的password()函数加密 
    ##  3 md5
    ##  4 sha1

       5. 配置vsftpd配置文件

    ## 主要添加下面三行    
        # vim /etc/vsftpd/vsfptd.conf 
        guest_enable=YES                    ## 允许使用虚拟用户
        guest_username=vuser                ## 虚拟用户映射为vuser系统用户
        pam_service_name=vsftpd.mysql       ## pam配置文件位置为/etc/pam.d/vsftpd.mysql 

    ## 下面是一些vsftpd的基本选项 
        anonymous_enable=YES
        local_enable=YES
        write_enable=YES
        anon_upload_enable=NO
        anon_mkdir_write_enable=NO
        chroot_local_user=YES

    ## 另外每个虚拟用户的单独权限可以在 /etc/vsftpd/vuser/ 配置
        例如:
        # vim /etc/vsftpd/vuser/tom  写下一下几行
        anon_upload_enable=YES
        anon_mkdir_write_enable=YES

        6. 重启vsftpd服务,测试效果 

    # service vsftpd restart     
    在另一个台主机上 
    # ftp 192.168.98.128 
        Connected to 192.168.98.128 (192.168.98.128).
        220 (vsFTPd 2.2.2)
        Name (192.168.98.128:root): tom
        331 Please specify the password.
        Password:
        230 Login successful.
        Remote system type is UNIX.
        Using binary mode to transfer files.
        ftp> 
    测试成功。

        7. 常见的不能正常认证的错误 

            1) iptables 忘记关,selinux没有disable :此时通常的错误是数据库无法访问 

            2) 虚拟用户无法认证: 有可能是加密方式没有设置统一 

            3) 数据库没法连接, 数据库访问的用户和主机要和pam文件的用户主机统一,一定要明确,是vsftpd借助pam访问数据库,而不是ftp客户端访问数据库。我在这里被坑了好几天。

原创文章,作者:以马内利,如若转载,请注明出处:http://www.178linux.com/4450