章节简述:
本章节先通过介绍文件传输协议来帮助读者理解FTP协议的用处,安装vsftpd服务程序并逐条分析服务文件的配置参数。
完整演示vsftpd服务匿名访问模式、本地用户模式及虚拟用户模式的配置方法,介绍PAM可插拔式认证模块的原理与认证流程。
通过配置vsftpd服务程序,进一步的锻炼了读者SELinux服务策略、安全上下文以及防火墙的配置与排错能力。
本章目录结构
11.1 文件传输协议
文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传、下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件传输则需要FTP服务端和FTP客户端的配合才行。
通常用户使用FTP客户端软件向FTP服务器发起连接并发送FTP指令,服务器收到用户指令后将执行结果返回客户端。
FTP协议占用两个端口号:
21端口:命令控制,用于接收客户端执行的FTP命令。
20端口:数据传输,用于上传、下载文件数据。
FTP数据传输的类型:
主动模式:FTP服务端主动向FTP客户端发起连接请求。
被动模式:FTP服务端等待FTP客户端的连接请求。
11.2 安装vsftpd服务程序
Vsftpd即“Very Secure FTP Daemon”是一款运行在类Unix操作系统的FTP服务端程序,Vsftpd主打的是安全性、完全开源及免费、速率高、支持IPv6、虚拟用户功能等等其他FTP服务端软件不具备的功能。
安装vsftpd服务程序包:
[root@linuxprobe ~]# yum install vsftpd -y Loaded plugins: langpacks, product-id, subscription-manager …………………省略部分安装过程……………… ---> Package vsftpd.x86_64 0:3.0.2-9.el7 will be installed --> Finished Dependency Resolution …………………省略部分安装过程………………… Installed: vsftpd.x86_64 0:3.0.2-9.el7 Complete!
清空默认的防火墙默认规则:
[root@linuxprobe ~]# iptables -F
保存清空后的防火墙规则表:
[root@linuxprobe ~]# service iptables save
Vsftpd的程序与配置文件:
主程序 | /usr/sbin/vsftpd |
用户禁止登陆列表 | /etc/vsftpd/ftpusers /etc/vsftpd/user_list |
主配置文件 | /etc/vsftpd/vsftpd.conf |
先来分析下vsftpd程序的主配置文件吧:
[root@linuxprobe ~]# cat /etc/vsftpd/vsftpd.conf
主配置文件长达123行,但大部分是以#号开始的,这些都是注释信息,我们可以过滤掉它们。
备份vsftpd的主配置文件:
[root@linuxprobe ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
过滤掉所有包含#号的行,并将过滤结果写回到vsftpd.conf文件中:
[root@linuxprobe ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
此时再分析下vsftpd程序的主配置文件吧:
[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.3 Vsftpd的验证方式
vsftpd程序提供的FTP服务可选认证方式,分别为匿名访问、本地用户和虚拟用户:
匿名访问:任何人无需验证口令即可登入FTP服务端。
本地用户:使用FTP服务器中的用户、密码信息。
虚拟用户:创建独立的FTP帐号资料。
顾名思义匿名访问就是所有人均可随意登入FTP服务,这样自然会产生安全问题,一般用于存放公开的数据。
而本地用户与虚拟用户则需要用户提供帐号及口令后才能登入FTP服务,更加的安全,而虚拟用户则是最安全的。
下面的实验环节将使用两台红帽RHEL7系统的主机,读者需要提前配置网卡的IP地址等信息:
主机名称 | 操作系统 | IP地址 |
FTP服务端 | 红帽RHEL7操作系统 | 192.168.10.10 |
FTP客户端 | 红帽RHEL7操作系统 | 192.168.10.20 |
11.3.1 匿名访问模式
FTP匿名访问模式是比较不安全的服务模式,尤其在真实的工作环境中千万不要存放敏感的数据,以免泄露。
vsftpd程序默认已经允许匿名访问模式,我们要做的就是开启匿名用户的上传和写入权限,写入下面的参数:
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
参数 | 作用 |
anonymous_enable=YES | 允许匿名访问模式。 |
anon_umask=022 | 匿名用户上传文件的umask值。 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名或删除目录 |
确认填写正确后保存并退出vsftpd.conf文件,然后重启vsftpd服务程序并设置为开机自启动。
[root @linuxprobe ~ ] # systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
因为在红帽RHCSA、RHCE或RHCA考试后都要重启您的实验机再执行判分脚本。
所以请读者在日常工作中也要记得将需要的服务加入到开机启动项中:"systemctl enable vsftpd"。
如果重启vsftpd服务程序时没有报错,此时便可以使用FTP客户机(192.168.10.20)尝试登入FTP服务了。
ftp命令用于使用FTP服务,格式为:“ftp [参数] [FTP主机]”。
红帽RHEL7系统中ftp命令默认没有安装,请执行"yum install ftp -y"即可安装完毕。
在客户端尝试登入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): 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.
上面操作中已经将防火墙规则清空,在vsftpd.conf文件中也已经允许匿名用户创建目录与写入权限,那怎么会被拒绝了呢?
这里建议读者先不要往下看,思考后用自己的方法解决下这个问题,长期这样你的Linux的排错能力一定会练出来的。
回想前面的参数细节,匿名访问模式的FTP根目录为/var/ftp:
[root@linuxprobe ~]# ls -ld /var/ftp/pub drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub
原来匿名用户的FTP根目录所有者/组都是root,所以匿名用户没有写入权限,那我们将所有者修改为ftp试试吧。
[root@linuxprobe ~]# chown ftp /var/ftp/pub
此时再用ftp命令尝试登入FTP服务并创建文件:
ftp> mkdir files 550 Create directory operation failed.
可恶!又报错了!!虽然这次报错代码还是550,但前面提示权限拒绝,这次是操作失败,马上想到是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
设置SELinux服务对ftp服务的访问规则策略为允许。
[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.3.2 本地用户模式
既然要使用本地用户模式,而本地用户模式确实要比匿名访问模式更加的安全,所以本实验中会关闭匿名访问模式。
vsftpd服务程序默认已经允许本地用户模式,我们要做的是添加设置本地用户模式权限的参数:
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
参数 | 作用 |
anonymous_enable=NO | 禁止匿名访问模式。 |
local_enable=YES | 允许本地用户模式。 |
write_enable=YES | 设置可写入权限。 |
local_umask=022 | 本地用户模式创建文件的umask值。 |
userlist_deny=YES | 参数值为YES即禁止名单中的用户,参数值为NO则代表仅允许名单中的用户。 |
userlist_enable=YES | 允许“禁止登陆名单”,名单文件为ftpusers与user_list。 |
确认填写正确后保存并退出vsftpd.conf文件,然后重启vsftpd服务程序并设置为开机自启动。
[root @linuxprobe ~ ] # systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
因为在红帽RHCSA、RHCE或RHCA考试后都要重启您的实验机再执行判分脚本。
所以请读者在日常工作中也要记得将需要的服务加入到开机启动项中:”systemctl enable vsftpd“。
如果重启vsftpd服务程序时没有报错,此时便可以使用FTP客户机(192.168.10.20)尝试登入FTP服务了~
我们先来看下ftpusers或user_list文件中禁止登陆用户名单:
root
bin
daemon
adm
lp
sync
shutdown
halt
news
uucp
operator
games
nobody
vsftpd服务为了让FTP服务更加的安全,默认禁止以root身份登入,那么创建个普通用户吧:
[root@linuxprobe ~]# useradd linuxprobe
为linuxprobe用户设置密码:
[root@linuxprobe ~]# passwd linuxprobe Changing password for user linuxprobe. New password: Retype new password: passwd: all authentication tokens updated successfully.
在客户端尝试登入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.
有了上面配置匿名访问模式的经验,这次再遇到了“操作被拒绝”,应该马上想到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
设置SELinux对FTP服务的规则为允许:
[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): 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.3.3 虚拟用户模式
因为虚拟用户模式的帐号口令都不是真实系统中存在的,所以只要配置妥当虚拟用户模式会比本地用户模式更加安全,但是Vsftpd服务配置虚拟用户模式的操作步骤相对复杂一些,具体流程如下:
第1步:建立虚拟FTP用户数据库文件。
第2步:创建FTP根目录及虚拟用户映射的系统用户。
第3步:建立支持虚拟用户的PAM认证文件。
第4步:在vsftpd.conf文件中添加支持配置。
第5步:为虚拟用户设置不同的权限。
第6步:重启vsftpd服务,验证实验效果。
第1步:建立虚拟FTP用户数据库文件。
切换至vsftpd程序目录:
[root@linuxprobe ~]# cd /etc/vsftpd/
创建用于生成FTP用户数据库的原始帐号和密码文件:
[root@linuxprobe vsftpd]# vim vuser.list //单数行为帐号,双数行为密码。 linuxprobe pa33w0rd blackshield pa22w1rd
使用db_load命令用HASH算法生成FTP用户数据库文件vuser.db:
[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)
FTP用户数据库内容很敏感,所以权限给小一些:
[root@linuxprobe vsftpd]# chmod 600 vuser.db
删除原始的帐号和密码文件:
[root@linuxprobe vsftpd]# rm -f vuser.list
第2步:创建FTP根目录及虚拟用户映射的系统用户。
创建用户virtual并设置为不允许登陆系统并定义该用户的家目录:
[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/
为保证其他用户可以访问,给予rwxr-xr-x权限:
[root@linuxprobe ~]# chmod -Rf 755 /var/ftproot/
第3步:建立支持虚拟用户的PAM认证文件:
[root@linuxprobe ~]# vim /etc/pam.d/vsftpd.vu //参数db用于指向刚刚生成的vuser.db文件,但不要写后缀。 auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser
第4步:在vsftpd.conf文件中添加支持配置。
既然要使用虚拟用户模式,而虚拟用户模式确实要比匿名访问模式更加的安全,配置的同时也关闭匿名开放模式。
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
参数 | 作用 |
anonymous_enable=NO | 禁止匿名开放模式。 |
local_enable=YES | 允许本地用户模式。 |
guest_enable=YES | 开启虚拟用户模式。 |
guest_username=virtual | 指定虚拟用户帐号。 |
pam_service_name=vsftpd.vu | 指定pam文件。 |
allow_writeable_chroot=YES | 允许禁锢的FTP根目录可写而不拒绝用户登入请求。 |
第5步:为虚拟用户设置不同的权限
现在不论是linuxprobe还是blackshield帐户,他们的权限都是相同的——默认不能上传、创建、修改文件,如果希望用户blackshield能够完全的管理FTP内的资料,就需要让FTP程序支持独立的用户权限配置文件了:
指定用户独立的权限配置文件存放的目录:
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vusers_dir
创建用户独立的权限配置文件存放的目录:
[root@linuxprobe ~]# mkdir /etc/vsftpd/vusers_dir/
切换进入到该目录中:
[root@linuxprobe ~]# cd /etc/vsftpd/vusers_dir/
创建空白的linuxprobe的配置文件:
[root@linuxprobe vusers_dir]# touch linuxprobe
指定blackshield用户的具体权限:
[root@linuxprobe vusers_dir]# vim blackshield anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
第6步:重启vsftpd服务,验证实验效果。
确认填写正确后保存并退出vsftpd.conf文件,重启vsftpd程序并设置为开机后自动启用:
[root @linuxprobe ~ ] # systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
因为在红帽RHCSA、RHCE或RHCA考试后都要重启您的实验机再执行判分脚本。
所以请读者在日常工作中也要记得将需要的服务加入到开机启动项中:”systemctl enable vsftpd“。
如果重启vsftpd并没有看到报错,此时可使用FTP客户机(192.168.10.20)尝试登入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): blackshield 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.
有了上面配置匿名访问模式和本地用户模式的经验,这次再遇到了“操作被拒绝”,应该马上想到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
设置SELinux对FTP服务的规则为允许:
[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): blackshield 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.
使用linuxprobe用户创建(肯定会报错):
[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 Permission denied. ftp> exit 221 Goodbye.
有没有觉得很有意思?当然读者们在工作中要学会灵活的搭配参数,不要完全按照实验操作而脱离客户需求。
出现问题?大胆提问!
因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~
Linux技术交流请加A群:560843(满),B群:340829(推荐),C群:463590(推荐),点此查看全国群。
*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。
11.4 可插拔认证模块PAM
刚刚在上面Vsftpd服务的虚拟用户模式中提到到了一个叫做PAM的东西,现在为大家简单的介绍下PAM。
可插拔认证模块PAM(Pluggable Authentication Modules)是一种认证机制,通过一些动态链接库和统一的API将系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活的调整服务程序的不同认证方式。
/lib/security:pam认证模块。/etc/pam.d:针对不同服务而定义好的pam配置文件。
pam_service_name=vsftpd
表示登陆FTP服务器时是根据/etc/pam.d/vsftpd的文件内容进行安全认证的。
因为我们平时不会经常修改PAM配置文件,而且PAM模块相对比较复杂,所以不在本章中继续讲解,读者必需能够理解刚刚实验中出现的vsftpd.vu文件的作用以及存放位置。