1. 检测是否已安装 vsftpd
# 未安装 ,进入步骤 2 
[root@iZbp1hduhk14ug5p2lvazwZ ~]# vsftpd -v
-bash: vsftpd: command not found
# 已安装, 进入步骤 3
[root@iZbp1hduhk14ug5p2lvazwZ ~]# vsftpd -v
vsftpd: version 3.0.2
  1. 安装 vsftp
yum -y install vsftpd
# 设置开机自启动
systemctl enable vsftpd.service
# 开放内核权限
setsebool -P ftp_home_dir=1
  1. 为虚拟用户创建一个本地用户
    vsftp 虚拟用户想要创建文件夹或者上传文件,还需要依赖一个本地用户。
    此处创建一个无法使用终端登录的 用户 vsftpd
# 添加用户并指定主目录和权限
useradd vsftpd -d /home/vsftpd -s /bin/false
# 更改主目录所有权至 vsftpd
chown vsftpd:vsftpd /home/vsftpd
  1. 修改 vsftp 配置文件 , 默认在 /etc/vsftpd/ 目录下
vim vsftpd.conf

增加下面配置

# pasv 
pasv_enable=yes
pasv_min_port=10020
pasv_max_port=10040

# This directive allow virtual user to login
guest_enable=YES
guest_username=vsftpd
# This dirctive specifies the user permissions configuration directory
user_config_dir=/etc/vsftpd/vsftpd_user_conf
# Allow , or will 500 error
chroot_local_user=YES
allow_writeable_chroot=YES
# This directive specifies the PAM file
pam_service_name=vsftpd.vu
# 使得创建的文件或者文件夹其他用户有执行和读的权限
anon_umask=0062

验证方式有很多种 , 常用的为本地数据文件方式和 mysql 方式

  1. 本地数据文件方式
    a. 创建文件 /etc/pam.d/vsftpd.vu , 添加下面两行 , vsftpd_login 表示数据文件
auth       sufficient   pam_userdb.so   db=/etc/vsftpd/vsftpd_login
account    sufficient   pam_userdb.so   db=/etc/vsftpd/vsftpd_login

b. 在 /etc/vsftpd/ 目录下创建文件夹

mkdir /etc/vsftpd/vsftpd_user_conf
# 此文件夹下文件名为虚拟用户名,可配置虚拟用户主目录和权限

c. 自定义脚本,自动创建配置文件

cd /etc/vsftpd/vsftpd_user_conf
# 进入文件夹,在文件夹下创建对应的脚本
vim create_bash_config.sh

脚本内容

#!/bin/bash
username=$1;
rm -f /etc/vsftpd/vsftpd_user_conf/$username;
touch /etc/vsftpd/vsftpd_user_conf/$username;
echo "local_root=/home/vsftpd/$username
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_world_readable_only=no
">>/etc/vsftpd/vsftpd_user_conf/$username;

d. 进入到配置目录,添加脚本 adduser.sh

cd /etc/vsftpd/
# 进入文件夹,在文件夹下创建对应的脚本
touch login.txt
vim adduser.sh

脚本内容

#!/bin/bash
echo -n "please input username:";
read username;
if [ ! $username ]
then
	echo "username can not empty";
	exit;
fi
echo -n "pelase input password:";
read passwd;
if [ ! $passwd ]
then
        echo "username can not empty";
        exit;
fi
#echo "username: $username";
#echo "password: $passwd";
#echo $username>>login.txt;
#echo $passwd>>login.txt;

echo -n "save to db? y/n: ";
read re;
if [[ $re = "y" || $re = "Y" ]]
then 
	echo $username>>login.txt;
	echo $passwd>>login.txt;
	db_load -T -t hash -f login.txt vsftpd_login.db;
	mkdir /home/vsftpd/$username;
	chown vsftpd:vsftpd /home/vsftpd/$username;
	sh /etc/vsftpd/vsftpd_user_conf/create_bash_config.sh $username;
	echo "save sucess!!!";
else
	echo "do not save";
	exit;
fi

echo "show users";
cat login.txt;

e. 设置 adduser.sh 可执行,并启动 ftp

chmod +x adduser.sh

systemctl start vsftpd.service

# 添加用户
./adduser.sh
  1. 如果是 mysql 验证方式
    a. 创建文件 /etc/pam.d/vsftpd.vu , 添加下面两行 ,简单的来说,就是在mysql 中创建一个数据库 vftpuser,并将 此数据库下的 user 表的查询权限给到用户 vftpuser (数据库名、用户名、表名没有特殊要求,因为都需要指定)
auth required pam_mysql.so user=vftpuser passwd=111111 host=localhost db=vftpuser table=user usercolumn=name passwdcolumn=passwd crypt=0

account required pam_mysql.so user=vftpuser passwd=111111 host=localhost db=vftpuser table=user usercolumn=name passwdcolumn=passwd crypt=0

# crypt=0:表示口令使用明文方式保存在数据库中
# crypt=1:表示口令使用UNIX的DES加密方式加密后保存在数据库中
# crypt=2:表示口令使用MySQL的password()函数加密后保存在数据库中
# crypt=3:表示口令使用MD5散列值的方式保存在数据库中

b. 安装 mysql_pam 模块 (http://sourceforge.net/projects/pam-mysql)

下载  pam_mysql-0.7RC1.tar.gz

tar zxvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security
make
make install

c. 在 /etc/vsftpd/ 目录下创建文件夹,并启动 vsftpd

# 此文件夹下文件名为虚拟用户名,可配置虚拟用户主目录和权限
mkdir /etc/vsftpd/vsftpd_user_conf

systemctl start vsftpd.service
  1. 总结
    mysql 验证效果和 login.db 的作用一样。 /etc/vsftpd/vsftpd_user_conf 需要自己创建