使用Vsftpd服务传输文件

通常来说,人们把计算机联网的首要目的就是获取资料,而文件传输是一种很是重要的获取资料的方式。今天的互联网是由几千万台我的计算机、工做站、服务器、小型机、大型机、巨型机等具备不一样型号、不一样架构的物理设备共同组成的,并且即使是我的计算机,也可能会装有Windows、Linux、UNIX、Mac等不一样的操做系统。为了可以在如此复杂多样的设备之间解决问题解决文件传输问题,FTP(File Transfer Protocol)文件传输协议应运而生。linux

FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20用于进行数据传输,端口21用于接受客户端发出的相关FTP命令与参数。FTP服务器广泛部署于内网中,方便管理的特色。并且有些FTP客户端工具还能够支持文件的多点下载以及断点续传技术,所以获得了广大用户的青睐。FTP协议的传输拓扑如图11-1所示。vim

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 FTP协议的传输拓扑安全

FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送链接请求,以创建数据传输链路的主机。FTP协议有下面两种工做模式,第8章在学习防火墙服务配置时曾经讲过,防火墙通常是用于过滤从外网进入内网的流量,所以有些时候须要将FTP的工做模式设置为主动模式,才能够传输数据。服务器

主动模式:FTP服务器主动向客户端发起链接请求。架构

被动模式:FTP服务器等待客户端发起链接请求(默认工做模式)。app

因为FTP、HTTP、Telnet等协议的数据都是通过明文进行传输,所以从设计的原理上就是不可靠的,但人们又须要解决文件传输的需求,所以便有了vsftpd服务程序。vsftpd(very secure ftp daemon,很是安全的FTP守护进程)是一款运行在Linux操做系统上的FTP服务程序,不只彻底开源并且免费,此外,还具备很高的安全性、传输速度,以及支持虚拟用户验证等其余FTP服务程序不具有的特色。在不影响使用的前提下,可以让管理者自行决定是公开匿名、本地用户仍是虚拟用户的验证方式,这样即使被骇客拿到了咱们的帐号密码,也不见得能登录的了服务器。ide

在配置稳当软件仓库以后,就能够安装vsftpd服务程序了,yum与dnf命令均可以,优先选择用dnf命令方式。工具

[root@linuxprobe ~]# dnf install vsftpd
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
AppStream                                               3.1 MB/s | 3.2 kB     00:00    
BaseOS                                                  2.7 MB/s | 2.7 kB     00:00    
Dependencies resolved.
========================================================================================
 Package           Arch              Version                 Repository            Size
========================================================================================
Installing:
 vsftpd            x86_64            3.0.3-28.el8            AppStream            180 k

Transaction Summary
========================================================================================
Install  1 Package

Total size: 180 k
Installed size: 356 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                1/1 
  Installing       : vsftpd-3.0.3-28.el8.x86_64                                     1/1 
  Running scriptlet: vsftpd-3.0.3-28.el8.x86_64                                     1/1 
  Verifying        : vsftpd-3.0.3-28.el8.x86_64                                     1/1 
Installed products updated.

Installed:
  vsftpd-3.0.3-28.el8.x86_64                                                            

Complete!

iptables防火墙管理工具默认禁止了FTP传输协议的端口号,所以在正式配置vsftpd服务程序以前,为了不这些默认的防火墙策略“捣乱”,还须要清空iptables防火墙的默认策略,并把当前已经被清理的防火墙策略状态保存下来:学习

[root@linuxprobe ~]# iptables -F
[root@linuxprobe ~]# iptables-save 

而后再把FTP协议添加到firewalld服务的容许列表中,前期准备工做必定要作充足:this

[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=ftp 
success
[root@linuxprobe ~]# firewall-cmd --reload 
success

vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)内容总长度达到127行,但其中大多数参数在开头都添加了井号(#),从而成为注释信息,你们没有必要在注释信息上花费太多的时间。咱们能够在grep命令后面添加-v参数,过滤并反选出没有包含井号(#)的参数行(即过滤掉全部的注释信息),而后将过滤后的参数行经过输出重定向符写回原始的主配置文件中,只剩下12行有效参数了,立刻就不紧张了:

[root@linuxprobe ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
[root@linuxprobe ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
[root@linuxprobe ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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

vsftpd服务程序主配置文件中经常使用的参数以及做用。当前你们只须要简单了解便可,在后续的实验中将演示这些参数的用法,以帮助你们熟悉并掌握。

                                   vsftpd服务程序经常使用的参数以及做用

参数 做用
listen=[YES|NO] 是否以独立运行的方式监听服务
listen_address=IP地址 设置要监听的IP地址
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根目录
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服务程序中,匿名开放模式是最不安全的一种认证模式。任何人均可以无需密码验证而直接登陆到FTP服务器。这种模式通常用来访问不重要的公开文件(在生产环境中尽可能不要存放重要文件)。固然,若是采用第8章中介绍的防火墙管理工具(如Tcp_wrappers服务程序)将vsftpd服务程序容许访问的主机范围设置为企业内网,也能够提供基本的安全性。

vsftpd服务程序默认关闭了匿名开放模式,须要作的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户建立、删除、改名文件的权限。须要注意的是,针对匿名用户放开这些权限会带来潜在危险,咱们只是为了在Linux系统中练习配置vsftpd服务程序而放开了这些权限,不建议在生产环境中如此行事。表11-2罗列了能够向匿名用户开放的权限参数以及做用。

表11-2                                 向匿名用户开放的权限参数以及做用

参数 做用
anonymous_enable=YES 容许匿名访问模式
anon_umask=022 匿名用户上传文件的umask值
anon_upload_enable=YES 容许匿名用户上传文件
anon_mkdir_write_enable=YES 容许匿名用户建立目录
anon_other_write_enable=YES 容许匿名用户修改目录名称或删除目录

 

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
  1 anonymous_enable=YES
  2 anon_umask=022
  3 anon_upload_enable=YES
  4 anon_mkdir_write_enable=YES
  5 anon_other_write_enable=YES
  6 local_enable=YES
  7 write_enable=YES
  8 local_umask=022
  9 dirmessage_enable=YES
 10 xferlog_enable=YES
 11 connect_from_port_20=YES
 12 xferlog_std_format=YES
 13 listen=NO
 14 listen_ipv6=YES
 15 pam_service_name=vsftpd
 16 userlist_enable=YES

在vsftpd服务程序的主配置文件中正确填写参数,而后保存并退出。还须要重启vsftpd服务程序,让新的配置参数生效。在此须要提醒各位读者,在生产环境中或者在RHCSA、RHCERHCA认证考试中必定要把配置过的服务程序加入到开机启动项中,以保证服务器在重启后依然可以正常提供传输服务:

[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# systemctl enable vsftpd
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.

如今就能够在客户端执行ftp命令链接到远程的FTP服务器了。在vsftpd服务程序的匿名开放认证模式下,其帐户统一为anonymous,密码为空。并且在链接到FTP服务器后,默认访问的是/var/ftp目录。能够切换到该目录下的pub目录中,而后尝试建立一个新的目录文件,以检验是否拥有写入权限:

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车便可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Permission denied.

系统显示拒绝建立目录!咱们明明在前面清空了iptables防火墙策略,并且也在vsftpd服务程序的主配置文件中添加了容许匿名用户建立目录和写入文件的权限啊。建议先不要着急往下看,而是本身思考一下这个问题的解决办法,以锻炼您的Linux系统排错能力。

前文提到,在vsftpd服务程序的匿名开放认证模式下,默认访问的是/var/ftp目录。查看该目录的权限得知,只有root管理员才有写入权限。怪不得系统会拒绝操做呢!下面将目录的全部者身份改为系统帐户ftp便可,这样应该能够了吧?

[root@linuxprobe ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 2 root root 6 Aug 13 2021 /var/ftp/pub
[root@linuxprobe ~]# chown -R ftp /var/ftp/pub
[root@linuxprobe ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 2 ftp root 6 Aug 13 2021 /var/ftp/pub
[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车便可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Create directory operation failed.

系统再次报错!尽管在使用ftp命令登入FTP服务器后,再建立目录时系统依然提示操做失败,可是报错信息却发生了变化。在没有写入权限时,系统提示“权限拒绝”(Permission denied)因此刘遄老师怀疑是权限的问题。但如今系统提示“建立目录的操做失败”(Create directory operation failed),想必各位读者也应该意识到是SELinux服务在“捣乱”了吧。

下面使用getsebool命令查看与FTP相关的SELinux域策略都有哪些:

[root@linuxprobe ~]# getsebool -a | grep ftp
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
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off

咱们能够根据经验(须要长期培养,别无它法)和策略的名称判断出是ftpd_full_access--> off策略规则致使了操做失败。接下来修改该策略规则,而且在设置时使用-P参数让修改过的策略永久生效,确保在服务器重启后依然可以顺利写入文件。

[root@linuxprobe ~]# setsebool -P ftpd_full_access=on

等SELinux域策略修改完毕,如今便可以顺利执行文件建立、修改及删除等操做了:

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车便可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.

在上面的操做中,因为权限的不足因此将/var/ftp/pub目录的全部者设置成了ftp用户自己。而除了这种方法外,也能够经过设置权限的方法让其它用户获取到写入权限,例如777这样的权限。可是因为vsftpd服务自身带有安全保护机制,不要对/var/ftp直接修改权限,有可能致使服务被“安全锁定”而不能登陆,必定要记得是里面的pub目录哦:

[root@linuxprobe ~]# chmod -R 777 /var/ftp
[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车便可
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection

 

 

此文章仅记录本身的一个学习过程; 逆水行舟