00:00/00:00

本章节已编写及校对完毕,现有奖征集建议、若您发现本章中有错别字或补充欢迎联系刘遄老师QQ:5604241。
章节简述:

本章节开篇刘遄老师先为同学们讲解什么是FTP文件传输协议以及如何安装部署vsftpd服务程序,然后进行有深度的讲解vsftpd主配置文件中的最常用参数功能作用,完整的演示对vsftpd服务程序的三种认证模式的配置方法——匿名开放模式、本地用户模式以及虚拟用户模式。了解PAM可插拔认证模块的原理、作用以及实战配置方法,通过实战课程进一步继续学习SELinux服务的配置方法,扩展学习TFTP简单文件传输协议理论及实操课程,并加入了大量刘遄老师对于服务部署和排错的经验之谈,更好的帮助同学们在今后生产环境中做到灵活搭配使用。

11.1 文件传输协议

一般来讲,人们将电脑联网的首要需求就是获取资料,而文件传输是其中非常重要的方式之一,21世纪的互联网是由几千万台个人电脑、工作站、小型机、大型机等等不同型号、架构的物理设备共同组成的,即便是个人电脑上也可能会装有诸如Linux、Windows、UNIX、DOS等等不同的操作系统,所以为了能够在如此复杂多样的操作设备之间解决文件传输问题,于是便有了统一的FTP文件传输协议(File Transfer Protocol),这是一种能够让使用者在互联网中上传、下载文件的传输协议。很多同学在大学期间只知道FTP协议使用了21端口号,但实际上FTP文件传输协议默认占用了20、21两个端口号,20端口号用于进行数据传输,21端口号用于接受客户端执行的相关FTP命令与参数,FTP服务端普遍更多的应用于内网中,具有易于搭建、方便管理的特点,并且可以借助FTP客户端工具还可以轻松实现文件的多点下载和断点续传技术,FTP协议的传输拓扑如图11-1所示。

FTP连接过程

11-1 FTP协议的传输拓扑

FTP服务器就是支持FTP传输协议的主机,与大多数服务程序一样,要想完成文件传输则需要FTP服务端和客户端的配合才行,用户可以通过客户端向FTP服务端发送指令参数,FTP服务端从而会依据接受到的命令作出相应动作,比如显示执行结果或把文件传输到客户端主机上,FTP协议的传输有两种不同的模式,主动模式是让FTP服务端主动向客户端发起链接请求,而被动模式则是让FTP服务端等待客户端的链接请求,默认情况下被动模式,咱们在第8章的防火墙课程中学习过,防火墙一般更多的是过滤从外网到内网的流量数据,因此有些时候必须改成主动模式才可以传输。

Vsftpd是一款运行在Linux操作系统上面的FTP服务端程序,Very Secure FTP Daemon顾名思义就是非常安全的FTP传输程序,vsftpd服务程序不仅完全开源且免费,而且具有很高的安全性、传输速率、支持虚拟用户验证功能等等其他FTP服务端程序所不具备的特点。配置妥当yum软件仓库后就可以来安装vsftpd服务程序了:

[root@linuxprobe ~]# yum install vsftpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
================================================================================
 Package Arch Version Repository Size
================================================================================
Installing:
 vsftpd x86_64 3.0.2-9.el7 rhel 166 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 166 k
Installed size: 343 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : vsftpd-3.0.2-9.el7.x86_64 1/1 
 Verifying : vsftpd-3.0.2-9.el7.x86_64 1/1 
Installed:
 vsftpd.x86_64 0:3.0.2-9.el7 
Complete!

iptables防火墙管理工具中默认禁止了ftp传输协议的端口号,因此在正式配置vsftpd服务程序前还需要清空一下iptables防火墙的默认策略,并把当前已经被清理的防火墙策略状态保存下来:

[root@linuxprobe ~]# iptables -F
[root@linuxprobe ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)中参数总共有123行左右,但大多数都是以#(井号)开头的注释信息,咱们可以用grep命令的-v参数来过滤并反选出没有包含#(井号)的参数行,也就是把所有的注释信息都过滤掉,这样再通过输出重定向符写会到原始的主配置文件名称中即可:

[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=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

刘遄老师给大家整理出了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为不限制。

11.2 Vsftpd服务程序

vsftpd作为更加安全的FTP文件传输协议的服务程序,可以让用户分别通过匿名开放本地用户虚拟用户三种身份验证方式来登陆到FTP服务器上面。匿名开放是一种最不安全的验证模式,任何人都可以无需密码验证就登陆到FTP服务端主机。本地用户是通过Linux系统本地的帐号密码信息进行的验证模式,这种模式相比较匿名开放模式来说比较安全,配置起来也十分简单,不过如果被骇客暴力破解出FTP帐号信息,也就可以通过这个口令登陆到服务器系统中了,从而完全控制整台服务器主机。最后的虚拟用户是相比较最为安全的验证模式,需要为FTP传输服务单独建立用户数据库文件,虚拟出用来口令验证的帐户信息,这些帐号是在服务器系统中不存在的,仅供FTP传输服务做验证使用,因此这样即便骇客破解出了帐号口令密码后也无法登录到服务器主机上面,有效的降低了破坏范围和影响。

ftp命令是用来在命令行终端中对ftp传输服务进行控制连接的客户端工具,需要先手动的安装一下这个ftp客户端工具,以便于接下来的实验中校验效果:

[root@linuxprobe ~]# yum install ftp
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Installing:
 ftp x86_64 0.17-66.el7 rhel 61 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 61 k
Installed size: 96 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : ftp-0.17-66.el7.x86_64 1/1 
 Verifying : ftp-0.17-66.el7.x86_64 1/1
Installed:
 ftp.x86_64 0:0.17-66.el7
Complete!
11.2.1 匿名访问模式

vsftpd服务程序中匿名开放是一种最不安全的验证模式,任何人都可以无需密码验证就登陆到FTP服务端主机,这种模式一般只用来保存不重要的公开文件,尤其是在生产环境中更要注意不放敏感文件,当然也非常推荐用第8章中学习的防火墙管理工具(例如Tcp_wrappers服务程序)把vsftpd服务程序的允许访问主机范围设置为企业内网,这样还算能够保证基本的安全性。

vsftpd服务程序默认已经开启了匿名访问模式,需要做的就是进一步允许匿名用户的上传、下载文件的权限,以及让匿名用户能够创建、删除、更名文件的权限,这些权限对于匿名用户来讲非常的危险,咱们只是为了练习Linux系统中vsftpd服务程序的配置能力,十分不推荐在生产环境中使用,匿名用户的权限参数及介绍:

参数 作用
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
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_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

确认参数填写正确后保存并退出vsftpd服务程序的主配置文件,还需要重启vsftpd服务程序来让新的配置服务参数生效,并且在生产环境中或者红帽RHCSA、RHCERHCA认证考试中也记得一定要把配置过的服务程序加入到开机启动项中,以保证下次服务器重启后依然能够为用户正常提供ftp文件传输服务:

[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命令连接到远程的FTP服务器上面了,FTP服务的匿名开放模式的帐号统一为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.2)
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系统排错能力就一定会练出来的。

回想起前面操作的细节,FTP服务的匿名开放模式是默认登陆到了/var/ftp目录中,查看下这个目录的权限后才发现原来只有root管理员用户才有写入权限的,怪不得会提示写入出错呢,咱们只需要把目录的所有者身份改成系统帐户ftp即可,这样就应该可以了吧~

[root@linuxprobe ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub
[root@linuxprobe ~]# chown -Rf ftp /var/ftp/pub
[root@linuxprobe ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub
[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
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服务在限制这个操作了吧,查看下所有与ftp相关的SELinux域策略有那些吧:

[root@linuxprobe ~]# 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
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off

根据策略的名称和经验可以猜测出是哪一条规则策略,在设置的时候请记得使用-P参数来让配置过的策略永久生效,保证在服务器重启后依然能够顺利写入文件,大家可以分别尝试下创建目录文件、对文件进行改名以及删除目录文件等等操作。最后,恭喜同学们完成了这个实验课程,刘遄老师建议您在进行一次实验课程前还原虚拟机到最初始的状态,以免多个实验配置参数之间产生冲突

[root@linuxprobe ~]# setsebool -P ftpd_full_access=on
[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
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.
11.2.2 本地用户模式

本地用户模式是通过Linux系统本地的帐号密码信息进行的验证方式,这种模式相比较匿名开放模式来说比较安全,不过如果被骇客暴力破解出FTP帐号信息,也就可以通过这个口令登陆到服务器系统中了,从而完全控制整台服务器主机。本地用户模式配置起来十分简单,而且既然本地用户模式确实要比匿名开放模式更加的安全,因此推荐既然开启了本地用户模式,就把匿名开放模式给关闭了吧~对本地用户模式需要使用的权限参数及介绍如下表:

参数 作用
anonymous_enable=NO 禁止匿名访问模式。
local_enable=YES 允许本地用户模式。
write_enable=YES 设置可写入权限。
local_umask=022 本地用户模式创建文件的umask值。
userlist_deny=YES 参数值为YES即禁止名单中的用户,参数值为NO则代表仅允许名单中的用户。
userlist_enable=YES 允许“禁止登陆名单”,名单文件为ftpusers与user_list。

[root@linuxprobe ~]# vim /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
tcp_wrappers=YES

确认参数信息已经填写正确就可以保存退出了,要想让新的配置参数生效还要记得重启一下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@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): root
530 Permission denied.
Login failed.
ftp>

在咱们输入root管理员用户的密码前就已经提示被拒绝了,看来有什么东西再禁止着用户登陆,这是因为vsftpd服务程序目录中默认存在着两个文件(ftpusersuser_list),这两个文件叫做禁止用户名单。不知道同学们有没有看过一个叫做“死亡笔记”的日本电影(刘遄老师在职高上学期间的最爱),里面就提到有一个黑色封皮的小本本,任何人的名字写进去都会死亡,其实在配置的这个vsftpd服务程序的禁止文件也有类似的功能,只要里面写有某个用户的名字,那么就不再允许这个用户登陆到FTP服务器上面。

[root@linuxprobe ~]# 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@linuxprobe ~]# 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服务程序为了保证服务器的安全性而默认禁止了超级管理员和大多数系统用户的登陆行为,这样可以有效的避免骇客通过FTP服务对超级管理员密码的暴力破解行为,如果您在生产环境中确认使用root超级管理员帐号不会对系统产生安全影响,只需要按照上面的提示删除掉root用户名即可,或者咱们也可以选择一个列表中没有的普通用户来尝试登陆到FTP服务器中:

[root@linuxprobe ~]# ftp 192.168.10.10 
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): linuxprobe
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Create directory operation failed.

本地用户模式登陆后默认会进入该用户的家目录中,也就是说当前用户登陆后应该进入的是/home/linuxprobe目录中,而该目录的默认所有者、所有组都是该用户自己,不存在写入权限不足的情况,因此这次提示的操作被拒绝,就是因为刚刚还原过虚拟机系统到最初始的状态了,需要再来开启一下SELinux域中对ftp服务的允许策略就可以了:

[root@linuxprobe ~]# 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
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@linuxprobe ~]# setsebool -P ftpd_full_access=on

刘遄老师再次再次再次提醒下,练习实验课程和生产环境中对SELinux域策略的设置中切记加入-P参数,否则服务器在重启后就会依然按照原有的策略进行控制,导致配置过的服务又不能使用了,都配置妥当后再来使用本地用户尝试登陆下FTP服务器,分别执行创建目录文件、重命名文件以及删除目录文件等等命令,实验是非常顺利的吧~

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): linuxprobe
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/linuxprobe/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 虚拟用户模式

最后要学习的虚拟用户模式是一种相比较来说最为安全的验证方式,需要为FTP传输服务单独建立用户数据库文件,虚拟出用来口令验证的帐户信息,这些帐号是在服务器系统中不存在的,仅供FTP传输服务做验证使用,因此这样即便骇客破解出了帐号口令密码后也无法登录到服务器主机上面,有效的降低了破坏范围和影响。所以只要在配置妥当合理的情况下,虚拟用户模式要比前两种验证方式更加的安全,同时配置的流程也稍微会复杂一些。

第1步:创建用于进行FTP验证的帐号密码数据库文件,单数行为账户名,偶数行为密码,例如分别创建出张三和李四两个用户,密码均为redhat:

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

但明文信息既不安全,也不能让vsftpd服务程序直接读取,因此需要使用db_load命令用HASH算法将这个原始的明文信息文件转换成数据库文件,并且再把数据库文件权限调小一些(避免其他人能看到数据库文件的内容),然后再把原始的明文信息文件删除掉。

[root@linuxprobe vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@linuxprobe vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@linuxprobe vsftpd]# chmod 600 vuser.db
[root@linuxprobe vsftpd]# rm -f vuser.list

第2步:创建用于FTP服务存储文件的根目录以及虚拟用户映射的系统本地用户,FTP服务存储文件的根目录指的是当虚拟用户登陆后默认所在的位置,但在Linux系统中的每一个文件都是有所有者和所有组属性的,例如用张三帐户创建了一个新文件,但是张三这个用户在系统中是找不到的,就会导致Linux系统中这个文件权限出现错误。因此还需要再创建一个用来让虚拟用户映射的系统本地用户,简单来说就是让虚拟用户默认登陆到这个本地用户的家目录中,创建的文件属性也都归属于这个本地用户,避免本地Linux系统无法处理这种虚拟用户创建的文件属性权限。为了方便管理FTP资料,可以把这个用于虚拟用户映射的系统本地用户的家目录设置到/var目录中(因为该目录是用来存放经常发生改变的数据),并且为了安全起见把这个系统本地用户的终端设置成不允许登陆,这不会影响虚拟用户的使用,还可以有效避免骇客通过该用户登陆到服务器主机上面。

[root@linuxprobe ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@linuxprobe ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@linuxprobe ~]# chmod -Rf 755 /var/ftproot/

第3步:建立用于支持虚拟用户的PAM认证文件,PAM可插拔认证模块(Pluggable Authentication Modules)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活的调整服务程序的不同认证方式。要想把PAM功能和作用讲透至少要一个章节的篇幅才可以,所以有兴趣的同学们可以看一下《Linux就该这么学》的进阶篇书籍,里面会给大家详细的讲解到,通俗来讲PAM是一组安全机制的模块(插件),让系统管理员可以轻易的调整服务程序的认证方式,而可以不必对应用程序做任何的修改,易用性很强。PAM采取了分层设计的思想——应用程序层、应用接口层、鉴别模块层,如图11-2所示:

PAM认证机制的体系图
图11-2 PAM可插拔认证模块功能流程图

新建一个用于虚拟用户验证的PAM文件替换掉原始的PAM文件,其中PAM文件内的db=参数为刚刚用db_load生成出的账户密码数据库文件的路径,但不用写后缀:

[root@linuxprobe ~]# 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支持文件,PAM API作为应用程序层与鉴别模块层的连接纽带,让应用程序可以根据需求灵活的在其中插入所需的鉴别功能模块,当应用程序需要PAM认证时,一般在应用程序中定义负责其认证的PAM配置文件,真正灵活的实现了认证功能。例如在vsftpd服务程序主配置文件中默认就写有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd的文件内容进行安全认证的,现在需要做的就是把vsftpd主配置文件中原先的PAM认证文件vsftpd修改成咱们自建的vsftpd.vu即可,需要使用到的参数及介绍有:

参数 作用
anonymous_enable=NO 禁止匿名开放模式。
local_enable=YES 允许本地用户模式。
guest_enable=YES 开启虚拟用户模式。
guest_username=virtual 指定虚拟用户帐号。
pam_service_name=vsftpd.vu 指定pam文件。
allow_writeable_chroot=YES 允许禁锢的FTP根目录可写而不拒绝用户登入请求。

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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

第5步:为虚拟用户设置不同的权限,虽然张三和李四两个帐户都是用于FTP服务验证的虚拟帐户,但也想在他们之间区别对待。比如只允许张三用户能够上传、创建、修改、查看、删除文件,而李四只能查看文件,这其实也是可以让vsftpd服务程序实现的,咱们只需要新建一个目录,在里面分别创建两个以张三和李四命名的文件,其中在张三命名的文件中写入相关允许的权限(使用匿名用户的参数):

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

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

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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
[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

第6步:设置SELinux域允许策略后尝试使用虚拟用户模式登陆FTP服务器,同学们有了刚刚两个验证模式的配置经验后一定能猜到SELinux会继续来“捣乱”,所以先按照刚刚的步骤开启SELinux域的允许策略吧,以免再次出现类似创建目录的操作失败的操作:

[root@linuxprobe ~]# 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
httpd_can_connect_ftp –> off
httpd_enable_ftp_server –> off
sftpd_anon_write –> off
sftpd_enable_homedirs –> off
sftpd_full_access –> off
sftpd_write_ssh_home –> off
tftp_anon_write –> off
tftp_home_dir –> off
[root@linuxprobe ~]# setsebool -P ftpd_full_access=on

此时不仅能够使用虚拟用户模式登陆到FTP服务器中了,还可以分别使用张三和李四用户检验下他们不同的权限,有没有特别好玩呢~当然读者们在工作中要学会灵活的搭配参数,不要完全按照实验操作而脱离客户需求。

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10: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@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10: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.
11.3 TFTP简单文件传输协议

TFTP简单文件传输协议是一种基于TCP/IP协议用于在客户端和服务器之间进行简单文件传输的协议——即提供不复杂、开销不大的文件传输服务,亦可把其当作是FTP协议的简化版本。TFTP并不能提供类似于FTP服务那样丰富强大的命令指令功能,甚至不能提供目录的遍历浏览,在安全性方面也不能提供类似于FTP服务的验证功能,而且传输基于UDP协议的69端口号,导致文件的传输过程也并不像FTP协议那样可靠。但由于TFTP协议不需要客户端的权限验证,也不需要太多无必要的系统和网络带宽损耗,因此可以提供比FTP协议更有效率的文件传输体验。咱们可以安装一下TFTP简单文件传输服务的软件包来动手体验一番:

[root@linuxprobe ~]# yum install tftp-server tftp
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Installing:
 tftp x86_64 5.2-11.el7 rhel 35 k
 tftp-server x86_64 5.2-11.el7 rhel 44 k
Installing for dependencies:
 xinetd x86_64 2:2.3.15-12.el7 rhel 128 k
Transaction Summary
================================================================================
Install 2 Packages (+1 Dependent package)
Total download size: 207 k
Installed size: 373 k
Is this ok [y/d/N]: y
Downloading packages:
………………省略部分输出信息………………
Installed:
 tftp.x86_64 0:5.2-11.el7 tftp-server.x86_64 0:5.2-11.el7 
Dependency Installed:
 xinetd.x86_64 2:2.3.15-12.el7 
Complete!

红帽RHEL7系统中TFTP服务是基于xinetd服务程序来管理的,xinetd服务可以用于管理需要的Linux系统服务,并且还提供有了强大的日志功能。简单来说,当安装TFTP简单文件传输协议的软件包后,还需要在xinetd服务程序中开启一下,把默认的禁用(disable)参数修改为no:

[root@linuxprobe ~.d]# vim /etc/xinetd.d/tftp
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@linuxprobe ~]# systemctl restart xinetd
[root@linuxprobe ~]# systemctl enable xinetd
[root@linuxprobe ~]# firewall-cmd --permanent --add-port=69/udp
success
[root@linuxprobe ~]# firewall-cmd --reload 
success

TFTP简单文件传输服务的根目录在/var/lib/tftpboot,因此可以用刚刚安装好的tftp命令来尝试获取一下文件,亲身体验一下TFTP带来的超简单文件传输过程,当然TFTP协议的玩法还不止于此,咱们还会在第19章中将TFTP服务与其他软件相搭配,组合出一套完整的自动化部署系统方案呢~tftp命令可用的参数包括有:

命令 作用
? 帮助信息
put 上传文件
get 下载文件
verbose 显示详细的处理信息
status 显示当前的状态信息
binary 使用二进制进行传输
ascii 使用ASCII码进行传输
timeout 设置重传的超时时间
quit 退出

[root@linuxprobe ~]# echo "i love linux" > /var/lib/tftpboot/readme.txt
[root@linuxprobe ~]# tftp 192.168.10.10
tftp> get readme.txt
tftp> quit
[root@linuxprobe ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures readme.txt Videos
Desktop Downloads Music Public Templates
[root@linuxprobe ~]# cat readme.txt 
i love linux

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(),B群:340829(推荐),C群:463590(推荐),点此查看全国群

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。

本章节的复习作业(答案就在问题的下一行哦,用鼠标选中即可看到的~)

1:简述FTP协议的功能作用,以及会占用那个端口号?

答案:FTP是一种能够让使用者在互联网中上传、下载文件的传输协议,占用有20和21端口号,分别用于传输文件与接受客户端FTP命令指令。

2:简述vsftpd服务程序提供的三种用户验证模式有何特点?

答案:匿名开放是任何人都无需口令认证即可登陆到FTP服务器的验证方式,本地用户是通过系统本地用户和密码信息来登陆到FTP服务器的验证方式,虚拟用户是通过创建独立的FTP数据库文件来进行的验证方式,相比较来说也是最为安全的模式。

3:使用匿名用户模式登陆到一台用vsftpd服务程序部署的FTP服务器上面,默认的FTP根目录是在系统中的什么位置?

答案:匿名用户模式登陆后的FTP根目录是在/var/ftp目录中,默认里面还会有一个叫做pub的子目录。

4:简述PAM可插拔认证模块的功能作用?

答案:PAM是一组安全机制的模块(插件),让系统管理员可以轻易的调整服务程序的认证方式,而可以不必对应用程序做任何的修改。

5:使用虚拟用户模式登陆的所有用户权限都是一样的吗?

答案:不一定,可以通过定义用户权限文件来为每一位用户设置不同的FTP服务权限。

6:简述TFTP与FTP协议有何不同之处?

答案:TFTP协议即提供不复杂、开销不大的文件传输服务,亦可把其当作是FTP协议的简化版本。