需求:使用vsftp创建虚拟账户,每个账户都限制在定义的各自的根目录里。
环境:CentOS7.6

1.安装必须的软件包

yum ×××tall vsftpd libdb-utils

2.设置虚拟账户信息(使用文件存储)
2.1 创建明文账户信息

vim /etc/vsftpd/vuser_list

user0
passwd0
user1
passwd1
说明:上述文件vuser_list存放用户名和密码,奇数行为账号,偶数行为密码。

2.2 创建数据库账户信息
db_load -T -t hash -f /etc/vsftpd/vuser_list /etc/vsftpd/vuser_list.db
3.设置基于虚拟用户验证的PAM文件

vim /etc/pam.d/vsftpd.vuser

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_list
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_list
4.创建虚拟账户的主目录

mkdir /var/ftp/user0

mkdir /var/ftp/user1

更改虚拟账户的宿主用户

chown -R ftp.root /var/ftp
更改宿主目录的权限以禁止匿名用户进入

chmod 700 /var/ftp/*
说明:

ftp默认秘密为空,建议使用修改密码,执行如下命令并按提示输入新的密码。

passwd ftp

此处使用了默认的ftp账户的主目录,也可以单独创建新的账户和主目录,如下:

建立ftp用户目录

mkdir -p /data/ftp

创建用户

useradd -d /data/ftp vuser -s /sbin/nologin

更改权限

chmod 755 /data/ftp

更改宿主账户

chown vuser.root /data/ftp

5.修改vsftpd的配置文件

vim /etc/vsftpd/vsftpd.conf

禁止匿名用户

anonymous_enable=NO

允许本地账户登陆

local_enable=YES

设置本地账户的主目录

local_root=/var/ftp

允许写入

write_enable=YES

设置上传写入掩码

local_umask=022

设置主动方式连接(可以应用与NAT环境)

connect_from_port_20=YES

改变上传文件的宿主账户

chown_upload=YES
chown_username=ftp

设置排他用户

chroot_local_user=YES

设置监听IPv4地址

listen=YES
listen_ipv6=NO

设置PAM文件

pam_service_name=vsftpd.vuser

开启虚拟用户

guest_enable=YES
guest_username=ftp

虚拟用户权限配置目录:'vuser_conf'

user_confg_dir=/etc/vsftpd/vuser_conf
#
userlist_enable=YES
allow_writeable_chroot=YES

  1. 设置每个虚拟账户的配置文件
    准备虚拟账户配置目录

mkdir -p /etc/vsftpd/vuser_conf
创建虚拟账户的个性化配置文件,每个账户的配置文件名与账户名一致,以user0为例进行说明。

vim /etc/vsftpd/vuser_conf/user0

#设置登录后禁锢的目录
local_root=/var/ftp/user0
#开放写权限
write_enable=yes
#开放下载权限
anon_world_readable_only=no
#开放上传权限
anon_upload_enable=yes
#开放创建目录的权限
anon_mkdir_write_enable=yes
#开放删除和重命名的权限
anon_other_write_enable=yes
以上是所有的权限,可以根据需要进行删除。

7.更改防火墙设置
开放ftp服务端口,--permanent作用是永久保存。

firewall-cmd --add-service=ftp --permanent

success
重新加载防火墙设置

firewall-cmd --reload

success
8.更改SELinux设置

setsebool ftpd_full_access on -P

9.启动vsftpd
启动服务

systemctl start vsftpd

设置自启动

systemctl enable vsftpd

10.其他说明
增删账户
增删除账户只需要编辑明文账户,重新生成db文件即可,另外记得新建/删除相应的虚拟账户的主目录。
错误处理:
错误1:226 Transfer done (but failed to open directory)
解决:selinux 和防火墙导致
错误2:500 OOPS: vsftpd: refusing to run with writable root ×××ide chroot()
解决:配置文件中加入 allow_writeable_chroot=YES 针对标准vsftpd(standonly)模式,然后重启ftp
chroot的相关选项:
chroot_local_user=YES|NO
chroot_list_enable=YES|NO
chroot_list_file=/etc/vsftpd/chroot_list
该选项的作用是禁锢ftp的本地用户于家目录之中。 但是限制和不限制哪些用户是相对于chroot_local_user是否开启而言的。chroot_local_user和chroot_list_enable总是背道而驰。
方式一:

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
该方式表明/etc/vsftpd/chroot_list列表里的所有账号都被不会被限制在其家目录里面。列表以外的用户都被限制。
方式二:

chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
该方式表明/etc/vsftpd/chroot_list列表里的所有用户都被限制在其家目录里面,但是该列表以外的用户都不被限制在它们的家目录里面。详细理解自己试验。

listen_ipv6=YES和listen=YES这两个不能同时开启,只能开启其中一个。详情看配置文件上有解释。