zoukankan      html  css  js  c++  java
  • 基于centos7实现的ftp

    前言

    FTP(File transfer Protocl),文件传输协议,用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式,属于网络传输协议的应用层。FTP服务运行在TCP/21和20端口,通常来说21端口是连接端口,20端口是数据端口。

    FTP有两种工作模式,主动模式和被动模式:

    • 主动模式:由服务器创建连接,建立的过程描述如下:

        客户端发起请求:
           Client:50000(大于1023的端口号) –> Server: 21
        服务端建立数据传输:
           Server: 20/tcp –> Client: 50000+1(客户端请求端口号+1)

    • 被动模式:由客户端创建连接,建立的过程描述如下:

        客户端发起请求:
           Client:50000(大于1023的端口号) –> Server: 21
        客户端建立数据传输:
           Client:50000+1(客户端请求端口号+1) –> Server: 随机端口

    实现FTP

    • 通过开源软件 vsftp(Very secure file transfer protocol) 实现ftp:
    [root@server ~]# lsb_release -r
    Release:    7.2.1511
    [root@server ~]# yum -y install vsftpd
    [root@server ~]# rpm -qi vsftpd
    Name        : vsftpd
    Version     : 3.0.2
    Release     : 22.el7
    Architecture: x86_64
    • vsftpd的程序主要配置文件有:

        主程序:/usr/sbin/vsftpd
        主配置文件:/etc/vsftpd/vsftpd.conf
        数据根目录:/var/ftp
        Systemd Unit File:/usr/lib/systemd/systemd/vsftpd.service
        禁止登陆用户列表:/etc/vsftpd/ftpusers
        用户列表:/etc/vsftpd/user_list

    • 其中主配置文件 /etc/vsftpd/vsftpd.conf 的默认配置:
      anonymous_enable=YES  #是否允许匿名用户访问
      local_enable=YES  #是否允许本地用户登录FPT
      write_enable=YES  #是否允许写入权限
      local_umask=022  #本地用户上传文件的umask值
      dirmessage_enable=YES  #是否在用户进入某个目录时显示该目录的注意信息
      xferlog_enable=YES  #是否让FTP服务器记录上传下载的情况
      connect_from_port_20=YES  #是否使用20端口进行数据传输
      xferlog_std_format=YES  #是否将记录的上传下载情况写在xferlog_file所指定的文件中
      listen=NO  #是否以独立运行的方式监听服务
      listen_ipv6=YES  #是否支持ipv6
      pam_service_name=vsftpd  #列出与vsftpd相关的pam文件
      userlist_enable=YES  #是否启用禁止登录用户名单
      tcp_wrappers=YES  #是否支持tcp_wrappers
    除以上默认使用的参数外,主配置文件还可以设置以下参数:   定义匿名用户的ftp共享权限:   anon_world_readable_only =YES #是否全局可读   anon_upload_enable=NO #是否允许上传文件   anon_mkdir_write_enable=NO #是否允许创建目录   anon_other_write_enable=NO #是否删除文件、删除目录   anon_umask=077 #匿名用户的umask   定义系统用户的ftp权限:   local_enable=YES #允许本地用户访问(/etc/passwd中的用户)   write_enable=YES #允许写入权限,包括修改,删除   local_umask=022 #定义本地用户上传的文件的umask   chroot_local_user=YES #是否禁锢所有本地用户于其家目录   chroot_list_enable=YES #是否启用chroot_list_file的名单   chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目录下的用户名单   注意:当chroot_local_user=YES和chroot_list_enable=YES时,chroot_list中的用户都是不受限制的用户;当chroot_local_user=NO和chroot_list_enable=YES时,chroot_list中的用户都是受限制的用户。   控制可登陆vsftpd服务的用户列表:   userlist_enable=YES #启用/etc/vsftpd/user_list文件来控制可登陆用户;   userlist_deny=NO #NO意味着/etc/vsftpd/user_list为白名单,YES为黑名单   上传下载速率:   anon_max_rate=0 #匿名用户的最大上传下载速率,0表示无限制   local_max_rate=0 #本地用户的最大上传下载速率,0表示无限制   并发连接数限制:   max_clients=2000 #standalone下最大的并发连接数   max_per_ip=50 #设置单个IP的最大连接数

    注意:通过 man vsftpd.conf 可以获取更多参数信息。
    • vsftp的3中认证方式:

    vsftp服务为ftp提供了3种认证方式,分别是:匿名用户认证、本地用户认证和虚拟用户认证。匿名用户认证是指任何人无需认证即可访问到FTP服务器;本地用户认证在Linux系统中是指/etc/passwd中的用户;虚拟用户认证是指使用vsftp服务独立维护的FTP账号密码进行登录访问。从安全性来说虚拟用户是最安全的,因为就算FTP的账号密码泄露了,也不会泄露本地的用户账号密码。

    1. 匿名用户

    vsftp服务默认就开启了匿名用户登录,此处修改配置文件/etc/vsftpd/vsftpd.conf:

    # 备份配置文件
    [root@server ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}
    [root@server ~]# vim /etc/vsftpd/vsftpd.conf
      anonymous_enable=YES
      anon_upload_enable=YES
      anon_mkdir_write_enable=YES
      anon_other_write_enable=YES
      local_umask=022
    [root@server ~]# setenforce 0
    [root@server ~]# systemctl stop vsftpd.service
    [root@server ~]# systemctl start vsftpd
    [root@server ~]# ss -tan
    LISTEN     0      32                             :::21                                         :::*                  
    LISTEN     0      128                            :::22                                         :::*   

    客户端进行测试:

    [root@client ~]# lftp 192.168.4.119
    lftp 192.168.4.119:~> ls
    drwxr-xr-x    2 0        0               6 Aug 03  2017 pub
    lftp 192.168.4.119:/> cd pub/
    lftp 192.168.4.119:/pub> mkdir test
    mkdir: Access failed: 550 Create directory operation failed. (test)
    lftp 192.168.4.119:/pub> exit

     创建test目录失败。匿名用户的默认路径即为ftp用户的家目录/var/ftp,虽然我们已经配置了anon_mkdir_write_enable=YES,但ftp用户的真正权限是vsftpd.conf定义的共享权限与访问的目录的权限的交集,因此我们需要去修改/var/ftp/pub目录的文件权限:

    [root@server ~]# ll -d /var/ftp/pub
    drwxr-xr-x. 2 root root 6 Aug  3  2017 /var/ftp/pub
    [root@server ~]# chown ftp:ftp /var/ftp/pub/
    [root@server ~]# ll -d /var/ftp/pub
    drwxr-xr-x. 2 ftp ftp 6 Aug  3  2017 /var/ftp/pub
    注意,不能直接修改/var/ftp的属主属组为ftp,不然客户端重新匿名登录ftp时,会出现报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()

    重新登录测试:

    [root@client ~]# lftp 192.168.4.119
    lftp 192.168.4.119:~> cd pub/
    lftp 192.168.4.119:/pub> mkdir test
    mkdir ok, `test' created
    lftp 192.168.4.119:/pub> lcd /etc  #切换客户端的目录
    lcd ok, local cwd=/etc
    lftp 192.168.4.119:/pub> put passwd
    2538 bytes transferred                                      
    lftp 192.168.4.119:/pub> ls
    -rw-------    1 14       50           2538 Jun 27 05:44 passwd
    drwx------    2 14       50              6 Jun 27 05:43 test
    lftp 192.168.4.119:/pub> rm passwd
    rm ok, `passwd' removed
    lftp 192.168.4.119:/pub> rmdir test
    rmdir ok, `test' removed
    lftp 192.168.4.119:/pub> exit

    2. 本地用户

    编辑主配置文件/etc/vsftp/vsftp.conf:

    [root@server ~]# vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    userlist_enable=YES
    userlist_deny=NO
    注意:当userlist_enable=YES而userlist_deny=NO时,/etc/vsftpd/user_list为白名单;当userlist_enable=YES和userlist_deny=YES时,/etc/vsftpd/user_list为黑名单

    编辑/etc/vsftpd/user_list:

    [root@server ~]# vim /etc/vsftpd/user_list
      testftp
    [root@server ~]# useradd testftp
    [root@server ~]# echo 123456 | passwd --stdin testftp
    [root@server ~]# systemctl restart vsftpd

    客户端测试:

    [root@client ~]# lftp 192.168.4.119 -u testftp
    Password: 
    lftp testftp@192.168.4.119:~> lcd /etc
    lcd ok, local cwd=/etc
    lftp testftp@192.168.4.119:~> put passwd
    2538 bytes transferred                    
    lftp testftp@192.168.4.119:~> mkdir test
    mkdir ok, `test' created
    lftp testftp@192.168.4.119:~> ls
    -rw-r--r--    1 1001     1001         2538 Jun 27 07:04 passwd
    drwxr-xr-x    2 1001     1001            6 Jun 27 07:04 test
    lftp testftp@192.168.4.119:~> rm passwd 
    rm ok, `passwd' removed
    lftp testftp@192.168.4.119:~> rmdir test
    rmdir ok, `test' removed
    lftp testftp@192.168.4.119:~> lcd /
    lcd ok, local cwd=/
    lftp testftp@192.168.4.119:~> cd /etc  #切换到服务器的/etc目录
    cd ok, cwd=/etc
    lftp testftp@192.168.4.119:/etc> get passwd  #获取服务器的/etc/passwd
    2583 bytes transferred
    lftp testftp@192.168.4.119:/etc> exit

    本地用户能切换到/etc目录能够下载passwd文件,存在极大风险,因此我们需要把本地用户的访问路径限制在其对应的家目录下:

    [root@server ~]# vim /etc/vsftpd/vsftpd.conf
    chroot_local_user=YES
    allow_writeable_chroot=YES
    #chroot_list_file=/etc/vsftpd/chroot_list 通过文件指定禁锢的用户
    注意:从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了,客户端执行写操作时会出现提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()。
    此时如果还想能在对主目录拥有写权限,可以使用allow_writeable_chroot=YES。

    客户端测试:

    [root@client ~]# lftp 192.168.4.119 -u testftp
    Password: 
    lftp testftp@192.168.4.119:~> cd /etc 
    cd: Access failed: 550 Failed to change directory. (/etc)
    lftp testftp@192.168.4.119:/> lcd /etc
    lcd ok, local cwd=/etc
    lftp testftp@192.168.4.119:/> put passwd
    2538 bytes transferred                                      
    lftp testftp@192.168.4.119:/> mkdir test
    mkdir ok, `test' created
    lftp testftp@192.168.4.119:/> rm passwd
    rm ok, `passwd' removed
    lftp testftp@192.168.4.119:/> rmdir test
    rmdir ok, `test' removed
    lftp testftp@192.168.4.119:/> exit

    3. 虚拟用户

    虚拟用户认证所使用的账号和密码都不是服务器中真实存在的,其安全性比本地用户更好,即使被抓包获取到账号密码都无法直接登录到服务器。配置虚拟用户的流程如下:
    1)建立虚拟用户数据库文件
    2)创建根目录及虚拟用户映射的系统用户
    3)建立支持虚拟用户的PAM认证文件
    4)在vsftpd.conf中添加支持配置
    5)为虚拟用户设置不同的权限

    1)建立虚拟用户数据库文件

    [root@ftp ~]# vim /etc/vsftpd/vuser
    #格式:一行账号名,一行密码
    test1 
    123456
    test2
    12345678
    [root@ftp ~]# db_load -T -t hash -f /etc/vsftpd/vuser /etc/vsftpd/vuser.db  #使用db_load命令生成数据库文件
    [root@ftp ~]# chmod 600 /etc/vsftpd/vuser.db
    [root@ftp ~]# rm /etc/vsftpd/vuser

    2)创建根目录及虚拟用户映射的系统用户

    [root@server ~]# useradd -d /var/vftp -s /sbin/nologin vftp
    [root@server ~]# chmod -R 755 /var/vftphome

    3)建立支持虚拟用户的PAM认证文件

    [root@server ~]# vim /etc/pam.d/vsftpd.virtual
    auth required pam_userdb.so db=/etc/vsftpd/vuser  #检查账号及密码,数据库不需要写后缀.db
    account required pam_userdb.so db=/etc/vsftpd/vuser  #检查用户是否在有效期内

    4)在vsftpd.conf中添加支持配置

    [root@server ~]# vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO  #禁止匿名登录
    local_enable=YES  #允许本地用户模式,由于映射的系统用户为本地用户,因此此项必须开启
    guest_enable=YES  #开启虚拟用户模式
    guest_username=vftp  #指定虚拟用户账号映射到本地账号vftp
    pam_service_name=vsftpd.virtual  #指定pam文件
    chroot_local_user=YES  #禁锢用户在其家目录
    allow_writeable_chroot=YES  #允许禁锢的FTP根目录可写
    user_config_dir=/etc/vsftpd/vuser_profile  #指定虚拟用户的权限配置目录
    userlist_enable=YES
    userlist_deny=YES

    5)为虚拟用户设置不同的权限

    [root@server ~]# mkdir /etc/vsftpd/vuser_profile
    [root@server ~]# vim /etc/vsftpd/vuser_profile/test1
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    anon_umask=022
    [root@server ~]# vim /etc/vsftpd/vuser_profile/test2
    local_root=/vftp/test2
    anon_umask=022  
    anon_mkdir_write_enable=YES
    anon_upload_enable=YES
    anon_other_write_enable=YES
    [root@ftp ~]# mkdir -pv /vftp/test2
    [root@ftp ~]# chown vftp:vftp /vftp/test2 [root@ftp ~]# systemctl restart vsftpd

    客户端测试:

    #用户test1
    [root@client ~]# lftp 192.168.4.119 -u test1
    Password: 
    lftp test1@192.168.4.119:~> lcd /etc  
    lcd ok, local cwd=/etc
    lftp test1@192.168.4.119:~> put passwd
    2538 bytes transferred                    
    lftp test1@192.168.4.119:/> mkdir test
    mkdir ok, `test' created
    lftp test1@192.168.4.119:/> ls
    -rw-r--r--    1 1002     1002         2538 Jun 27 09:40 passwd
    drwxr-xr-x    2 1002     1002            6 Jun 27 09:40 test
    lftp test1@192.168.4.119:/> rm passwd 
    rm ok, `passwd' removed
    lftp test1@192.168.4.119:/> rmdir test/
    rmdir ok, `test/' removed
    lftp test1@192.168.4.119:/> cd /etc
    cd: Access failed: 550 Failed to change directory. (/etc)
    lftp test1@192.168.4.119:/> exit
    注意:test1的目录路径:/var/vftp,即 服务器创建的系统用户vftp家目录。
    
    #用户test2
    [root@client ~]# lftp 192.168.4.119 -u test2
    Password: 
    lftp test2@192.168.4.119:~> lcd /etc  
    lcd ok, local cwd=/etc
    lftp test2@192.168.4.119:~> put passwd
    2538 bytes transferred                    
    lftp test2@192.168.4.119:/> mkdir test
    mkdir ok, `test' created
    lftp test2@192.168.4.119:/> ls
    -rw-r--r--    1 1002     1002         2538 Jun 27 09:46 passwd
    drwxr-xr-x    2 1002     1002            6 Jun 27 09:46 test
    lftp test2@192.168.4.119:/> rm passwd
    rm ok, `passwd' removed
    lftp test2@192.168.4.119:/> rmdir test/
    rmdir ok, `test/' removed
    lftp test2@192.168.4.119:/> put fstab
    477 bytes transferred
    lftp test2@192.168.4.119:/> lcd /
    lcd ok, local cwd=/
    lftp test2@192.168.4.119:/> get fstab 
    477 bytes transferred
    lftp test2@192.168.4.119:~> cd /etc
    cd: Access failed: 550 Failed to change directory. (/etc)
    lftp test2@192.168.4.119:/> exit

  • 相关阅读:
    putty配色方案
    LDAP
    cmder显示UTF-8字体
    CentOS Linux release 7.2.1511 (Core)
    扩展欧几里得算法
    Chinese remainder theorem
    弹琴吧
    RSA DH
    iOS 和 Android 的后台推送原理各是什么?有什么区别?
    Codelite安装详解
  • 原文地址:https://www.cnblogs.com/walk1314/p/9228139.html
Copyright © 2011-2022 走看看