[RHEL]-17-Vsftpd使用详解

引言

这篇文章将详细介绍RHEL系统中最常用的FTP文件传输服务Vsftpd。

文章目录

0×1.安装Vsftpd

Vsftpd(Very Secure FTP Daemon)是一款Linux系统中开源的FTP服务端程序,可以实现客户端到服务端的文件传输,由于FTP协议本身在传输用户名和密码时是明文传输的,Vsftpd只是对FTP协议进行了封装,所以传输密钥仍然使用了明文的传输方式。

在FTP协议中规定,默认情况下,20号端口用于传输数据(上传下载文件等),21号端口用于接收或发送用户FTP命令(传输控制指令)。

配置好yum仓库后,使用下面的命令将vsftpd安装到系统中:

					[root@qingsword.com ~]# yum install -y vsftpd
					

vsftpd目录结构:

主程序位置:/usr/sbin/vsftpd
用户禁止登陆列表文件(两个文件中任意一个包含了某个用户,那个用户就无法用来登录ftp):/etc/vsftpd/ftpusers以及/etc/vsftpd/user_list
主配置文件位置:etc/vsftpd/vsftpd.conf

主配置文件参数详解:

listen=[YES|NO] 是否以独立方式监听服务,保持默认no即可;
listen_address=IP地址 监听的IP地址,当服务器上有多块网卡时,可配置由哪块网卡来接收FTP请求;
listen_port=21 FTP服务的监听端口;
download_enable=[YES|NO] 是否允许下载文件;
userlist_enable=[YES|NO] 同下;
userlist_deny=[YES|NO] 是否启用"禁止登陆用户名单;
max_clients=0 最大客户端连接数,0为不限制;
max_per_ip=0 同一IP地址最大连接数,0为不限制;
anonymous_enable=[YES|NO] 是否允许匿名用户访问;
anon_upload_enable=[YES|NO] 是否允许匿名用户上传文件;
anon_umask=022 匿名用户上传文件的umask值;
anon_root=/var/ftp 匿名用户的FTP根目录(默认不指定就是/var/ftp目录,安装服务时已经创建好了);
anon_mkdir_write_enable=[YES|NO] 是否允许匿名用户创建目录;
anon_other_write_enable=[YES|NO] 是否开放匿名用户其他写入权限;
anon_max_rate=0 匿名用户最大传输速率(字节),0为不限制;
local_enable=[YES|NO] 是否允许本地用户登陆FTP;
local_umask=022 本地用户上传文件的umask值;
local_root=/var/ftp 本地用户的FTP根目录;
chroot_local_user=[YES|NO] 是否将用户权限禁锢在FTP目录;
local_max_rate=0 本地用户最大传输速率(字节),0为不限制;

在下面的实验中主要修改vsftpd的主配置文件vsftpd.conf 来实现不同的登录验证方式。

0×2.Vsftpd三种登录方式

实验环境:

RHEL7 vsftpd服务端,IP 192.168.1.233/24;
Ubuntu 客户端,IP 192.168.1.105/24,命令行使用ftp客户端工具登录到服务端;
两台系统处在同一局域网,且能够互相ping通;

a.匿名登录

匿名的登录方式不需要验证,任何人都能够通过anonymous这个匿名用户名称来登录ftp服务端,vsftpd安装后,默认是支持匿名登录的,但需要使用vim添加几个参数,赋予匿名用户权限:

1)修改配置文件

					#如果觉得主配置文件中的注释行太多,可以使用下面的方法将注释全部筛选删除掉

					#首先给主配置做一个备份
					[root@qingsword.com ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bk

					#将主配置备份文件中的带#的部分全部筛选掉,将剩下的部分写入主配置文件中
					[root@qingsword.com ~]# grep -v "#" /etc/vsftpd/vsftpd.conf.bk > /etc/vsftpd/vsftpd.conf

					#使用vim编辑主配置文件,筛选后只剩下下面这几行,保持其余的配置文件不需要变,在anonymous_enable下面添加几行配置
					[root@qingsword.com ~]# vim /etc/vsftpd/vsftpd.conf

					##允许匿名用户##
					anonymous_enable=YES
					#创建文件时的umask值
					anon_umask=022
					#允许上传
					anon_upload_enable=YES
					#允许创建目录
					anon_mkdir_write_enable=YES
					#允许修改目录名或删除等操作
					anon_other_write_enable=YES
					#最大传输速率256Kb
					anon_max_rate=262144
					#默认的根目录
					anon_root=/home/anonymous_dir
					#匿名用户登录时不询问密码
					no_anon_password=YES
					##END##

					#其他的配置暂时不需要修改
					local_enable=YES
					write_enable=YES
					local_umask=022
					dirmessage_enable=YES
					xferlog_enable=YES
					connect_from_port_20=YES
					xferlog_std_format=YES
					listen=NO
					listen_ipv6=YES
					pam_service_name=vsftpd
					userlist_enable=YES
					tcp_wrappers=YES
					

2)创建对应目录,并设置权限

					#创建根目录以及子目录(在新版的vsftpd中,不允许匿名用户的根目录拥有写权限,否则登录会报错[500 OOPS],所以需要创建一个子目录提供给匿名用户上传文件)
					[root@qingsword.com ~]# mkdir -p /home/anonymous_dir/ftp

					#将根目录及其子目录的所属用户改成ftp
					[root@qingsword.com ~]# chown -R ftp /home/anonymous_dir/

					#将根目录的写权限去掉
					[root@qingsword.com ~]# chmod u-w /home/anonymous_dir/

					[root@qingsword.com ~]# ls -ld /home/anonymous_dir/
					dr-xr-xr-x. 2 ftp root 6 Nov 29 01:35 /home/anonymous_dir/
					

3)对iptables的设置

					#如果开启了iptables,可以添加外部访问ftp21和20端口规则为允许,本例选择直接清空防火墙的规则,否则客户端将无法连接到服务端的21号端口
					[root@qingsword.com ~]# iptables -F
					[root@qingsword.com ~]# service iptables save
					

4)配置SElinux

					#SElinux默认是开启的,如果觉得下面的配置很麻烦,可以使用"setenforce 0"命令来关闭SElinux

					#查看SElinux中与ftp域相关的配置
					[root@qingsword.com ~]# getsebool -a | grep ftp
					ftp_home_dir --> off
					ftpd_anon_write --> off
					ftpd_connect_all_unreserved --> off
					ftpd_connect_db --> off
					ftpd_full_access --> off
					ftpd_use_cifs --> off
					ftpd_use_fusefs --> off
					ftpd_use_nfs --> off
					ftpd_use_passive_mode --> off

					#开启对ftp的完全访问权
					[root@qingsword.com ~]# setsebool -P ftpd_full_access=on
					

5)重启vsftpd服务

					[root@qingsword.com ~]# systemctl restart vsftpd

					#如果想让vsftpd开机自启动,可以使用下面的命令	
					[root@qingsword.com ~]# systemctl enable vsftpd
					

6)登录与传输文件测试

					qing@qingsword.com:~$ ftp 192.168.1.233
					Connected to 192.168.1.233.
					220 (vsFTPd 3.0.2)

					#用户名输入anonymous回车即可登录
					Name (192.168.1.233:qing): anonymous

					#因为根目录不可写,所以切换到ftp目录中
					ftp> cd ftp
					250 Directory successfully changed.

					#测试创建文件夹,成功
					ftp> mkdir qingsword.com
					257 "/ftp/qingsword.com" created
					ftp> ls
					drwxr-xr-x  2 14  50  6 Nov 29 07:53 qingsword.com
					
					#将本地当前目录切换至/home/qing/test
					ftp> lcd /home/qing/test
					Local directory now /home/qing/test

					#显示本地当前目录
					ftp> lcd
					Local directory now /home/qing/test

					#使用感叹号前缀可以显示本地当前目录中的文件
					ftp> !ls
					if.py ifshell.sh 

					#关闭交互模式,交互模式关闭后,上传或下载多个文件时不需要一个个去按回车确认,想要开启交互模式再次运行此命令即可
					ftp> prompt

					#使用mput命令将本地多个文件上传到服务器(put命令仅能传输单个文件)
					ftp> mput if.py ifshell.sh

					ftp> ls
					-rw-r--r--  1 14  50  432 Nov 29 08:05 if.py
					-rw-r--r--  1 14  50  200 Nov 29 08:05 ifshell.sh
					drwxr-xr-x    2  14   506 Nov 29 07:53 qingsword.com

					#重命名操作
					ftp> rename qingsword.com www.qingsword.com

					#将服务器上的文件下载到本地(或使用mget下载多个文件)
					ftp> get if.py

					#删除多个文件
					ftp> mdelete hello.py ifshell.sh
					
					#查看命令列表
					ftp> ?
					

b.系统用户登录

实验环境保持不变,服务端还原成刚安装好vsftpd的状态,继续这一部分的实验。

1)创建ftp主目录

					#创建ftp主目录,并设置权限(因为是root用户创建的目录,如果不将other设置成7权限,其他用户登录这个目录后将无法创建和修改文件)
					[root@qingsword.com ~]# mkdir /home/ftpuser
					[root@qingsword.com ~]# chmod 777 /home/ftpuser
					

2)修改主配置文件

					#备份
					[root@qingsword.com ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bk

					#删除注释
					[root@qingsword.com ~]# grep -v "#" /etc/vsftpd/vsftpd.conf.bk > /etc/vsftpd/vsftpd.conf

					#修改配置
					[root@qingsword.com ~]# vim /etc/vsftpd/vsftpd.conf
					
					#关闭匿名用户可登陆权
					anonymous_enable=NO

					##允许系统用户##
					#本地用户模式开启
					local_enable=YES
					#允许本地用户写权限
					write_enable=YES
					#本地用户创建文件时的umask值
					local_umask=022
					#所有系统用户登录ftp后,都在这个目录下
					local_root=/home/ftpuser
					#限制速率为256Kb
					local_max_rate=262144
					#允许ftp根目录可写权限(在扩展板的vsftpd中这个参数是allow_writable_chroot=YES,比下面少一个e)
					allow_writeable_chroot=YES
					#将登录的用户禁锢在上面指定的根目录中(不添加这个参数,用户可以使用cd命令切换到系统其他目录中,十分不安全)
					chroot_local_user=YES
					#参数值为YES即禁止名单中的用户,参数值为NO则代表仅允许名单中的用户(/etc/vsftpd/ftpusers以及/etc/vsftpd/user_list这两个文件中的用户)
					userlist_deny=YES
					##END##

					#其余的配置保持默认即可
					dirmessage_enable=YES
					xferlog_enable=YES
					connect_from_port_20=YES
					xferlog_std_format=YES
					listen=NO
					listen_ipv6=YES
					pam_service_name=vsftpd
					userlist_enable=YES
					tcp_wrappers=YES
					

3)配置iptables

					#如果开启了iptables,可以添加外部访问ftp21和20端口规则为允许,本例选择直接清空防火墙的规则,否则客户端将无法连接到服务端的21号端口
					[root@qingsword.com ~]# iptables -F
					[root@qingsword.com ~]# service iptables save
					

4)配置SElinux

					#开启对ftp的完全访问权
					[root@qingsword.com ~]# setsebool -P ftpd_full_access=on
					

5)重启vsftpd服务

					[root@qingsword.com ~]# systemctl restart vsftpd

					#如果想让vsftpd开机自启动,可以使用下面的命令	
					[root@qingsword.com ~]# systemctl enable vsftpd
					

6)客户端登录测试

					qing@qingsword.com:~$ ftp 192.168.1.233
					Connected to 192.168.1.233.
					220 (vsFTPd 3.0.2)

					#输入服务器上任意一个不在阻止文件列表中的用户名,即可登录
					Name (192.168.1.233:qing): qingsword.com
					331 Please specify the password.
					Password: #输入用户对应的密码
					230 Login successful.

					#退出登录
					ftp> bye
					

c.虚拟用户登录

实验环境保持不变,服务端还原成刚安装好vsftpd的状态,继续这一部分的实验。

1)创建虚拟用户验证数据库文件

					#进入vsftpd配置文件主目录
					[root@qingsword.com ~]# cd /etc/vsftpd/

					#创建明文用户密码文件
					[root@qingsword.com vsftpd]# vim user.lst
					#单行为用户名,双行为密码
					user1
					123456
					user2
					123456
					user3
					123456
					
					#使用db_load将上面的明文用户密码文件使用hash加密成v_user.db文件
					[root@qingsword.com vsftpd]# db_load -T -t hash -f user.lst v_user.db 

					#删除原明文密码文件
					[root@qingsword.com vsftpd]# rm -rf user.lst

					#这个文件很重要,所以将hash后的密码文件权限设置成600
					[root@qingsword.com vsftpd]# chmod 600 v_user.db
					

2)创建虚拟用户映射的系统用户(所有虚拟用户登录后都将映射成这个系统用户)

					#指定用户的家目录为/home/ftp_root,所有虚拟用户登录FTP后,都将在这个目录下操作(可以分别指定不同的虚拟用户在这个目录下的子目录作为其根目录)
					[root@qingsword.com vsftpd]# useradd -d /home/ftp_root -s /sbin/nologin v_users
					

3)创建用于ftp虚拟用户PAM认证的文件

					[root@qingsword.com vsftpd]# vim /etc/pam.d/vsftpd.vu
					#输入下面的内容,db=后指定的目录必须为第1步中创建的虚拟用户hash文件路径(/etc/vsftpd/v_user.db),但不需要包含db后缀
					auth    required pam_userdb.so db=/etc/vsftpd/v_user
					account required pam_userdb.so db=/etc/vsftpd/v_user
					

4)修改vsftpd主配置文件,开启支持虚拟用户

					[root@qingsword.com vsftpd]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bk
					[root@qingsword.com vsftpd]# grep -v "#" /etc/vsftpd/vsftpd.conf.bk > /etc/vsftpd/vsftpd.conf
					[root@qingsword.com vsftpd]# vim /etc/vsftpd/vsftpd.conf 

					#禁止匿名登录
					anonymous_enable=NO
					
					##虚拟用户配置参数##
					#开启允许虚拟用户登录
					guest_enable=YES
					#虚拟用户映射的系统用户名(与第2步中创建的用户名对应)
					guest_username=v_users
					#允许FTP根目录可写权限
					allow_writeable_chroot=YES
					#将用户禁锢在各自指定的根目录中
					chroot_local_user=YES
					#虚拟用户单独的配置文件保存路径(稍后创建)
					user_config_dir=/etc/vsftpd/vuser_conf
					#设定虚拟用户的权限符合他们的宿主用户
					virtual_use_local_privs=YES
					##END##

					#其余配置保持不变
					local_enable=YES
					write_enable=YES
					local_umask=022
					dirmessage_enable=YES
					xferlog_enable=YES
					connect_from_port_20=YES
					xferlog_std_format=YES
					listen=NO
					listen_ipv6=YES

					#将pam认证文件更改成第3步中创建的文件名
					pam_service_name=vsftpd.vu

					userlist_enable=YES
					tcp_wrappers=YES
					

5)为每个虚拟用户创建单独的配置文件

					#首先创建出第4步配置文件中user_config_dir参数指定的目录,这个目录用于存放单个的虚拟用户配置文件
					[root@qingsword.com vsftpd]# mkdir /etc/vsftpd/vuser_conf
					[root@qingsword.com vsftpd]# cd /etc/vsftpd/vuser_conf/

					#创建单个用户配置文件,文件名称要与第1步创建的用户验证数据库中的用户名一一对应
					[root@qingsword.com vuser_conf]# vim user1
					
					anon_upload_enable=YES
					anon_mkdir_write_enable=YES
					anon_other_write_enable=YES
					local_root=/home/ftp_root/user1

					[root@qingsword.com vuser_conf]# vim user2

					anon_upload_enable=YES
					anon_mkdir_write_enable=YES
					anon_other_write_enable=YES
					local_root=/home/ftp_root/user2

					[root@qingsword.com vuser_conf]# vim user3

					anon_upload_enable=YES
					anon_mkdir_write_enable=YES
					anon_other_write_enable=YES
					local_root=/home/ftp_root/user3
					

6)创建出每个虚拟用户的ftp根目录,将所属用户改成v_users

					[root@qingsword.com ~]# mkdir /home/ftp_root/user1
					[root@qingsword.com ~]# mkdir /home/ftp_root/user2
					[root@qingsword.com ~]# mkdir /home/ftp_root/user3
					[root@qingsword.com ~]# chown -R v_users:v_users /home/ftp_root
					

7)清空iptables,添加SElinux规则

					[root@qingsword.com ~]# iptables -F
					[root@qingsword.com ~]# setsebool -P ftpd_full_access=on
					

配置完成后,客户端使用user1-3登录服务端FTP就能够登录到/home/ftp_root下对应的用户目录中了。

0×3.Vsftpd设置用户目录大小限制

对系统用户方式登录的ftp用户,可以使用磁盘配额的方式设置用户登录目录的大小,但是对于虚拟账户,无法使用这种方法,但是可以使用自己创建磁盘镜像的方式来限制用户目录的大小,这个方法同样适用于上面所有的登录方式。

1)首先,假设需要限定user1能够使用的磁盘空间大小是100M,用dd在磁盘上创建一个指定大小的文件:

					#创建一个2M*50=100M的文件disk.img,本例存放在home目录中,这个文件的存放目录大家自定义即可
					[root@qingsword.com ~]# dd if=/dev/zero of=/home/disk.img bs=2M count=50
					

2)将创建的这个100M大小的文件,挂载为loop设备:

					#dev下的loop名称不能自定义,但是可以根据不同的文件挂载成loop0、loop1、loop2...以此类推
					#在挂载之前,最好先ls /dev/loop*看看是否已经存在其他的loop设备,loop后的数字不要重复
					[root@qingsword.com ~]# losetup /dev/loop0 /home/disk.img
					

3)格式化设备为ext4文件系统:

					[root@qingsword.com ~]# mkfs.ext4 /dev/loop0
					

4)现在我们有一个大小为100M的ext4文件系统的盘,将它挂载到用户对应的ftp目录:

					#挂载到user1对应的ftp根目录
					[root@qingsword.com ~]# mount -t ext4 /dev/loop0 /home/ftp_root/user1

					#因为使用root用户挂载,user1目录的所属会发生变化,所以需要重新设置一下所属
					[root@qingsword.com ~]# chown -R v_users:v_users /home/ftp_root/user1
					

这样设置之后,user1能够使用的ftp文件夹空间大小就被限定成了100M。

如果想要卸载,请看下面的操作:

					#1.首先关闭vsftpd,否则umount的时候会提示繁忙
					[root@qingsword.com ~]# systemctl stop vsftpd

					#2.umount文件系统
					[root@qingsword.com ~]# umount /home/ftp_root/user1

					#3.卸载对应的loop设备
					[root@qingsword.com ~]# losetup -d /dev/loop0

					#4.删除创建的文件
					[root@qingsword.com ~]# rm /home/disk.img
					

0×4.Vsftpd使用ssl证书启用安全传输

证书可以通过证书机构渠道申请到,也可以使用自签发的证书,本例使用自签发的形式,如果是机构认证的证书,只需要将证书文件复制到服务器对应目录,然后在vsftpd配置文件中指定就行,请看下面的操作:

1)自签发证书

					#本例所有操作都使用root账户,如果使用的是普通用户,在openssl命令前加上sudo
					#/etc/vsftpd/vsftpd-private-key-file.pem为私钥文件保存路径
					#/etc/vsftpd/vsftpd-cert-file.pem为证书文件保存路径
					[root@qingsword.com ~]# sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd-private-key-file.pem -out /etc/vsftpd/vsftpd-cert-file.pem

					Generating a RSA private key
					writing new private key to '/etc/vsftpd/vsftpd-private-key-file.pem' 
					-----
					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) [AU]:CN //国家简写
					State or Province Name (full name) [Some-State]:Beijing //省份
					Locality Name (eg, city) []:Beijing //城市
					Organization Name (eg, company) [Internet Widgits Pty Ltd]:Qingsword //公司
					Organizational Unit Name (eg, section) []:Tech    //部门
					Common Name (e.g. server FQDN or YOUR name) []:QingSword //名字
					Email Address []:admin@qingsword.com //邮箱
					

2)修改主配置文件

					[root@qingsword.com ~]# vim /etc/vsftpd/vsftpd.conf

					#在文件最后,追加下面的内容
					ssl_enable=YES
					allow_anon_ssl=YES
					force_anon_logins_ssl=YES
					force_anon_data_ssl=YES
					force_local_logins_ssl=YES
					force_local_data_ssl=YES
					ssl_tlsv1=YES
					ssl_sslv2=NO
					ssl_sslv3=NO
					#证书文件路径,替换成你自己的
					rsa_cert_file=/etc/vsftpd/vsftpd-cert-file.pem
					#秘钥文件路径替换成你自己的
					rsa_private_key_file=/etc/vsftpd/vsftpd-private-key-file.pem
					require_ssl_reuse=no
					pasv_enable=YES
					#如果开启了防火墙对下面两个端口放行,SELinux也需要放行
					pasv_min_port=20000
					pasv_max_port=20001
					

3)重启vsftpd服务

					[root@qingsword.com ~]# systemctl restart vsftpd
					

配置好后,可以用FileZilla连接验证,第一次连接会弹出ssl证书确认,之后就是ssl加密通道传输了,不用担心ftp明文传输不安全了。