ftp&vsftpd详解

1. ftp简介

1.1 文件传输协议

  • File Transfer Protocol,文件传输协议
    • C/S架构
    • ftp是明文传输

1.2 两路ftp连接

  • 当传输数据时,会新建立一个连接,而非使用此前建立的命令连接。
    • 命令连接:传输命令
    • 数据连接:传输数据

1.3 文本模式&二进制模式

  • 文本模式:
    • 文本传输是使用ASCII字符,并由回车键和换行符分开,二进制不用转换或格式化就可以传输字符
    • 二进制模式比文本模式更快,并且可以传输所有ASCII值,所以一般将FTP设置成二进制模式
  • 二进制模式:
    • 二进制模式用来传输可执行文件、压缩文件、图片文件
    • 如果用ASCII模式传送,会显示一堆乱码,必须重新用BINARY模式传
    • 注意:用HTML和文本编写的文件必须用ASCII模式上传,用BINARY模式上传会破坏文件,导致文件执行出错

2. ftp的两种工作模式

2.1 主动模式(PORT)

1)工作图示&分析

  • FTP客户端通过向FTP服务器端发送PORT命令,告诉服务器该客户端传输数据的临时端口
  • 当需要传送数据时,服务器通过TCP的20端口与客户端的临时端口建立数据传输通道,完成数据传输
  • 在建立连接的过程中,由服务器主动发起连接,因此被称为主动方式

2)工作原理

  • Server:20/tcp端口连接客户端命令连接使用的向后的第一个可用端口
  • 客户端在一个随机端口上向服务端的21/tcp端口发起请求,服务端响应后,连接成功
  • 客户端向服务端发起一个GET请求后,服务端便会通过自己的20/tcp端口,向客户端之前的那个随机端口+1的端口传输数据,如果随机端口+1的端口被其他程序占用,那么会使用再次+1的端口,以此类推,直到找到一个合适的端口
  • 传输完毕后发送数据的一方主动关闭数据连接

2.2 被动模式(PASV)

1)工作图示&分析

  • FTP客户端通过向FTP服务器端发送PASV命令,告诉服务器进入被动模式,服务器选择临时端口并告知客户端
  • 当需要传送数据时,客户端主动与服务器的临时端口号建立数据传输通道,完成数据传输
  • 在整个过程中,由于服务器总是被动接收客户端的数据连接,因此被称为被动方式

2)工作原理

  • Server:打开一个随机端口,并等待客户端连接
  • 客户端在一个随机端口上向服务端的21/tcp端口发起请求后,服务端会进行响应
    • 告诉客户端这里已经开放了某个端口,可以连接了
    • 服务端响应时不会直接发送端口号,而是会发送两个数字,如173,26,(表示打开的端口除以256所得到的商和余数,这里表示44314)
  • 客户端收到服务端的端口后,就连接服务端的端口进行数据传输

3. vsftp详解

3.1 vsftp概述

1)概述

  • vsftp是安全的FTP程序
  • URL的格式
    • SCHEME://username:password@HOST:PORT/path/to/file
  • 路径映射
    • 用户家目录:每个用户的URL的 / 映射到当前用户的家目录
  • vsftp以ftp用户的身份运行进程
    • 默认用户即为ftp用户,匿名用户的默认路径即为ftp用户的家目录 /var/ftp
    • 匿名用户:ftp、anonymous

2)程序结构

  • 主程序:/usr/sbin/vsftpd
  • Unit File:/usr/lib/systemd/system/vsftpd.service
  • 主配置文件:/etc/vsftpd/vsftpd.conf
  • 数据根目录:/var/ftp

3.2 vsftp的用户类别 

  • 匿名用户
    • anonymous --> ftp   : /var/ftp
    • 匿名用户其实也是系统用户,只不过这个系统用户叫ftp,而这个用户的家目录为/var/ftp
  • 系统用户
    • 若系统用户可以访问,则此用户可以通过ftp访问该系统上任何可以被该用户访问的资源,家目录就是用户的家目录
    • /etc/pam.d/vsftp文件中include了passwd-auth.so,而这个文件中又包含了pam_unix.so,这个文件就定义了可以通过系统用户来访问
    • 注意:至少禁止系统用户访问ftp服务
      • /etc/vsftpd/ftpusers
      • PAM(/etc/pam.d/vsftpd)
  • 虚拟用户
    • 非系统用户,用户账号不是可登陆操作系统的用户账号(非/etc/passwd)

注意:

  • 用户通过vsftpd服务访问到的默认路径,是用户自己的家目录,默认可以在自己有权限访问的所有路径间切换
  • 要禁锢用户于其家目录中

3.3 配置vsftpd

注意事项:

  • 如果开启了chroot_list_enable功能,需要自行创建chroot_list_file指定的文件,否则vsftpd服务无法正常提供服务

4. vsftpd认证虚拟用户

4.1 先创建一个系统用户

  • 因为虚拟用户要使用这个系统用户访问文件,所以需要先创建一个系统用户
# 设置该用户的主目录为/home/vsftpd, 且禁止ssh登录
useradd  vsftpd  -d  /home/vsftpd  -s  /sbin/nologin

4.2 创建虚拟用户

1)创建虚拟用户主目录

mkdir  -p  /home/vsftpd/{ftp1, ftp2}

2)创建虚拟用户

vim  /etc/vsftpd/loginuser
# 添加:
   ftp1
   123
   ftp2
   456
# 创建了ftp1和ftp2这两个虚拟用户,密码分别为123和456

4.3 创建数据库文件

1)使用db_load命令生成db

  • 因为保存虚拟账号和密码的文本文件无法被系统账号直接调用,所以需要使用db_load命令来生成db
db_load  -T  -t  hash  -f  /etc/vsftpd/loginuser  /etc/vsftpd/loginuser.db
# 参数说明:
#    -T:允许应用程序能够将文本文件转译载入进数据库
#    -t hash  :使用hash加密
#    -f:指定包含用户名和密码的文本文件(此文件的格式为:奇数行为用户名,偶数行为密码)

2)修改数据库文件的权限

chmod  600  /etc/vsftpd/{loginuser,loginuser.db}

4.4 pam认证中加入数据库文件认证

  • 在vsftpd对应的pam认证模块中加入数据库文件认证
vim  /etc/pam.d/vsftpd

# 清空后加入:
auth  sufficient  /lib64/security/pam_userdb.so  db=/etc/vsftpd/loginuser
account  sufficient  /lib64/security/pam_userdb.so  db=/etc/vsftpd/loginuser

# 注意,这里的就是上面创建的文件数据库, 这里的loginuser不需要加db的后缀

4.5 创建虚拟用户配置文件

  • 将所有的虚拟用户的配置文件统统放入这个目录,且目录中配置文件的名称必须与虚拟用户名一致
    • mkdir  /etc/vsftpd/userconf/
  • 创建各个虚拟用户的配置文件
    vim  /etc/vsftpd/userconf/ftp1
    local_root
    =/home/vsftpd/ftp1/ # 设定主目录为/home/vsftpd/ftp1 write_enable=YES
    anon_upload_enable
    =YES anon_mkdir_write_enable=YES anon_other_write_enable=YES

4.6 修改主配置文件

  • 修改/etc/vsftpd/vsftpd.conf
anonymous_enable=NO                  # 禁止匿名用户登录
chroot_local_user=YES                # 禁止用户访问除主目录以外的目录
ascii_upload_enable=YES              # 设定支持ASCII模式的上传和下载功能
ascII_download_enable=YES

chown_uploads=YES                    # 允许虚拟用户上传文件
chown_username=vsftpd                # 注意:这里是创建的Linux本地用户vsftpd, 不改这里虚拟用户将不能下载文件

guest_enable=YES                     # 启动虚拟用户
guest_username=vsftpd                # 虚拟用户使用的系统用户名
user_config_dir=/etc/vsftpd/userconf # 虚拟用户使用的配置文件目录
allow_writeable_chroot=YES 
# 最新版的vsftpd为了安全必须用户主目录(也就是/home/vsftpd/ftp1)没有写权限,才能登陆,
# 或者使用allow_writeable_chroot=YES

4.7 vsftpd创建虚拟用户的资料

  • https://blog.csdn.net/make_zhf/article/details/81099184
  • https://www.cnblogs.com/tssc/p/9582780.html
  • http://www.myjishu.com/?p=369

5. pam_mysql认证ftp虚拟用户

 

posted @ 2020-09-15 18:04  Praywu  阅读(2750)  评论(0编辑  收藏  举报