一、FTP简介

FTP,即:文件传输协议(File Transfer Protocol),基于客户端/服务器模式,默认使用20、21端口号,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于局域网中,具有容易搭建、方便管理的特点。而且有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术,因此FTP服务得到了广大用户的青睐。
FTP协议有以下两种工作模式:
主动模式(PORT):FTP服务器主动向客户端发起连接请求。
被动模式(PASV):FTP服务器等待客户端发起连接请求(FTP的默认工作模式)。

二、VSFTP简介

vsftpd是一款运行在Linux操作系统上的FTP服务程序,具有很高的安全性和传输速度。
vsftpd有以下三种认证模式:
匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登陆。
本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来简单。
虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。

三、虚拟用户模式安装及配置

1、安装vsftpd服务

yum -y install vsftpd

2、备份原配置

mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

3、修改配置文件如下

#vim /etc/vsftpd/vsftpd.conf
 anonymous_enable=NO
 anon_umask=022
 local_enable=YES
 guest_enable=YES #开启虚拟用户模式
 guest_username=virtual #指定虚拟用户对应的系统用户
 allow_writeable_chroot=YES #允许对FTP根目录执行写入操作
 write_enable=YES
 local_umask=022
 local_root=/home/ftproot
 dirmessage_enable=YES
 xferlog_enable=YES
 connect_from_port_20=YES
 xferlog_std_format=YES
 dual_log_enable=YES
 vsftpd_log_file=/var/log/vsftpd.log
 listen_port=2231
 listen=NO
 listen_ipv6=YES
 pam_service_name=vsftpd.vu #指定PAM文件
 userlist_enable=YES
 tcp_wrappers=YES
 user_config_dir=/etc/vsftpd/vusers_dir #指定虚拟用户配置文件目录
 pasv_min_port=45000
 pasv_max_port=49000

4、创建用于FTP认证的用户数据库文件

#vim /etc/vsftpd/vuser.txt
 注:第一行用户名,第二行密码,依此类推
 test1
 123456
 test2
 123456
 明文信息不安全,需要使用db_load命令用哈希(hash)算法将明文信息转换成数据文件,然后将明文信息文件删除。
 #db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
 #chmod 600 /etc/vsftpd/vuser.db
 #rm -f /etc/vsftpd/vuser.txt

5、创建虚拟用户映射的系统本地用户和FTP根目录

#useradd -d /home/ftproot -s /sbin/nologin virtual
 #chmod -Rf 755 /home/ftproot/

6、建立用于支持虚拟用户的PAM文件

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。PAM采用了分层设计(应用程序层、应用接口层、鉴别模块层)的思想,其结构如下图所示。

新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据文件的路径,但不用写数据文件的后缀。

vim /etc/pam.d/vsftpd.vu
 auth required pam_userdb.so db=/etc/vsftpd/vuser
 account required pam_userdb.so db=/etc/vsftpd/vuser

7、为两个虚拟用户设置不同的权限,不同账户有不同的根目录

#mkdir /etc/vsftpd/vusers_dir
 #touch /etc/vsftpd/vusers_dir/test1
 #vim /etc/vsftpd/vusers_dir/test2
 anon_upload_enable=YES
 anon_mkdir_write_enable=YES
 anon_other_write_enable=YES
 local_root=/home/ftproot/test1

8、重启vsftpd服务

#systemctl restart vsftpd

7、测试

[root@wuhs vusers_dir]# ftp 192.168.0.100
 Connected to 192.168.0.100 (192.168.0.100).
 220 (vsFTPd 3.0.2)
 Name (192.168.0.186:root): test1
 331 Please specify the password.
 Password:
 230 Login successful.
 Remote system type is UNIX.
 Using binary mode to transfer files.
 ftp> pwd
 257 “/”
 ftp> ls