1 安装

[root@CentOS7-01 ~]#yum -y install vsftpd

2 vsftpd服务常见配置

#主配置文件
/etc/vsftpd/vsftpd.conf

2.1 命令端口

listen_port=port #默认为21,如果需要将vsftpd服务暴露在公网,建议修改为其它端口

2.2 匿名用户登录

2.2.1 支持匿名用户

anonymous_enable=YES #默认为YES

2.2.2 匿名用户略过口令检查,默认为NO

修改前

FTP(vsftpd) for CentOS7

修改后

# 在配置文件最后面加上下面的配置,然后重启vsftpd
no_anon_password=YES

[root@CentOS7-01 ~]#systemctl restart vsftpd

FTP(vsftpd) for CentOS7

2.3 匿名用户上传

2.3.1支持匿名用户上传

默认情况下,匿名用户只能下载ugo三者都有读权限的文件,但是不能上传,如下图

FTP(vsftpd) for CentOS7

# 要想支持匿名用户上传,需要修改配置文件
anon_upload_enable=YES #把前面的#去掉即可,然后重启服务
[root@CentOS7-01 ~]#systemctl restart vsftpd

虽然配置了允许匿名用户上传,但是再次上传还是报错,不过原因是因为目录权限导致

FTP(vsftpd) for CentOS7

#默认情况下,/var/ftp/pub目录权限为755,所以匿名用户无法往这个目录上传文件
# [root@CentOS7-01 ~]#ll /var/ftp/pub/ -d
drwxr-xr-x 2 root root 6 Dec 18 11:15 /var/ftp/pub/

# 利用acl为ftp用户设置rwx权限
[root@CentOS7-01 ~]#setfacl -m u:ftp:rwx /var/ftp/pub/
[root@CentOS7-01 ~]#getfacl /var/ftp/pub/
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/pub/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x

FTP(vsftpd) for CentOS7

2.3.2 匿名创建目录

FTP(vsftpd) for CentOS7

# 如上图所示,匿名用户默认不能创建目录,需改配置文件
anon_mkdir_write_enable=YES #把前面的#去掉即可,然后重启服务
[root@CentOS7-01 ~]#systemctl restart vsftpd

FTP(vsftpd) for CentOS7

2.3.3 只能下载ugo三者都有读权限的文件,默认YES

FTP(vsftpd) for CentOS7

# 如上图,复制f2文件到本地的时候,提示报错,来看下该文件的权限
[root@CentOS7-01 ~]#ll /var/ftp/pub/
total 0
-rw------- 1 ftp ftp 0 Dec 18 11:23 f1
-rw------- 1 ftp ftp 0 Dec 18 11:22 f2
drwx------ 2 ftp ftp 6 Dec 18 11:33 新文件夹

# 可以看到f2文件权限为600,只有属主有读权限,这里将它改为444就能下载了
[root@CentOS7-01 ~]#chmod 444 /var/ftp/pub/f2

FTP(vsftpd) for CentOS7

# 通过上面临时修改文件权限的方法虽然可以成功下载了,但如果文件量多起来了, 还是手工改权限是不现实的,所以,可以在配置文件加上如下配置,然后重启服务
anon_world_readable_only=NO
[root@CentOS7-01 ~]#systemctl restart vsftpd

2.3.4 指定匿名上传文件的umask,默认077

# 默认情况下匿名用户上传的文件权限为600,所有不能下载,要想能把上传的文件下载下来,可以修改配置文件
anon_umask=033 #在配置文件加上此设置,然后重启服务
[root@CentOS7-01 ~]#systemctl restart vsftpd

# 添加了此配置之后,上传的文件默认权限就是644,而不用手动修改权限实现下载了

2.3.5 可删除和修改上传的文件,默认NO

FTP(vsftpd) for CentOS7

# 要想实现匿名用户删除上传的文件,需修改配置文件
anon_other_write_enable=YES #在文件最后添加此行,然后重启服务

[root@CentOS7-01 ~]#systemctl restart vsftpd

FTP(vsftpd) for CentOS7

2.4 指定匿名用户上传的文件的默认所有者和权限

# 在配置文件中,修改一下内容
chown_uploads=YES #去掉前面的#号,默认为NO
chown_username=hechunping #修改为指定的所有者
chown_upload_mode=0644 #在文件最后加上此行

# 测试上传新文件file1
[root@CentOS7-01 ~]#ll /var/ftp/pub/
total 0
-rw-r--r-- 1 hechunping ftp 0 Dec 18 14:22 file1.txt

2.5 Linux系统用户

local_enable=YES #是否允许linux用户登录,默认YES
write_enable=YES #允许linux用户上传文件,默认YES
local_umask=022 #指定系统用户上传文件的默认权限,默认022

FTP(vsftpd) for CentOS7

2.6 将系统用户映射为指定的guest用户

guest_enable=YES #所有系统用户都映射成guest用户
guest_username=ftpuser #配合上面选项才生效,指定guest用户
local_root=/ftproot #guest用户登录后所在的目录

FTP(vsftpd) for CentOS7

2.7 禁锢系统用户

2.7.1 禁锢所有系统用户在其家目录中

#将前面的#去掉,然后重启服务
chroot_local_user=YES #禁锢系统用户在其家目录中, 默认NO,即不禁锢

[root@CentOS7-01 ~]#systemctl restart vsftpd

2.7.2 禁锢或不禁锢特定的系统用户在其家目录中,与上面设置功能相反

# 修改配置文件,然后重启服务
chroot_list_enable=YES #去掉前面的#即可
chroot_list_file=/etc/vsftpd/chroot_list #同上,该文件需手工创建

[root@CentOS7-01 ~]#systemctl restart vsftpd
# 注意
1)当chroot_local_user=YES时,则chroot_list中用户不禁锢
2)当chroot_local_user=NO时,则chroot_list中用户禁锢

FTP(vsftpd) for CentOS7

2.7.3 出现的错误:500 OOPS: vsftpd: refusing to run with writable root inside chroot()

# 当用户被禁锢在其家目录的情况下,登录会出现上面的错误,因为vsftpd安全检查原因,根目录不能用写权限,但子目录可以有,解决的方法有以下两种
1)去掉根目录的写权限
chmod -w /home/user
2)在配置文件最后添加如下配置,然后重启
allow_writeable_chroot=YES

2.8 日志

# wu-ftp日志:默认启用
xferlog_enable=YES 启用记录上传下载日志,此为默认值
xferlog_std_format=YES 使用wu-ftp日志格式,此为默认值
xferlog_file=/var/log/xferlog 可自动生成, 此为默认值

# 上面的日志格式太简单,不易读,所以使用vsftpd日志
# vsftpd日志:默认不启用
dual_log_enable=YES #在配置文件最后加上此配置,然后重启服务
vsftpd_log_file=/var/log/vsftpd.log #加了上面的配置后,该文件会自动生成。

2.9 提示信息

2.9.1 登录提示信息

ftpd_banner=Welcome to hechunping FTP service. #先将前面的#注释去掉,然后修改为自定义的提示信息
banner_file=/etc/vsftpd/ftpbanner.txt #也可以加上此项配置,将提示信息写到自定义配置文件中
[root@CentOS7-01 ~]#vim /etc/vsftpd/ftpbanner.txt
^[[31m非法用户,禁止登录^[[0m

#操作提示:先按crtl+v,然后不松开再按[

FTP(vsftpd) for CentOS7

2.9.2 目录访问提示信息

dirmessage_enable=YES #默认值,不用动
message_file=.message #在配置文件最后面加上,然后将这个文件建在要访问的目录中,比如用户hechunping的家目录/home/hechunping
[root@CentOS7-01 ~]#vim /home/hechunping/.message
^[[32m这是hechunping的家目录^[[0m

FTP(vsftpd) for CentOS7

2.10 PAM模块实现用户访问控制

[root@CentOS7-01 ~]#vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd #此为默认值

# pam配置文件
/etc/pam.d/vsftpd
# 在下面这个配置文件的用户将被拒绝登录ftp服务器
[root@CentOS7-01 ~]#cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

2.11 是否启用控制用户登录的列表文件

userlist_enable=YES #默认值,不用动
userlist_deny=YES(默认值) #黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/users_list #此为默认值,在此文件中的用户会被直接拒绝,甚至不会提示输入密码

2.12 指定运行vsftpd服务的用户身份

nopriv_user=nobody #此为默认值

2.13 连接数限制

max_clients=number #最大并发连接数,默认2000
max_per_ip=number #每个IP同时发起的最大连接数,默认50

2.14 传输速率,字节/秒

anon_max_rate=0 #匿名用户的最大传输速率,默认为0,不限制
local_max_rate=0 #本地用户的最大传输速率,默认为0,不限制

2.15 连接时间,以秒为单位

connect_timeout=60 #主动模式数据连接超时时长,默认值
accept_timeout=60 #被动模式数据连接超时时长,默认值
data_connection_timeout=300 #数据连接无数据输超时时长,默认值
idle_session_timeout=300 #无命令操作超时时长,默认值

2.16 优先以文本方式传输

ascii_upload_enable=YES #默认为NO
ascii_download_enable=YES #同上

2.17 实现基于SSL的FTPS

# 查看是否支持SSL
[root@CentOS7-01 certs]#ldd `which vsftpd` | grep libssl.so
    libssl.so.10 => /lib64/libssl.so.10 (0x00007f7dfd1fa000)

# 创建自签名证书
[root@CentOS7-01 ~]#cd /etc/pki/tls/certs/
[root@CentOS7-01 certs]#make vsftpd.pem
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2  ; \
cat $PEM1 >  vsftpd.pem ; \
echo ""    >> vsftpd.pem ; \
cat $PEM2 >> vsftpd.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
.............................................+++
........................+++
writing new private key to '/tmp/openssl.SOcSWK'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:abc
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:hechunping
Email Address []:
[root@CentOS7-01 certs]#ls
ca-bundle.crt        make-dummy-cert  renew-dummy-cert
ca-bundle.trust.crt  Makefile         vsftpd.pem

# 配置vsftpd服务支持SSL,然后重启服务,再使用客户端工具FileZilla测试
[root@CentOS7-01 certs]#vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES # 默认为NO
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem #指定证书位置
[root@CentOS7-01 certs]#systemctl restart vsftpd

FTP(vsftpd) for CentOS7

3 vsftpd虚拟用户

# a.什么是虚拟用户
1)所有虚拟用户会统一映射为一个指定的系统账号:访问共享位置,即为此系统账号的家目录
2)各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
# b.虚拟用户账号的存储方式
1)文件:编辑文本文件,此文件需要被编码为hash格式,奇数行为用户名,偶数行为密码
db_load -T -t hash -f vusers.txt vusers.db
2)关系型数据库中的表中:实时查询数据库完成用户认证
vsftpd支持mysql库:pam要依赖于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README

3.1 实现基于文件验证的vsftpd虚拟用户

3.1.1 创建用户数据库文件

[root@CentOS7-01 ~]#cat /etc/vsftpd/vusers.txt 
hechunping
123.com
xiaoming
123.com
[root@CentOS7-01 ~]#cd /etc/vsftpd/
db_load -T -t hash -f vusers.txt vusers.db
[root@CentOS7-01 vsftpd]#chmod 600 vusers.db

3.1.2 创建用户和访问FTP目录

[root@CentOS7-01 vsftpd]#useradd -d /data/ftproot -s /sbin/nologin -r vuser
[root@CentOS7-01 vsftpd]#mkdir -pv /data/ftproot/upload
[root@CentOS7-01 vsftpd]#setfacl -m u:vuser:rwx /data/ftproot/upload

3.1.3 创建pam配置文件

[root@CentOS7-01 vsftpd]#vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.db

3.1.4 为虚拟用户建立独立的配置文件

# a.指定各个用户配置文件存放的路径
[root@CentOS7-01 vsftpd]#vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/

# b.创建各个用户配置文件存放的路径
[root@CentOS7-01 vsftpd]#mkdir /etc/vsftpd/vusers.d
[root@CentOS7-01 vsftpd]#cd /etc/vsftpd/vusers.d

# c.创建用户hechunping的配置文件,允许可读可写,其它用户只读
[root@CentOS7-01 vusers.d]#cat hechunping 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

# d.创建用户xiaoming的配置文件,将其登录目录更改为/data/ftproot2
[root@CentOS7-01 vusers.d]#cat xiaoming
local_root=/data/ftproot2

3.1.4.1 测试虚拟用户hechunping的权限

[root@CentOS7-01 vusers.d]#ll /data/ftproot/upload/
total 0

# 在另一台主机上用hechunping虚拟用户登录
[root@CentOS7-02 ~]#ftp 192.168.7.71
Connected to 192.168.7.71 (192.168.7.71).
220 (vsFTPd 3.0.2)
Name (192.168.7.71:root): hechunping
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,7,71,44,8).
150 Here comes the directory listing.
drwxrwxr-x    2 0        0               6 Dec 23 12:07 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,7,71,146,66).
150 Here comes the directory listing.
226 Directory send OK.
ftp> !ls
anaconda-ks.cfg  test
ftp> put test
local: test remote: test
227 Entering Passive Mode (192,168,7,71,176,83).
150 Ok to send data.
226 Transfer complete.
ftp> ls
227 Entering Passive Mode (192,168,7,71,108,131).
150 Here comes the directory listing.
-rw-------    1 997      995             0 Dec 23 12:11 test
226 Directory send OK.
# 从上面的结果发现虚拟用户hechunping是可读可写的

3.1.4.2 测试虚拟用户xiaoming的权限

[root@CentOS7-01 vusers.d]#ls /data/ftproot2/
file1

# 在另一台主机上用xiaoming虚拟用户登录
[root@CentOS7-02 ~]#ftp 192.168.7.71
Connected to 192.168.7.71 (192.168.7.71).
220 (vsFTPd 3.0.2)
Name (192.168.7.71:root): xiaoming
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,7,71,228,90).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 23 09:43 file1
226 Directory send OK.
ftp> !ls
anaconda-ks.cfg  test
ftp> put test
local: test remote: test
227 Entering Passive Mode (192,168,7,71,106,6).
550 Permission denied.
ftp> cd /etc
550 Failed to change directory.
ftp> get file1
local: file1 remote: file1
227 Entering Passive Mode (192,168,7,71,187,241).
150 Opening BINARY mode data connection for file1 (0 bytes).
226 Transfer complete.
ftp> 
# 从上面的结果来看,虚拟用户xiaoming不能写和切换到别的目录,只能下载指定登录的目录中的文件

3.2 实现基于MYSQL验证的vsftpd虚拟用户

环境准备
OS:CentOS7
FTP服务器1台
数据库服务器一台

3.2.1 在数据库服务器上安装mysql数据库

[root@CentOS7-02 ~]#yum –y install mariadb-server
[root@CentOS7-02 ~]#systemctl enable --now mariadb

3.2.2 在数据库服务上配置数据库以支持vsftpd服务

# a.建立存储虚拟用户信息的数据库和表
MariaDB [(none)]> create database vsftpd;
MariaDB [(none)]> use vsftpd;
MariaDB [(none)]> CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL );
# b.添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储
MariaDB [vsftpd]> INSERT INTO users(name,password) values('zhangsan',password('123.com'));
Query OK, 1 row affected (0.00 sec)

MariaDB [vsftpd]> INSERT INTO users(name,password) values('lisi',password('123.com'));
Query OK, 1 row affected (0.00 sec)

# c.创建连接vsftpd数据库的用户
MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'192.168.7.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)

MariaDB [vsftpd]> flush privileges;
Query OK, 0 rows affected (0.01 sec)

3.2.3 在FTP服务器上安装vsftpd和pam_mysql包

# a.安装vsftpd
[root@CentOS7-01 ~]#yum -y install vsftpd
# b.源码编译安装pam-mysql
1)相关依赖包安装
[root@CentOS7-01 ~]#yum install vsftpd gcc gcc-c++ make mariadb-devel pam-devel
2)下载和编译安装pam-mysql
[root@CentOS7-01 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@CentOS7-01 ~]#tar xvf pam_mysql-0.7RC1.tar.gz
[root@CentOS7-01 ~]#cd pam_mysql-0.7RC1
[root@CentOS7-01 pam_mysql-0.7RC1]#./configure --with-pam-mods-dir=/lib64/security
[root@CentOS7-01 pam_mysql-0.7RC1]#make -j `lscpu |awk 'NR==4{print $2}'` && make install
[root@CentOS7-01 pam_mysql-0.7RC1]#ll /lib64/security/pam_mysql.*
-rwxr-xr-x 1 root root    882 Dec 23 17:56 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141712 Dec 23 17:56 /lib64/security/pam_mysql.so

3.2.4 在FTP服务器上建立pam认证所需文件

[root@CentOS7-01 pam_mysql-0.7RC1]#cat /etc/pam.d/vsftpd.mysql 
auth required pam_mysql.so user=vsftpd passwd=123.com host=192.168.7.72 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123.com host=192.168.7.72 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

注:以上参考pam_mysql-0.7RC1.tar.gz包的README文档

crypt加密方式说明:

0 (or "plain") 表示不加密
1 (or "Y") 表示使用crypt(3)函数加密
2 (or "mysql") 表示使用mysql password()函数加密
3 (or "md5") 表示使用md5加密
4 (or "sha1") 表示使用sha1加密

配置字段说明

auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so 该模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
user=vsftpd 登录mysql的用户
passwd=123.com 登录mysql的密码
host=192.168.7.72 mysql服务器的ip地址
db=vsftpd 指定连接mysql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密

3.2.5 建立相应用户和修改vsftpd配置文件

# a.建立虚拟用户映射的系统用户及对应的目录
[root@CentOS7-01 pam_mysql-0.7RC1]#useradd -d /data/ftproot -s /sbin/nologin -r vuser
# b.拿掉ftp根目录的写权限
[root@CentOS7-01 pam_mysql-0.7RC1]#chmod 555 /data/ftproot
mkdir -pv /data/ftproot/{upload,pub}
setfacl –m u:vuser:rwx /data/ftproot/{upload,pub}
# c.确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES
# d.添加下面两项
guest_enable=YES             
guest_username=vuser
# e.修改下面一项,原系统用户将无法登录
pam_service_name=vsftpd.mysql
# f.启动并设置开机自启vsftpd服务
[root@CentOS7-01 pam_mysql-0.7RC1]#systemctl enable --now vsftpd

3.2.6 在FTP服务器上配置虚拟用户具有不同的访问权限

vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可

# a.配置vsftpd虚拟用户使用的配置文件目录
[root@CentOS7-01 pam_mysql-0.7RC1]#vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/
# b.创建所需要的目录,并为虚拟用户提供配置文件
[root@CentOS7-01 pam_mysql-0.7RC1]#mkdir /etc/vsftpd/vusers.d/
[root@CentOS7-01 pam_mysql-0.7RC1]#cd /etc/vsftpd/vusers.d/
[root@CentOS7-01 pam_mysql-0.7RC1]#touch zhangsan lisi
[root@CentOS7-01 vusers.d]#ls
lisi  zhangsan
# c.配置虚拟用户的访问权限
[root@CentOS7-01 vusers.d]#cat zhangsan 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

[root@CentOS7-01 vusers.d]#cat lisi
local_root=/data/ftproot2

3.2.6.1 测试虚拟用户zhangsan的权限

[root@CentOS7-01 ftproot]#tree -d /data/ftproot
/data/ftproot
├── pub
└── upload

2 directories

# 在另一台主机上用虚拟用户zhangsan登录
[root@CentOS7-02 ~]#ftp 192.168.7.71
Connected to 192.168.7.71 (192.168.7.71).
220 (vsFTPd 3.0.2)
Name (192.168.7.71:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,7,71,107,185).
150 Here comes the directory listing.
drwxrwxr-x    2 0        0               6 Dec 23 13:13 pub
drwxrwxr-x    2 0        0               6 Dec 23 13:32 upload
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> !ls
anaconda-ks.cfg  file1  test
ftp> ls
227 Entering Passive Mode (192,168,7,71,129,21).
150 Here comes the directory listing.
226 Directory send OK.
ftp> put test
local: test remote: test
227 Entering Passive Mode (192,168,7,71,241,98).
150 Ok to send data.
226 Transfer complete.
# 从上面的结果可以发现,虚拟用户zhangsan具有读写权限

3.2.6.2 测试虚拟用户lisi的权限

[root@CentOS7-01 ~]#tree /data/ftproot2/
/data/ftproot2/
└── file1

0 directories, 1 file

# 在在另一台主机上用虚拟用户lisi登录
[root@CentOS7-02 ~]#ftp 192.168.7.71
Connected to 192.168.7.71 (192.168.7.71).
220 (vsFTPd 3.0.2)
Name (192.168.7.71:root): lisi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,7,71,66,122).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 23 09:43 file1
226 Directory send OK.
ftp> !ls
anaconda-ks.cfg  file1  test
ftp> put test
local: test remote: test
227 Entering Passive Mode (192,168,7,71,32,137).
550 Permission denied.
ftp> cd /var
550 Failed to change directory.
ftp> get file1
local: file1 remote: file1
227 Entering Passive Mode (192,168,7,71,180,77).
150 Opening BINARY mode data connection for file1 (0 bytes).
226 Transfer complete.
ftp> 
# 从上面的结果来看,虚拟用户lisi不能写和切换到别的目录,只能下载指定登录的目录中的文件

3.3 总结

基于文件和MySQL验证的vsftpd虚拟用户的区别:
# a.基于文件验证的vsftpd虚拟用户需要手工创建存放用户名和密码的文本文件,不方便管理,并且该文件被编码为hash格式之后还能看到相关的信息
[root@CentOS7-01 ~]#cat /etc/vsftpd/vusers.db
a        
낚23.comxiaoming 
 ȩcRэh^123.comhechunping
# b.基于MySQL验证的vsftpd虚拟用户不用事先创建相关的文本文件,直接在相关的用户表使用SQL语句创建即可,维护起来更加方便,并且密码是使用mysql password()函数加密过的,更加安全。推荐使用方式