[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明文传输不安全了。