Linux就该这么学_第11章 使用 vsftpd 服务传输文件

本章讲解了如下内容:
➢ 文件传输协议;
➢ vsftpd 服务程序;
➢ 简单文件传输协议。

本章开篇讲解了什么是文件传输协议(File Transfer Protocol,FTP),以及如何部署 vsftpd 服
务程序,然后深度剖析了 vsftpd 主配置文件中最常用的参数及其作用,并完整演示了 vsftpd 服务
程序三种认证模式(匿名开放模式、本地用户模式、虚拟用户模式)的配置方法。本章还涵盖了
可插拔认证模块(Pluggable Authentication Module,PAM)的原理、作用以及实用配置方法。
读者将通过本章介绍的实战内容进一步练习 SELinux 服务的配置方法,掌握简单文件传
输协议(Trivial File Transfer Protocol,TFTP)的理论及配置方法,以及学习刘遄老师在服务
部署和排错方面的经验技巧,以便灵活应对生产环境中遇到的各种问题。

11.1 文件传输协议

一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的
获取资料的方式。今天的互联网是由几千万台个人计算机、工作站、服务器、小型机、大型
机、巨型机等具有不同型号、不同架构的物理设备共同组成的,而且即便是个人计算机,也
可能会装有 Windows、Linux、UNIX、Mac 等不同的操作系统。为了能够在如此复杂多样的
设备之间解决问题解决文件传输问题,文件传输协议(FTP)应运而生。
FTP 是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、21
号端口,其中端口 20(数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端
发出的相关 FTP 命令与参数。FTP 服务器普遍部署于内网中,具有容易搭建、方便管理的特
点。而且有些 FTP 客户端工具还可以支持文件的多点下载以及断点续传技术,因此 FTP 服务
得到了广大用户的青睐。FTP 协议的传输拓扑如图 11-1 所示。

FTP 服务器是按照 FTP 协议在互联网上提供文件存储和访问服务的主机,FTP 客户
端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP 协议有下面两种工作
模式。
➢ 主动模式:FTP 服务器主动向客户端发起连接请求。
➢被动模式:FTP 服务器等待客户端发起连接请求(FTP 的默认工作模式)。
第 8 章在学习防火墙服务配置时曾经讲过,防火墙一般是用于过滤从外网进入内网的流
量,因此有些时候需要将 FTP 的工作模式设置为主动模式,才可以传输数据。

第 8 章在学习防火墙服务配置时曾经讲过,防火墙一般是用于过滤从外网进入内网的流
量,因此有些时候需要将 FTP 的工作模式设置为主动模式,才可以传输数据。
vsftpd(very secure ftp daemon,非常安全的 FTP 守护进程)是一款运行在 Linux 操作系
统上的 FTP 服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以
及支持虚拟用户验证等其他 FTP 服务程序不具备的特点。
在配置妥当 Yum 软件仓库之后,就可以安装 vsftpd 服务程序了。

[root@www ~]# yum install vsftpd
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                                                               | 6.2 kB  00:00:00     
 * base: centos.ustc.edu.cn
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: centos.ustc.edu.cn
 * updates: centos.ustc.edu.cn
base                                                                                               | 3.6 kB  00:00:00     
epel                                                                                               | 3.2 kB  00:00:00     
extras                                                                                             | 3.4 kB  00:00:00     
updates                                                                                            | 3.4 kB  00:00:00     
(1/3): epel/x86_64/updateinfo                                                                      | 934 kB  00:00:00     
(2/3): epel/x86_64/primary                                                                         | 3.6 MB  00:00:00     
(3/3): updates/7/x86_64/primary_db                                                                 | 6.0 MB  00:00:01     
epel                                                                                                          12741/12741
正在解决依赖关系
--> 正在检查事务
---> 软件包 vsftpd.x86_64.0.3.0.2-22.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

==========================================================================================================================
 Package                    架构                       版本                                源                        大小
==========================================================================================================================
正在安装:
 vsftpd                     x86_64                     3.0.2-22.el7                        base                     169 k

事务概要
==========================================================================================================================
安装  1 软件包

总下载量:169 k
安装大小:348 k
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
vsftpd-3.0.2-22.el7.x86_64.rpm                                                                     | 169 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : vsftpd-3.0.2-22.el7.x86_64                                                                            1/1 
  验证中      : vsftpd-3.0.2-22.el7.x86_64                                                                            1/1 

已安装:
  vsftpd.x86_64 0:3.0.2-22.el7                                                                                            

完毕!

iptables 防火墙管理工具默认禁止了 FTP 传输协议的端口号,因此在正式配置 vsftpd 服
务程序之前,为了避免这些默认的防火墙策略“捣乱”,还需要清空 iptables 防火墙的默认策
略。

[root@www ~]# iptables -F

vsftpd 服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)内容总长度达到 123 行,但其中
大多数参数在开头都添加了井号(#),从而成为注释信息,大家没有必要在注释信息上花费
太多的时间。我们可以在 grep 命令后面添加-v 参数,过滤并反选出没有包含井号(#)的参数

行(即过滤掉所有的注释信息),然后将过滤后的参数行通过输出重定向符写回原始的主配置
文件中:

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

表 11-1 中罗列了 vsftpd 服务程序主配置文件中常用的参数以及作用。当前大家只需要简
单了解即可,在后续的实验中将演示这些参数的用法,以帮助大家熟悉并掌握。 

 11.2 vsftpd 服务程序

vsftpd 作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到 FTP 服务
器上。
➢ 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录
到 FTP 服务器。
➢ 本地用户模式:是通过 Linux 系统本地的账户密码信息进行认证的模式,相较于匿名
开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可
以畅通无阻地登录 FTP 服务器,从而完全控制整台服务器。
➢ 虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为 FTP 服务单独
建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在
服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使
黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。
ftp 是 Linux 系统中以命令行界面的方式来管理 FTP 传输服务的客户端工具。我们首先手
动安装这个 ftp 客户端工具,以便在后续实验中查看结果。

[root@www ~]# yum install ftp
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.ustc.edu.cn
 * epel: mirrors.ustc.edu.cn
 * extras: centos.ustc.edu.cn
 * updates: centos.ustc.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 ftp.x86_64.0.0.17-67.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

==========================================================================================================================
 Package                  架构                        版本                                源                         大小
==========================================================================================================================
正在安装:
 ftp                      x86_64                      0.17-67.el7                         base                       61 k

事务概要
==========================================================================================================================
安装  1 软件包

总下载量:61 k
安装大小:96 k
Is this ok [y/d/N]: y
Downloading packages:
ftp-0.17-67.el7.x86_64.rpm                                                                         |  61 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : ftp-0.17-67.el7.x86_64                                                                                1/1 
  验证中      : ftp-0.17-67.el7.x86_64                                                                                1/1 

已安装:
  ftp.x86_64 0:0.17-67.el7                                                                                                

完毕!

11.2.1 匿名开放模式

前文提到,在 vsftpd 服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都

可以无需密码验证而直接登录到 FTP 服务器。这种模式一般用来访问不重要的公开文件(在
生产环境中尽量不要存放重要文件)。当然,如果采用第 8 章中介绍的防火墙管理工具(如
Tcp_wrappers 服务程序)将 vsftpd 服务程序允许访问的主机范围设置为企业内网,也可以提
供基本的安全性。
vsftpd 服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下
载文件的权限,以及让匿名用户创建、删除、更名文件的权限。需要注意的是,针对匿名用户
放开这些权限会带来潜在危险,我们只是为了在 Linux 系统中练习配置 vsftpd 服务程序而放
开了这些权限,不建议在生产环境中如此行事。表 11-2 罗列了可以向匿名用户开放的权限参
数以及作用。

[root@www ~]# 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 
 16 pam_service_name=vsftpd
 17 userlist_enable=YES
 18 tcp_wrappers=YES

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

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

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

[root@www ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3: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.

系统显示拒绝创建目录!我们明明在前面清空了 iptables 防火墙策略,而且也在 vsftpd 服
务程序的主配置文件中添加了允许匿名用户创建目录和写入文件的权限啊。建议大家先不要
着急往下看,而是自己思考一下这个问题的解决办法,以锻炼您的 Linux 系统排错能力。
前文提到,在 vsftpd 服务程序的匿名开放认证模式下,默认访问的是/var/ftp 目录。查看
该目录的权限得知,只有 root 管理员才有写入权限。怪不得系统会拒绝操作呢!下面将目录
的所有者身份改成系统账户 ftp 即可(该账户在系统中已经存在),这样应该可以了吧:

[root@www ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 2 root root 6 8月   3 2017 /var/ftp/pub
[root@www ~]# chown -Rf ftp /var/ftp/pub
[root@www ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3: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@www ~]# 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@www ~]# setsebool -P ftpd_full_access=on

现在便可以顺利执行文件创建、修改及删除等操作了。

[root@www ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3: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.

11.2.2 本地用户模式

相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单。如果大家之前
用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。针对本地用户模式的
权限参数以及作用如表 11-3 所示。

 1 anonymous_enable=NO
  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
 17 tcp_wrappers=YES

在 vsftpd 服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启 vsftpd
服务程序,让新的配置参数生效。在执行完上一个实验后还原了虚拟机的读者,还需要将配
置好的服务添加到开机启动项中,以便在系统重启自后依然可以正常使用 vsftpd 服务。

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

按理来讲,现在已经完全可以本地用户的身份登录 FTP 服务器了。但是在使用 root 管理
员登录后,系统提示如下的错误信息:

[root@www ~]# systemctl restart vsfptd
Failed to restart vsfptd.service: Unit not found.
[root@www ~]# systemctl restart vsftpd
[root@www ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): root
530 Permission denied.
Login failed.
ftp> 

可见,在我们输入 root 管理员的密码之前,就已经被系统拒绝访问了。这是因为 vsftpd 服务
程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers 和 user_list)。不知道大
家是否已看过一部日本电影“死亡笔记”(刘遄老师在上学期间的最爱),里面就提到有一个
黑色封皮的小本子,只要将别人的名字写进去,这人就会挂掉。vsftpd 服务程序目录中的这两
个文件也有类似的功能—只要里面写有某位用户的名字,就不再允许这位用户登录到 FTP
服务器上。

[root@www ~]# cat /etc/vsftpd/user_list 
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@www ~]# cat /etc/vsftpd/ftpusers 
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

果然如此!vsftpd 服务程序为了保证服务器的安全性而默认禁止了 root 管理员和大多数
系统用户的登录行为,这样可以有效地避免黑客通过 FTP 服务对 root 管理员密码进行暴力破
解。如果您确认在生产环境中使用 root 管理员不会对系统安全产生影响,只需按照上面的提
示删除掉 root 用户名即可。我们也可以选择 ftpusers 和 user_list 文件中没有的一个普通用户
尝试登录 FTP 服务器:

刘遄老师再啰嗦几句。在实验课程和生产环境中设置 SELinux 域策略时,一定记得添加-P
参数,否则服务器在重启后就会按照原有的策略进行控制,从而导致配置过的服务无法使用。
在配置妥当后再使用本地用户尝试登录下 FTP 服务器,分别执行文件的创建、重命名及
删除等命令。操作均成功!

[root@www ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): jingpan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/home/jingpan/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.

11.2.3 虚拟用户模式

我们最后讲解的虚拟用户模式是这三种模式中最安全的一种认证模式,当然,因为安全
性较之于前面两种模式有了提升,所以配置流程也会稍微复杂一些。

第1步:创建用于进行 FTP 认证的用户数据库文件,其中奇数行为账户名,偶数行为密
码。例如,我们分别创建出 zhangsan 和 lisi 两个用户,密码均为 redhat:

[root@www ~]# cd /etc/vsftpd
[root@www vsftpd]# vim vuser.list
zhangsan
redhat
list
redhat

但是,明文信息既不安全,也不符合让 vsftpd 服务程序直接加载的格式,因此需要使
用 db_load 命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低
数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件
删除。

[root@www vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@www vsftpd]# file vuser.db 
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@www vsftpd]# chmod 600 vuser.db
[root@www vsftpd]# rm -f vuser.list 
[root@www vsftpd]# ls -l vuser.db
-rw-------. 1 root root 12288 10月 17 09:49 vuser.db

第2步:

创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地
用户。FTP 服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
由于 Linux 系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”
新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,
需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录
到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于
这个系统本地用户,从而避免 Linux 系统无法处理虚拟用户所创建文件的属性权限。
为了方便管理 FTP 服务器上的数据,可以把这个系统本地用户的家目录设置为/var 目录
(该目录用来存放经常发生改变的数据)。并且为了安全起见,我们将这个系统本地用户设置
为不允许登录 FTP 服务器,这不会影响虚拟用户登录,而且还可以避免黑客通过这个系统本
地用户进行登录。

[root@www vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@www vsftpd]# ls -ld /var/ftproot/
drwx------. 2 virtual virtual 62 10月 17 09:52 /var/ftproot/
[root@www vsftpd]# chmod -Rf 755 /var/ftproot/

第3步:建立用于支持虚拟用户的 PAM 文件。

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的 API 把系统提
供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
要想把 PAM 功能和作用完全讲透,至少要一个章节的篇幅才可以(对该主题感兴趣的读者敬
请关注本书的进阶篇,里面会详细讲解 PAM)。
通俗来讲,PAM 是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认
证方式,而不必对应用程序进行任何修改。PAM 采取了分层设计(应用程序层、应用接口层、
鉴别模块层)的思想,其结构如图 11-2 所示。

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

[root@www vsftpd]# vim /etc/pam.d/vsftpd.vu
auth    required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
~

第4步:在 vsftpd 服务程序的主配置文件中通过 pam_service_name 参数将 PAM 认证
文件的名称修改为 vsftpd.vu,PAM 作为应用程序层与鉴别模块层的连接纽带,可以让应用程
序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要 PAM 认证时,则需要在
应用程序中定义负责认证的 PAM 配置文件,实现所需的认证功能。
例如,在 vsftpd 服务程序的主配置文件中默认就带有参数 pam_service_name=vsftpd,表
示登录 FTP 服务器时是根据/etc/pam.d/vsftpd 文件进行安全认证的。现在我们要做的就是把
vsftpd 主配置文件中原有的 PAM 认证文件 vsftpd 修改为新建的 vsftpd.vu 文件即可。该操作中
用到的参数以及作用如表 11-4 所示。

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_enable=YES
guest_enable=YES
guest_username= 
allow_writeable_chroot=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.vu
userlist_enable=YES
tcp_wrappers=YES 

第5步:为虚拟用户设置不同的权限。虽然账户 zhangsan 和 lisi 都是用于 vsftpd 服务程
序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、修
改、查看、删除文件,只允许李四查看文件。这可以通过 vsftpd 服务程序来实现。只需新建
一个目录,在里面分别创建两个以 zhangsan 和 lisi 命名的文件,其中在名为 zhangsan 的文件
中写入允许的相关权限(使用匿名用户的参数):

[root@www ~]# mkdir /etc/vsftpd/vuser_dir/
[root@www ~]# cd /etc/vsftpd/vuser_dir/
[root@www ~]# vim /etc/vsftpd/vusers_dir/lisi 
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
[root@www vuser_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
~

然后再次修改 vsftpd 主配置文件,通过添加 user_config_dir 参数来定义这两个虚拟用户
不同权限的配置文件所存放的路径。为了让修改后的参数立即生效,需要重启 vsftpd 服务程
序并将该服务添加到开机启动项中:

[root@www ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=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.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers_dir

此时,不但可以使用虚拟用户模式成功登录到 FTP 服务器,还可以分别使用账户 zhangsan
和 lisi 来检验他们的权限。当然,读者在生产环境中一定要根据真实需求来灵活配置参数,不
要照搬这里的实验操作。

[root@www ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): lisi
331 Please specify the password.
Password:此处输入虚拟用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Permission denied.
ftp> exit
221 Goodbye.
[root@www ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): zhangsan
331 Please specify the password.
Password:此处输入虚拟用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/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.

anon_world_readable_only功能。

网上搜了很多关于这个参数用途,大多数都是抄来抄去,很少有人讲到点上,经过我一些实验以及推敲,终于知道这个参数到底是干嘛用的了,这里跟大家分享一下
    默认情况下,匿名用户所有上传下载,所使用的用户都是ftp用户的权限,若要上传文件,则需要ftp用户有写的权限,若要下载,则需要ftp用户有读的权限,也就是说一般情况下,ftp用户对文件有读权限就对文件有下载权限了
  文件有三种权限,文件所有人,文件所有组,文件的其他人,这个anon_world_readable_only参数意思是,当他为YES时候,文件的其他人必须有读的权限才允许下载,单单所有人为ftp且有读权限是无法下载的,必须其他人也有读权限,才允许下载,这是为安全性的一方面考虑,若为NO则只要ftp用户对文件有读权限即可下载,若有不明白可以继续追问

11.3 简单文件传输协议

简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于 UDP 协议在客户端
和服务器之间进行简单文件传输的协议。顾名思义,它提供不复杂、开销不大的文件传输服
务(可将其当作 FTP 协议的简化版本)。
TFTP 的命令功能不如 FTP 服务强大,甚至不能遍历目录,在安全性方面也弱于 FTP
服务。而且,由于 TFTP 在传输文件时采用的是 UDP 协议,占用的端口号为 69,因此文
件的传输过程也不像 FTP 协议那样可靠。但是,因为 TFTP 不需要客户端的权限认证,
也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率
更高。
接下来在系统上安装 TFTP 的软件包,进行体验。

[root@www zhangsan]# yum install tftp-server tftp
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.ustc.edu.cn
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: centos.ustc.edu.cn
 * updates: centos.ustc.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 tftp.x86_64.0.5.2-22.el7 将被 安装
---> 软件包 tftp-server.x86_64.0.5.2-22.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

==========================================================================================================================
 Package                         架构                       版本                           源                        大小
==========================================================================================================================
正在安装:
 tftp                            x86_64                     5.2-22.el7                     base                      38 k
 tftp-server                     x86_64                     5.2-22.el7                     base                      47 k

事务概要
==========================================================================================================================
安装  2 软件包

总下载量:85 k
安装大小:117 k
Is this ok [y/d/N]: y
Downloading packages:
(1/2): tftp-5.2-22.el7.x86_64.rpm                                                                  |  38 kB  00:00:00     
(2/2): tftp-server-5.2-22.el7.x86_64.rpm                                                           |  47 kB  00:00:00     
--------------------------------------------------------------------------------------------------------------------------
总计                                                                                      129 kB/s |  85 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : tftp-5.2-22.el7.x86_64                                                                                1/2 
  正在安装    : tftp-server-5.2-22.el7.x86_64                                                                         2/2 
  验证中      : tftp-server-5.2-22.el7.x86_64                                                                         1/2 
  验证中      : tftp-5.2-22.el7.x86_64                                                                                2/2 

已安装:
  tftp.x86_64 0:5.2-22.el7                                 tftp-server.x86_64 0:5.2-22.el7                                

完毕!

在 RHEL 7 系统中,TFTP 服务是使用 xinetd 服务程序来管理的。xinetd 服务可以用来管理
多种轻量级的网络服务,而且具有强大的日志功能。简单来说,在安装 TFTP 软件包后,还需
要在 xinetd 服务程序中将其开启,把默认的禁用(disable)参数修改为 no:

[root@www zhangsan]# vim /etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

然后,重启 xinetd 服务并将它添加到系统的开机启动项中,以确保 TFTP 服务在系统重
启后依然处于运行状态。考虑到有些系统的防火墙默认没有允许 UDP 协议的 69 端口,因此
需要手动将该端口号加入到防火墙的允许策略中:

[root@www zhangsan]# systemctl restart xinetd
[root@www zhangsan]# systemctl enable xinetd
[root@www zhangsan]# firewall-cmd --permanent --add-port=69/udp
FirewallD is not running
[root@www zhangsan]# firewall-cmd --reload
FirewallD is not running

TFTP 的根目录为/var/lib/tftpboot。我们可以使用刚安装好的 tftp 命令尝试访问其中的文
件,亲身体验 TFTP 服务的文件传输过程。在使用 tftp 命令访问文件时,可能会用到表 11-5
中的参数。

[root@www zhangsan]# echo "i love linux" > /var/lib/tftpboot/readme.txt
[root@www zhangsan]# tftp 192.168.1.3
tftp> get readme.txt
tftp> quit
[root@www zhangsan]# ls
readme.txt
[root@www zhangsan]# cat readme.txt 
i love linux

当然,TFTP 服务的玩法还不止于此,第 19 章会将 TFTP 服务与其他软件相搭配,组合
出一套完整的自动化部署系统方案。大家继续加油!

猜你喜欢

转载自blog.csdn.net/tjjingpan/article/details/83104227