zoukankan      html  css  js  c++  java
  • 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虚拟用户

  • 相关阅读:
    分享:十Python之Http Web服务(网页抓取二)
    分享:C语言打印long long类型
    分享:svn 添加*.so等文件
    visual assist x 安装
    设计模式之MVC模式
    php一个递归读取目录文件脚本
    转:javax.swing.JFrame中使用jpanel来布局
    alter table 总结
    php 函数:func_get_args()、func_get_arg()与func_num_args()
    Visual Assist X简介
  • 原文地址:https://www.cnblogs.com/hgzero/p/13581349.html
Copyright © 2011-2022 走看看