前言

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:
  1. [root@server ~]# lsb_release -r
  2. Release: 7.2.1511
  3. [root@server ~]# yum -y install vsftpd
  4. [root@server ~]# rpm -qi vsftpd
  5. Name : vsftpd
  6. Version : 3.0.2
  7. Release : 22.el7
  8. 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 的默认配置:
  1.   anonymous_enable=YES #是否允许匿名用户访问
  2.   local_enable=YES #是否允许本地用户登录FPT
  3.   write_enable=YES #是否允许写入权限
  4.   local_umask=022 #本地用户上传文件的umask值
  5.   dirmessage_enable=YES #是否在用户进入某个目录时显示该目录的注意信息
  6.   xferlog_enable=YES #是否让FTP服务器记录上传下载的情况
  7.   connect_from_port_20=YES #是否使用20端口进行数据传输
  8.   xferlog_std_format=YES #是否将记录的上传下载情况写在xferlog_file所指定的文件中
  9.   listen=NO #是否以独立运行的方式监听服务
  10.   listen_ipv6=YES #是否支持ipv6
  11.   pam_service_name=vsftpd #列出与vsftpd相关的pam文件
  12.   userlist_enable=YES #是否启用禁止登录用户名单
  13.   tcp_wrappers=YES #是否支持tcp_wrappers
  14. 除以上默认使用的参数外,主配置文件还可以设置以下参数:
  15.   定义匿名用户的ftp共享权限:
  16.   anon_world_readable_only =YES #是否全局可读
  17.   anon_upload_enable=NO #是否允许上传文件
  18.   anon_mkdir_write_enable=NO #是否允许创建目录
  19.   anon_other_write_enable=NO #是否删除文件、删除目录
  20.   anon_umask=077 #匿名用户的umask
  21.  
  22.   定义系统用户的ftp权限:
  23.   local_enable=YES #允许本地用户访问(/etc/passwd中的用户)
  24.   write_enable=YES #允许写入权限,包括修改,删除
  25.   local_umask=022 #定义本地用户上传的文件的umask
  26.   chroot_local_user=YES #是否禁锢所有本地用户于其家目录
  27.   chroot_list_enable=YES #是否启用chroot_list_file的名单
  28.   chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目录下的用户名单
  29.   注意:当chroot_local_user=YESchroot_list_enable=YES时,chroot_list中的用户都是不受限制的用户;当chroot_local_user=NOchroot_list_enable=YES时,chroot_list中的用户都是受限制的用户。
  30.  
  31.   控制可登陆vsftpd服务的用户列表:
  32.   userlist_enable=YES #启用/etc/vsftpd/user_list文件来控制可登陆用户;
  33.   userlist_deny=NO #NO意味着/etc/vsftpd/user_list为白名单,YES为黑名单
  34.  
  35.   上传下载速率:
  36.   anon_max_rate=0 #匿名用户的最大上传下载速率,0表示无限制
  37.   local_max_rate=0 #本地用户的最大上传下载速率,0表示无限制
  38.  
  39.   并发连接数限制:
  40.   max_clients=2000 #standalone下最大的并发连接数
  41.   max_per_ip=50 #设置单个IP的最大连接数
  42.  
  43. 注意:通过 man vsftpd.conf 可以获取更多参数信息。
  • vsftp的3中认证方式:

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

1. 匿名用户

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

  1. # 备份配置文件
  2. [root@server ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}
  3. [root@server ~]# vim /etc/vsftpd/vsftpd.conf
  4.   anonymous_enable=YES
  5.   anon_upload_enable=YES
  6.   anon_mkdir_write_enable=YES
  7.   anon_other_write_enable=YES
  8.   local_umask=022
  9. [root@server ~]# setenforce 0
  10. [root@server ~]# systemctl stop vsftpd.service
  11. [root@server ~]# systemctl start vsftpd
  12. [root@server ~]# ss -tan
  13. LISTEN 0 32 :::21 :::*
  14. LISTEN 0 128 :::22 :::*

客户端进行测试:

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

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

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

重新登录测试:

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

2. 本地用户

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

  1. [root@server ~]# vim /etc/vsftpd/vsftpd.conf
  2. anonymous_enable=NO
  3. local_enable=YES
  4. write_enable=YES
  5. local_umask=022
  6. userlist_enable=YES
  7. userlist_deny=NO
  8. 注意:当userlist_enable=YESuserlist_deny=NO时,/etc/vsftpd/user_list为白名单;当userlist_enable=YESuserlist_deny=YES时,/etc/vsftpd/user_list为黑名单

编辑/etc/vsftpd/user_list:

  1. [root@server ~]# vim /etc/vsftpd/user_list
  2.   testftp
  3. [root@server ~]# useradd testftp
  4. [root@server ~]# echo 123456 | passwd --stdin testftp
  5. [root@server ~]# systemctl restart vsftpd

客户端测试:

  1. [root@\client ~]# lftp 192.168.4.119 -u testftp
  2. Password:
  3. lftp testftp@192.168.4.119:~> lcd /etc
  4. lcd ok, local cwd=/etc
  5. lftp testftp@192.168.4.119:~> put passwd
  6. 2538 bytes transferred
  7. lftp testftp@192.168.4.119:~> mkdir test
  8. mkdir ok, `test' created
  9. lftp testftp@192.168.4.119:~> ls
  10. -rw-r--r-- 1 1001 1001 2538 Jun 27 07:04 passwd
  11. drwxr-xr-x 2 1001 1001 6 Jun 27 07:04 test
  12. lftp testftp@192.168.4.119:~> rm passwd
  13. rm ok, `passwd' removed
  14. lftp testftp@192.168.4.119:~> rmdir test
  15. rmdir ok, `test' removed
  16. lftp testftp@192.168.4.119:~> lcd /
  17. lcd ok, local cwd=/
  18. lftp testftp@192.168.4.119:~> cd /etc #切换到服务器的/etc目录
  19. cd ok, cwd=/etc
  20. lftp testftp@192.168.4.119:/etc> get passwd #获取服务器的/etc/passwd
  21. 2583 bytes transferred
  22. lftp testftp@192.168.4.119:/etc> exit

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

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

客户端测试:

  1. [root@\client ~]# lftp 192.168.4.119 -u testftp
  2. Password:
  3. lftp testftp@192.168.4.119:~> cd /etc
  4. cd: Access failed: 550 Failed to change directory. (/etc)
  5. lftp testftp@192.168.4.119:/> lcd /etc
  6. lcd ok, local cwd=/etc
  7. lftp testftp@192.168.4.119:/> put passwd
  8. 2538 bytes transferred
  9. lftp testftp@192.168.4.119:/> mkdir test
  10. mkdir ok, `test' created
  11. lftp testftp@192.168.4.119:/> rm passwd
  12. rm ok, `passwd' removed
  13. lftp testftp@192.168.4.119:/> rmdir test
  14. rmdir ok, `test' removed
  15. lftp testftp@192.168.4.119:/> exit

3. 虚拟用户

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

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

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

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

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

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

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

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

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

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

  1. [root@server ~]# mkdir /etc/vsftpd/vuser_profile
  2. [root@server ~]# vim /etc/vsftpd/vuser_profile/test1
  3. anon_upload_enable=YES
  4. anon_mkdir_write_enable=YES
  5. anon_other_write_enable=YES
  6. anon_umask=022
  7. [root@server ~]# vim /etc/vsftpd/vuser_profile/test2
  8. local_root=/vftp/test2
  9. anon_umask=022
  10. anon_mkdir_write_enable=YES
  11. anon_upload_enable=YES
  12. anon_other_write_enable=YES
  13. [root@ftp ~]# mkdir -pv /vftp/test2
    [root@ftp ~]# chown vftp:vftp /vftp/test2
  14. [root@ftp ~]# systemctl restart vsftpd

客户端测试:

  1. #用户test1
  2. [root@\client ~]# lftp 192.168.4.119 -u test1
  3. Password:
  4. lftp test1@192.168.4.119:~> lcd /etc
  5. lcd ok, local cwd=/etc
  6. lftp test1@192.168.4.119:~> put passwd
  7. 2538 bytes transferred
  8. lftp test1@192.168.4.119:/> mkdir test
  9. mkdir ok, `test' created
  10. lftp test1@192.168.4.119:/> ls
  11. -rw-r--r-- 1 1002 1002 2538 Jun 27 09:40 passwd
  12. drwxr-xr-x 2 1002 1002 6 Jun 27 09:40 test
  13. lftp test1@192.168.4.119:/> rm passwd
  14. rm ok, `passwd' removed
  15. lftp test1@192.168.4.119:/> rmdir test/
  16. rmdir ok, `test/' removed
  17. lftp test1@192.168.4.119:/> cd /etc
  18. cd: Access failed: 550 Failed to change directory. (/etc)
  19. lftp test1@192.168.4.119:/> exit
  20. 注意:test1的目录路径:/var/vftp,即 服务器创建的系统用户vftp家目录。
  21.  
  22. #用户test2
  23. [root@\client ~]# lftp 192.168.4.119 -u test2
  24. Password:
  25. lftp test2@192.168.4.119:~> lcd /etc
  26. lcd ok, local cwd=/etc
  27. lftp test2@192.168.4.119:~> put passwd
  28. 2538 bytes transferred
  29. lftp test2@192.168.4.119:/> mkdir test
  30. mkdir ok, `test' created
  31. lftp test2@192.168.4.119:/> ls
  32. -rw-r--r-- 1 1002 1002 2538 Jun 27 09:46 passwd
  33. drwxr-xr-x 2 1002 1002 6 Jun 27 09:46 test
  34. lftp test2@192.168.4.119:/> rm passwd
  35. rm ok, `passwd' removed
  36. lftp test2@192.168.4.119:/> rmdir test/
  37. rmdir ok, `test/' removed
  38. lftp test2@192.168.4.119:/> put fstab
  39. 477 bytes transferred
  40. lftp test2@192.168.4.119:/> lcd /
  41. lcd ok, local cwd=/
  42. lftp test2@192.168.4.119:/> get fstab
  43. 477 bytes transferred
  44. lftp test2@192.168.4.119:~> cd /etc
  45. cd: Access failed: 550 Failed to change directory. (/etc)
  46. lftp test2@192.168.4.119:/> exit

基于centos7实现的ftp的更多相关文章

  1. 基于centos7+nginx+uwsgi+python3+django2.0部署Django项目

    0.序言 本文讲解如何基于centos7+nginx+uwsgi+python3+django2.0把windows上的本地项目部署到云服务器上. 本文服务器上的django项目和虚拟环境的路径将建立 ...

  2. 基于CentOS7系统一键配置Aria2 实现服务器离线下载工具

    我们有些网友购买的海外VPS主机并不是用来做网站的,而是用来作为下载资源工具使用的.确实用这样的工具搭建之后是比本地下载速度快,因为有些资源.软件等是海外资源,而且挂载在服务器上不占用本地的资源.在这 ...

  3. 使用Docker构建基于centos7镜像的python环境

    Dcokerfile配置信息 ############################################## # 基于centos7构建python3运行环境 # 构建命令: 在Dock ...

  4. 基于Centos7的autobahn-python+crossbar的环境搭建

    一.基于centos7的crossbar安装(已经安装好python) (1) sudo yum update (2) sudo yum install gcc gcc-c++ make openss ...

  5. CentOS7上安装FTP服务

    ---------------------------------------------------------------------------------------------------- ...

  6. Centos7安装vsftpd (FTP服务器)

    Centos7安装vsftpd (FTP服务器) 原文链接:https://www.jianshu.com/p/9abad055fff6 TyiMan 关注 2016.02.06 21:19* 字数 ...

  7. 基于线程开发一个FTP服务器

    一,项目题目:基于线程开发一个FTP服务器 二,项目要求: 基本要求: 1.用户加密认证   2.允许同时多用户登录   3.每个用户有自己的家目录 ,且只能访问自己的家目录   4.对用户进行磁盘配 ...

  8. web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架

    基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  9. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

随机推荐

  1. pat1088. Rational Arithmetic (20)

    1088. Rational Arithmetic (20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue F ...

  2. Quartz使用(3) - Quartz核心接口Trigger

    Trigger最常用的有两种SimpleTrigger和CronTrigger,首先介绍Trigger的一些基础的信息,然后会详细描述这两种Trigger. 1. 通用Trigger属性 quartz ...

  3. mysql-查询(DQL)

    + 注释:mysql中的+号只有一个作用,就是运算符,没有连接字符串的作用,连接字符串用concat. ;两个操作数都是数值型,则做加法运算. ; :只要其中有一个时字符型,则会试图将字符转换为数值型 ...

  4. Mybatis通用Mapper(转)

    转自:http://blog.csdn.net/isea533/article/details/41457529 极其方便的使用Mybatis单表的增删改查 项目地址:http://git.oschi ...

  5. 20170802,css样式优先级

    样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External styl ...

  6. 浅谈 ECMAScript 和 JavaScript

    ES5与ES3基本保持兼容,较大的语法修正和新功能加入,将由JavaScript.next完成. 什么是ECMAScript?http://baike.baidu.com/link?url=G1T8n ...

  7. 在Git上创建新分支(实用性高!!!)

    在github上创建仓库: Create a new repository on the command line touch README.md git init git add README.md ...

  8. Asp.net防御XSS攻击组件库

    一.AntiXss 翻看mvc4高级编程,偶看到作者强烈推荐使用AntiXss防御XSS攻击,收集资料看下. 目前类库已融入到.netframework中,类库主页不再更新. 使用方法:使用Nuget ...

  9. 【MATLAB】画信号频谱的子函数

    输入信号序列和采样率,该子函数可以画出该信号的频谱图. function [f,spec,NFFT]=spec_fft_plot(sample,L,Fs) % 输入数据说明: % sample:信号序 ...

  10. django orm 时间字段讲解

    创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ...