1 VSFTP 概述

FTP是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的文件的双向传输。使用FTP来传输时,是具有一定程度的危险性,因为数据在因特网上面是完全没有受到保护的明文传输方式!
VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP,从名称定义上基本可以看出,这是为了解决 FTP 传输安全性(权限验证问题)问题的。VSFTP 在数据传输方面依旧是以明文传输的方式进行传输。
FTP是可以工作在局域网也可以工作在广域网中。

1.1 安全特性

  1. vsftp程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性(权限越小越安全)
  2. 任何需要执行较高权限的指令都需要上层程序许可
  3. FTP 所需要使用的绝大多数命令都被整合到了vsftp中,基本不需要系统额外提供命令(VSFTP 内置命令来管理VSFTP资源)
  4. 拥有 chroot 功能,可以改变用户的根目录,限制用户只能在自己的家目录

    2 VSFTP 连接类型

    控制连接(持续连接)-> TCP 21(命令信道)-> 用户收发FTP命令(常开监听端口 TCP 21)
    数据连接(按需连接)-> TCP 20(数据信道)-> 用于上传下载数据

    为什么需要有两个端口(TCP 21 和TCP 20)? 可以避免同时有多个用户使用 VSFTP 时由于20端口被占用而无法处理新用户的处理请求。TCP 21由于是收发用户的FTP命令则不是TCP长连接(长连接:长时间连接,一定会有断开的时候)。TCP 20则有可能会出现TCP长连接,即传输大文件时会一直占用该端口的带宽以及资源来处理该用户的请求。

【FTP使用端口和VSFTP使用端口一致】
4.1 FTP - 图1

3 VSFTP 工作模式

image.png
Port 模式(主动模式)
FTP客户端首先和服务器的 TCP 21 端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。

主动模式特点:连接的次数较少,验证过程较为简单 应用场景:连接次数比较频繁,但传输的文件数据不是特别大的场景

image.png
Passive 模式(被动模式)
FTP客户端首先和服务器的TCP 21端口建立连接,用来建立控制通道发送命令,但建立连接后客户端发送Pasv(PASV)命令。服务器收到Pasv命令后,打开一个临时端口(端口大于1023小于65535,尽量使用高位端口)并且通知客户端在这个端口上传送数据的请求,客户端也会开放随机端口来连接FTP服务器的临时端口,然后FTP服务器将通过这个端口传输数据。

被动模式特点:连接的次数较多,验证过程较为复杂 应用场景:连接次数比较频繁,用户较多并发较大的情况,但传输的文件数据较大的场景

注意:由于VSFTP的被动模式是随机端口进行数据传输,所以在设置防火墙时需要刻意放行。

生产环境中安装完 FTP 后,默认使用的是主动模式。但是想FTP更加安全,则使用被动模式

4 VSFTP 传输模式

Binary模式:不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等
ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符等
Linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用
切换方式:在ftp>提示符下输入ascii即转换到ACSII方式,输入bin即转换到Binary方式。

5 VSFTP 软件信息

服务器端软件名:vsftp
客户端软件名:ftp
服务名: vsftpd
端口号:20、21、指定范围内随机端口
配置文件:/etc/vsftpd/vsftpd.conf

6 登录验证方式

匿名用户验证:不知登录来源是谁,即所有的用户共用一个账号来登录FTP

  • 用户账号名称: ftp 或 anonymous
  • 用户账号密码:无密码。
  • 工作目录:/var/ftp(需要在该目录创建子目录)
  • 默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)即上传权限需要VSFTP配置文件的允许和文件系统中该目录的写权限是否允许

范例:匿名用户验证实验

  1. ~ yum install -y vsftpd ftp
  2. ~ chkconfig vsftpd on ; chkconfig --list vsftpd
  3. ~ service vsftpd start
  4. ~ ss -antlp
  5. ~ echo "Hello VSFTP" >> /var/ftp/vsftpd.txt
  6. ~ ftp 10.0.0.40
  7. Connected to 10.0.0.40 (10.0.0.40).
  8. 220 (vsFTPd 2.2.2)
  9. Name (10.0.0.40:root): ftp
  10. 331 Please specify the password.
  11. Password:
  12. 230 Login successful.
  13. Remote system type is UNIX.
  14. Using binary mode to transfer files.
  15. #查看ftp帮助命令
  16. ftp> help 或者 ftp> ?
  17. #列出当前ftp服务器的文件列表
  18. ftp> ls
  19. #上传文件出现权限问题:文件系统没有写权限,VSFTPD配置文件不允许
  20. ftp> put install.log
  21. local: install.log remote: install.log
  22. 227 Entering Passive Mode (10,0,0,40,151,79).
  23. 550 Permission denied.
  24. #下载文件到当前目录下
  25. ftp> get vsftpd.txt
  26. ###解决:上传文件失败问题
  27. ~ vim /etc/vsftpd/vsftpd.conf
  28. anon_upload_enable=YES
  29. ~ service vsftpd restart
  30. #其目录并没有写权限
  31. ~ ls -ld /var/ftp/
  32. drwxr-xr-x. 3 root root 4096 Jun 27 11:36 /var/ftp/
  33. #可以其原生创建的/var/ftp/pub目录下上传文件
  34. ~ ls -ld /var/ftp/pub/
  35. drwxrwxrwx. 2 root root 4096 Jun 27 11:54 /var/ftp/pub/
  36. ~ ftp 10.0.0.40
  37. ~ ftp> pub
  38. ~ ftp> put install.log

image.png


本地用户验证:

  • 用户账号名称:本地用户(/etc/passwd)
  • 用户账号密码:用户密码(/etc/shadow)
  • 工作目录:登录用户的宿主目录
  • 权限:最大权限(drwx———)

    ~ vim /etc/vsftpd/vsftpd.conf local_umask=022 #主要用于限制本地用户的权限划分,但是该权限划分太粗了。

范例:本地用户验证实验

  1. ##Centos7设置用户/sbin/nologin会导致vsftp也无法登陆
  2. ~ useradd -s /sbin/nologin zhangsan
  3. ~ echo "Admin@h3c" | passwd --stdin zhangsan
  4. #本地用户登录ftp,默认登录目录是该用户的家目录
  5. ~ ftp 10.0.0.40
  6. Connected to 10.0.0.40 (10.0.0.40).
  7. 220 (vsFTPd 2.2.2)
  8. Name (10.0.0.40:root): zhangsan
  9. 331 Please specify the password.
  10. Password:
  11. 230 Login successful.
  12. Remote system type is UNIX.
  13. Using binary mode to transfer files.
  14. ftp> ls -al
  15. #本地的文件上传到ftp服务器
  16. ftp> put install.log
  17. #将远程ftp服务器的文件拉取到本地
  18. ftp> get passwd.txt

虚拟(Virtual)用户验证:

  1. 创建虚拟用户用来代替本地用户,减少本地用户曝光率。
  2. 使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制。
  3. 能够设置严格的权限(为每一个用户生成单独的配置文件)

    虚拟用户主要为了解决本地用户对Linux操作系统用户管理的不方便而设定的。其次为了使得用户拥有更加独立的权限。 虚拟用户可以理解本地的用户的升级版。

7 VSFTP 实验部署

注意:先关闭服务器和客户机上的防火墙和SELinux

4.1 FTP - 图5

7.0 FTP内置命令汇总

命令 作用
! [command [args]] 在本地机中执行交互 shell,exit 回到 FTP 环境,例如:! LS*. zip
$ macro-name [names] 运行宏,macro_name 为宏的名称
account [password] 提供登录远程系统成功后,访问系统资源所需的补充口令
append local-file [remote-file] 将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名
ascii 将文件传送类型设置为 ASCII
bell 每个命令执行完毕后计算机响铃一次
binary 使用二进制文件传输方式
bye 结束与远程计算机的 FTP 会话,并退出 FTP
case 在使用 mget 时,将远程主文件名中的大写字母转换为小写字母
cd remote-directory 进入远程主机指定目录
cdup 更改的远程计算机上的目录,跳到上一层目录
chmod mode file-name 将远程主机文件 file-name 的存取方式设置为 mode
close 中断与远程服务器的 FTP 会话
cr 使用 ASCII 方式传输文件时,将回车换行符转换为回行符
delete remote-file 删除远程主机文件
debug [debug-value] 设置调试方式,显示发送至远程主机的每条命令,如 dep up 3。若设置为 0,表示取消 debug
dir [remote-directory] [local-file] 显示远程主机命令,并将结果存入本地文件 local-file
disconnect A synonym for close 中断与远程服务器的 FTP 会话
form format 将文件传输方式设置为 format,默认为 file 方式
get remote-file [local-file] 将远程主机的文件 remote-file 传至本地硬盘的 local-file(下载文件)
glob 设置 mdelete、mget、mput 的文件名扩展,默认情况下不显示扩展文件名,同命令行的 -g 参数
hash [increment] 每传输 1024 字节,显示一个 hash 符号(#)
help [command] 显示 FTP 内部命令 command 的帮助信息
idle [seconds] 将远程服务器的休眠计时器单位设为秒
image 设置二进制传输方式
lcd [directory] 将本地工作目录切换至 directory
ls [remote-directory] [local-file] 显示远程目录 remote-dir,并存入本地文件 local-file
macdef macro-name 定义一个宏,遇到 macdef 下的空行时,宏定义结束
mdelete [remote-files] 删除远程主机文件
mdir remote-files local-file 与 dlr 类似,但可指定多个远程文件
mget remote-files 传输多个远程文件
mkdir directory-name 在远程主机中创建目录
mode [mode-name] 将文件传输方式设置为 modename,默认为 stream 方式
modtime file-name 显示远程主机文件的最后修改时间
mput local-files 将多个文件传输至远程主机
newer file-name[local-file] 如果远程主机中 file-name 的修改时间比本地硬盘同名文件的时间更近,则重新传输该文件
nlist [remote-directory] [local-file] 显示远程主机目录的文件清单,并存入本地硬盘的 local-file
nmap [inpattern outpattern] 设置文件映射机制,使得文件传输时,文件中的某些字符相互转换
ntrans [inchars [outchars]] 设置文件名字符的翻译机制,如 ntrans 1R,则文件名 LLL 将变为 RRR
open host[port] 建立指定 FTP 服务器连接,可指定连接端口
prompt 设置多个文件传输时的交互提示
put local-file[remote-file] 将本地文件 local-file 传送至远程主机(上传文件)
pwd 显示远程主机的当前工作目录
quit 退出 FTP 会话
rename [from] [to] 更改远程主机文件名
rmdir directory-name 删除远程主机目录
status 显示当前 FTP 状态
system 显示远程主机的操作系统类型
type [type-name] 设置文件传输类型为 type-name,默认为 ASCII。例如:type binary。设置使用二进制传输方式
user user-name [password] [account] 向远程主机标明自己的身份,需要口令时,必须输入口令
verbose 切换详细模式,在该模式下,显示所有来自 FTP 服务器的消息
? [command] 显示帮助信息

7.1 匿名用户验证实验

IP地址 主机名 操作系统 角色
10.0.0.40 ftp-server.kubesphere.com CentOS 6 FTP服务器
10.0.0.41 ftp-client.kubesphere.com CentOS 6 FTP客户端
  1. #服务器
  2. ~ hostname ftp-server.kubesphere.com
  3. ~ sed -i '/^HOSTNAME=/cHOSTNAME=ftp-server.kubesphere.com' /etc/sysconfig/network
  4. ~ yum install -y vsftpd ftp
  5. ~ chkconfig vsftpd on ; chkconfig --list vsftpd
  6. ~ service vsftpd restart
  7. #客户端
  8. ~ hostname ftp-client.kubesphere.com
  9. ~ sed -i '/^HOSTNAME=/cHOSTNAME=ftp-client.kubesphere.com' /etc/sysconfig/network
  10. ~ yum install -y ftp
  11. ~ ftp 10.0.0.40
  12. Connected to 10.0.0.40 (10.0.0.40).
  13. 220 (vsFTPd 2.2.2)
  14. Name (10.0.0.40:root): ftp
  15. 331 Please specify the password.
  16. Password:
  17. 230 Login successful.
  18. ftp> ls

匿名权限控制:

  1. anonymous_enable=YES #启用匿名访问,默认启用
  2. anon_umask=022 #匿名用户所上传文件的权限掩码(缺省值)
  3. anon_root=/var/ftp #匿名用户的FTP根目录
  4. anon_upload_enable=YES #允许上传文件
  5. anon_mkdir_write_enable=YES #允许创建目录,默认禁用
  6. anon_other_write_enable=YES #开放其他写入权(删除、覆盖、重命名),默认禁用
  7. anon_max_rate=0 #限制最大传输速率(0为不限速,单位: bytes/秒)

实验需求与流程:
注意:在客户端登录后,默认情况下是可以下载的,但是不能上传

  1. 实现可以上传 ```bash ~ vim /etc/vsftpd/vsftpd.conf anon_upload_enable=YES

在/var/ftp下创建上传目录

mkdir /var/ftp/upload

修改上传目录的权限或者所有者,让匿名用户有写入权限

chmod o+w /var/ftp/upload

客户端

~ ftp 10.0.0.40 #匿名登录 ftp> cd upload ftp> ls -a

目录为空

ftp> put install.log ftp> ls -al -rw———- 1 14 50 50968 Jun 27 05:31 install.log

  1. 2. 实现创建目录和文件其他操作
  2. ```bash
  3. #服务器
  4. ~ vim /etc/vsftpd/vsftpd.conf
  5. anon_mkdir_write_enable=YES #允许创建目录
  6. anon_other_wirte_enable=YES #删除文件、文件改名、文件覆盖
  7. ~ service vsftpd restart
  8. #客户端
  9. ~ ftp 10.0.0.40
  10. ftp> cd upload
  11. ftp> mkdir ftp_test_dir
  12. ftp> ls
  13. #删除空目录
  14. ftp> rmdir test
  15. #删除文件
  16. ftp> delete install.log
  17. #文件改名
  18. ftp> rename personal_reset_centos6.sh reset_centos6.sh
  19. ftp> ls

image.png

  1. 用户进入某个文件夹时,弹出相应的说明 ```bash

    在对应的目录下创建 .message 文件,并写入相应内容

    确认 dirmessage_enable=YES 是否启用

    尝试切换目录查看效果(同一次登录仅提示一次)

~ echo “Welcome To FTP” > /var/ftp/upload/.message ~ vim /etc/vsftpd/vsftpd.conf dirmessage_enable=YES ~ service vsftpd restart

客户端

~ ftp 10.0.0.40 ftp> cd upload 250-Welcome To FTP

![image.png](https://cdn.nlark.com/yuque/0/2022/png/2555283/1656308958482-1fd46f3f-23cb-43b2-bcda-2f06c8d463fc.png#clientId=u25f0b3e5-dd4c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=66&id=u21478923&margin=%5Bobject%20Object%5D&name=image.png&originHeight=66&originWidth=464&originalType=binary&ratio=1&rotation=0&showTitle=false&size=5835&status=done&style=none&taskId=ubb9ce8ca-8db3-4b79-a5b7-d27ba22057e&title=&width=464)

4. 实现上传的文件可以下载

模块情况下开放上传权限后,上传的文件是无法被下载的,因为文件的其他人位置没有 r 权限,设置anon_umask=022,可以让上传的文件其他人位置拥有 r 权限,然后才能被其他人下载<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2555283/1656308136522-ad21f139-91f7-4464-8498-b8d2af350e93.png#clientId=u25f0b3e5-dd4c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=238&id=uff252c78&margin=%5Bobject%20Object%5D&name=image.png&originHeight=238&originWidth=751&originalType=binary&ratio=1&rotation=0&showTitle=false&size=25031&status=done&style=none&taskId=u8d9046c7-755c-46a2-bf63-22a80974927&title=&width=751)
```bash
#服务器
~ vim /etc/vsftpd/vsftpd.conf
#添加以下参数
anon_umask=022
~ service vsftpd restart

#客户端
~ ftp 10.0.0.40
ftp> cd upload
ftp> put personal_reset_centos6.sh
ftp> ls -al
-rw-------    1 14       50          50968 Jun 27 05:31 install.log
-rw-r--r--    1 14       50           1832 Jun 27 05:38 personal_reset_centos6.sh
ftp> get personal_reset_centos6.sh
#下载到本地目录成功

image.png

7.2 本地用户验证实验

本地用户权限控制

local_enable=YES            
#是否启用本地系统用户。
local_umask=022                
#本地用户所上传文件的权限掩码
local_root=/var/ftp        
#设置本地用户的FTP根目录
chroot_local_user=YES    
#是否将用户禁锢在主目录(*)
local_max_rate=O            
#限制最大传输速率
ftpd_banner=Welcome to blah FTP service #用户登录时显示的欢迎信息

userlist_enable=YES & userlist_deny=YES 
#禁止/etc/vsftpd/user_list文件中出现的用户名登录FTP,
userlist_enable=YES & userlist_deny=NO.
#仅允许letc/vsftpd/user_list文件中出现的用户名登录FTP·

#以上参数修改后需要重启服务

配置文件: ftpusers    #黑名单,本地用户添加到该文件后,立刻生效,不需要重启服务
#禁止/etc/vsftpd/ftpusers文件中出现的用户名登录FTP,权限比user_list更高,即时生效。

实验需求:

  1. 服务端需要创建用户并设置密码(所创建的用户,不需要登录操作系统,仅仅用来登录VSFTP) ```bash

    该-s /sbin/nologin参数只能用于CentOS6,不能用于CentOS7否则FTP登录将会失败

    useradd -s /sbin/nologin username

服务器创建用户

~ for user in {zhangsan,lisi,wangwu} ;do useradd -s /sbin/nologin $user;done ~ for user in {zhangsan,lisi,wangwu} ;do echo “Admin@h3c” | passwd —stdin $user ;done

客户端使用服务器本地用户登录

~ ftp 10.0.0.40 Name (10.0.0.40:root): zhangsan Password: Admin@h3c ftp> ls -al ftp> cd / ftp> ls -al ftp> cd /etc/ ftp> ls -al

只要在其他人权限位有 r 读权限就可以拉取get

ftp> get /etc/yum.conf


2. 将所有用户禁锢在自己的家目录下

注意:默认没有禁锢用户时,客户端登录后可以随意切换目录,查看文件所在的位置和文件名
```bash
~ vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
#开启用户家目录限制,限制所有用户不能随便切换目录
~ service vsftpd restart

# 客户端使用服务器本地用户登录
~ ftp 10.0.0.40
Name (10.0.0.40:root): zhangsan
Password: Admin@h3c
ftp> cd /etc
550 Failed to change directory.
#开启该功能主要为了保护Linux系统的安全
  1. 将部分用户禁锢在自己的家目录下 ```bash ~ vim /etc/vsftpd/vsftpd.conf chroot_list_enable=YES

    开启白名单功能,允许白名单中的用户随意切换目录

    chroot_list_file=/etc/vsftpd/chroot_list

    白名单文件所在位置(需要自己创建)

~ touch /etc/vsftpd/chroot_list #文件内容直接写入用户即可 ~ vim /etc/vsftpd/chroot_list zhangsan ~ service vsftpd restart

客户端使用服务器本地用户登录

~ ftp 10.0.0.40 Name (10.0.0.40:root): zhangsan Password: Admin@h3c ftp> cd /etc ftp> ls -al ftp> get /etc/yum.conf

若发现开启该功能后无法使用匿名登录,则添加 allow_writeable_chroot=YES 参数重启服务即可


4. 配置文件:/etc/vsftpd/ftpusers
```bash
~ vim /etc/vsftpd/ftpusers
~ echo "lisi" >> /etc/vsftpd/ftpusers
#所有写入此文件内的用户名都不允许登录FTP,立刻生效(黑名单用户)
#不需要重启服务,直接生效

# 客户端使用服务器本地用户登录
~ ftp 10.0.0.40
Name (10.0.0.40:root): lisi
Password: Admin@h3c
530 Login incorrect.
Login failed.
#发现登录失败
  1. 修改被动模式数据传输使用端口 ```bash ~ vim /etc/vsftpd/vsftpd.conf

    添加以下行参数

    pasv_enable=YES pasv_min_port=30000 pasv_max_port=35000

    重启服务

    ~ service vsftpd restart

    在张三家目录生成一个大文件

    ~ dd if=/dev/zero of=/home/zhangsan/bigfile.img bs=10M count=100

客户端使用服务器本地用户登录

~ ftp 10.0.0.40 Name (10.0.0.40:root): zhangsan Password: Admin@h3c ftp> ls -rw-r—r— 1 0 0 1048576000 Jun 27 07:09 bigfile.img ftp> get bigfile.img

在数据过程中查看服务器端的被动模式随机端口

~ netstat -antp | grep vsftpd

![image.png](https://cdn.nlark.com/yuque/0/2022/png/2555283/1656313876931-3abbe89a-f002-4e41-98dd-6ac3fd3850f8.png#clientId=u25f0b3e5-dd4c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=287&id=u06007122&margin=%5Bobject%20Object%5D&name=image.png&originHeight=287&originWidth=1165&originalType=binary&ratio=1&rotation=0&showTitle=false&size=45933&status=done&style=none&taskId=u22fdcba7-5a0e-4590-b187-df834239fe3&title=&width=1165)
<a name="pHPUj"></a>
## 7.3 虚拟用户验证实验
![](https://cdn.nlark.com/yuque/0/2022/jpeg/2555283/1656306448782-eaf7b189-6fd6-4075-a437-2644aaf01c62.jpeg)

1. 建立FTP的虚拟用户的用户数据库文件(在/etc/vsftpd)
```bash
~ vim /etc/vsftpd/vsftpd.user
#注意:该文件名可以随便定义,文件内容格式:奇数行用户,偶数行密码

#-T:将vsftpd.user文件转换为数据库文件vsftpd.db
#-t:指定加密类型
#-f:指定需要转换的源文件
db_load -T -t hash -f vsftpd.user vsftpd.db
#将用户密码的存放文本转换为数据库类型,并使用 hash 加密

chmod 600 vsftpd.db
#修改文件权限为600,保证其安全性

范例:建立FTP的虚拟用户的用户数据库文件(在/etc/vsftpd)

#服务器端操作
~ vim /etc/vsftpd/vsftpd.user
a1
123456
a2
123456
a3
123456

#vsftpd.db用于登录验证的数据库文件
~ db_load -T -t hash -f vsftpd.user vsftpd.db
~ ls -l vsftpd.*
~ chmod 600 vsftpd.db
  1. 创建FTP虚拟用户的映射用户,并制定其用户家目录

    useradd -d /var/ftproot -s /sbin/nologin -c "FTP virtual" virtual
    #创建virtual用户作为 ftp 的虚拟用户的映射用户
    

    范例:创建FTP虚拟用户的映射用户,并制定其用户家目录

    ~ useradd -d /var/ftproot -s /sbin/nologin -c "FTP virtual" virtual
    
  2. 建立支持虚拟用户的PAM认证文件,添加虚拟用户支持 ```bash cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam

    使用模板生成自己的认证配置文件,方便一会调用

编辑新生成的文件 vsftpd.pam(清空原来内容,添加下列两行) auth required pam_userdb.so db=/etc/vsftpd/vsftpd account required pam_userdb.so db=/etc/vsftpd/vsftpd

在 vsftpd.conf 文件中添加支持配置
```bash
#修改:
  pam_service_name=vsftpd.pam

#添加:
  guest_enable=YES                                #匿名开启
  guest_username=virtual                    #匿名用户的用户名
  user_config_dir=/etc/vsftpd/dir    #匿名用户的配置文件目录

范例:建立支持虚拟用户的PAM认证文件,添加虚拟用户支持

~ cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam
~ vim /etc/pam.d/vsftpd.pam
auth      required    pam_userdb.so db=/etc/vsftpd/vsftpd
account     required    pam_userdb.so db=/etc/vsftpd/vsftpd

~ vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.pam
guest_enable=YES
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
~ mkdir /etc/vsftpd/dir
  1. 为虚拟用户建立独立的配置文件,启动服务并测试

注意:做虚拟用户配置文件设置时,将主配置文件中自定义的匿名用户相关设置注释掉。
用户可以上传:

anon_upload_enable=YES #允许上传文件

用户可以创建目录或者文件:

anon_mkdir_write_enable=YES #允许创建目录

用户可以修改文件名:

anon_upload_enable=YES #允许上传文件(为了覆盖开启的) anon_other_write_enable=YES #允许重名和删除文件、覆盖

注意:给映射用户的家目录,设置 o+r 让虚拟用户有读权限。
范例:为虚拟用户建立独立的配置文件,启动服务并测试

~ vim /etc/vsftpd/vsftpd.conf
#将主配置文件中自定义的匿名用户相关设置注释掉
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES

~ cd /etc/vsftpd/dir/
~ echo "anon_upload_enable=YES" >> /etc/vsftpd/dir/a1
~ echo "anon_mkdir_write_enable=YES" >> /etc/vsftpd/dir/a2
~ echo -e "anon_upload_enable=YES\nanon_other_write_enable=YES" >> /etc/vsftpd/dir/a3

#给映射用户的家目录,设置 o+r 让虚拟用户有读权限
chmod o+r /var/ftproot

范例:测试虚拟用户验证

~ service vsftpd restart

#客户端登录FTP服务器
~ ftp 10.0.0.40
Connected to 10.0.0.40 (10.0.0.40).
Name (10.0.0.40:root): a1
Password: 123456
230 Login successful.
ftp> ls -al
ftp> put install.log
#再次执行,将属于覆盖行为,a1用户没有该权限
ftp> put install.log
local: install.log remote: install.log
227 Entering Passive Mode (10,0,0,40,129,119).
553 Could not create file.

~ ftp 10.0.0.40
Connected to 10.0.0.40 (10.0.0.40).
220 (vsFTPd 2.2.2)
Name (10.0.0.40:root): a2
Password: 123456
230 Login successful.
#a2用户可以创建目录
ftp> mkdir test
257 "/test" created

~ ftp 10.0.0.40
Connected to 10.0.0.40 (10.0.0.40).
220 (vsFTPd 2.2.2)
Name (10.0.0.40:root): a3
Password: 123456
230 Login successful.
#a3用户支持文件覆盖
ftp> put install.log

7.4 OpenSSL + VSFTP 加密验证方式

扩展:使用 tcpdump 工具进行指定端口抓包,抓取ftp登录过程中的数据包

tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host [来源IP(客户端地址)] [-w vsftpd.cap]

  • -i :interface:指定tcpdump需要监听的接口
  • -n :对地址以数字方式显式,否则显示的为主机名
  • -nn :除了 -n 的作用之外,还把端口显示为数值,否则显示端口服务名
  • -X :输出包的头部数据,会以16进制和ASCII两种方式同时输出
  • -vv :产生更加详细的输出

范例:查看 vsftpd 服务在传输数据时的数据信息

#在默认情况下FTP使用的明文方式传输的协议
~ tcpdump -i eth0 -nn -vv tcp port 21 and ip host 10.0.0.1

image.png
image.png
4.1 FTP - 图10
4.1 FTP - 图11

CA证书服务器: 密钥:私钥 证书:公钥 签字后的证书:由证书结合密钥转换而来 客户端和服务器端所使用的密钥和证书都是由CA机构颁布的。客户端使用证书加密的时候,是交由CA证书服务器进行验证的,CA机构再来告知客户端该证书没有问题。 过程:

  1. 服务器端向CA证书服务器申请注册,注册申请服务器的密钥对,以及签字后的证书信息。这些信息产生需要绑定该服务器的信息,公司名,所在地理位置,联系人,联系方式等。CA证书将根据信息产生证书,密钥以及签字后的证书。
  2. 服务器端将CA证书服务器产生的证书,密钥以及签字后的证书保存到本地相应的目录路径下。此时服务器端和CA证书目前就没有关系了。除非有效期即将过期后续期会再继续进行同步生成过程。
  3. 当客户端访问拥有CA证书认证的服务器端时,服务器端会要求客户端下载其对应的CA签字证书文件。客户端登录服务器端的信息就将会利用CA签字证书进行加密在网络中进行传输。
#服务器
hostname ftp-server.kubesphere.com
sed -i '/^HOSTNAME=/cHOSTNAME=ftp-server.kubesphere.com' /etc/sysconfig/network
yum install -y vsftpd ftp
chkconfig vsftpd on ; chkconfig --list vsftpd
service vsftpd restart

#客户端
hostname ftp-client.kubesphere.com
sed -i '/^HOSTNAME=/cHOSTNAME=ftp-client.kubesphere.com' /etc/sysconfig/network
yum install -y ftp
  1. 查看是否安装了 openssl

    #服务器端(CA证书服务器)
    rpm -q openssl
    
  2. 查看 vsftpd 是否支持 openssl

    ldd /usr/sbin/vsftpd | grep libssl
    
  3. 生成加密信息的密钥和证书文件

    位置:cd /etc/ssl/certs/ A、openssl genrsa -out vsftpd.key 2048

    建立服务器私钥,生成RSA密钥。1024为加密长度

    B、openssl req -new -key vsftpd.key -out vsftpd.csr

    需要依次输入国家,地区,组织,组织单位,Email等信息。最重要的是有一个common name,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr 文件交由CA签字后形成服务器端的自己的证书

    image.png C、openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt

    使用CA服务器签发证书,设置证书的有效期等信息

    注意1:生成完密钥和证书文件后,将本目录{/etc/ssl/certs}的权限修改为500 注意2:在实验环境中可以用命令生成测试,但是在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)

~ ls -l /etc/ssl/certs/vsftpd.*
-rw-r--r--. 1 root root 1208 Jun 27 18:50 /etc/ssl/certs/vsftpd.crt
-rw-r--r--. 1 root root 1005 Jun 27 18:39 /etc/ssl/certs/vsftpd.csr
-rw-r--r--. 1 root root 1679 Jun 27 18:35 /etc/ssl/certs/vsftpd.key

~ chmod 500 /etc/ssl/certs/
  1. 修改主配置文件/etc/vsftpd/vsftpd.conf

    ~ vim /etc/vsftpd/vsftpd.conf
    ssl_enable=YES
    #启用 ssl 认证
    ssl_tlsv1=YES
    ssl_sslv2=YES
    ssl_sslv3=YES
    #开启tlsv1、sslv2、sslv3都支持
    allow_anon_ssl=YES
    #允许匿名用户{虚拟用户}
    force_anon_logins_ssl=YES
    force_anon_data_ssl=YES
    #匿名登录和传输时强制使用ssl
    force_local_logins_ssl=YES
    force_local_data_ssl=YES
    #本地登录和传输时强制使用ssl
    rsa_cert_file=/etc/ssl/certs/vsftpd.crt
    #rsa格式的证书
    rsa_private_key_file=/etc/ssl/certs/vsftpd.key
    #rsa格式的密钥
    

    注意:密钥文件要在配置文件中单独声明(写入配置文件时,注释要单独一行,否则会报错)

  2. 重启服务 ```bash service vsftpd restart chkconfig vsftpd on ; chkconfig —list vsftpd

tcpdump -i eth0 -nn -vv -X tcp port 21 and ip host 10.0.0.1 ```

  1. 测试(使用第三方客户端连接)

FileZilla-FTP(第三方客户端工具)
连接测试时选择:

  • 服务器类型:显示 TLS/SSL
  • 登录类型:一般或者匿名

image.png