任务情景
兴汉科技有限公司利用虚拟机搭建的VSFTP服务器,在使用过程中,由于安全的考虑等特殊原因,有些主机或用户风险较大,对VSFTP服务器的运行产生影响,决定禁止这些用户登录,以提升FTP服务器的安全性,达到管理好VSFTP服务器的目的。
任务分析
为了保证VSFTP服务器运行的可靠与安全稳定,需要设置主机的访问控制,使得真正需要VSFTP资源的用户才能访问,其它的主机或用户拒绝登录。
知识链接
1、设置允许或不允许访问的主机
Centos 8系统不再支持使用tcp_wrappers方法来禁止IP访问。tcp_wrappers方法能通过编辑/etc/hosts.allow和/etc/hosts.deny配置文件对IP禁止访问。此时,需要使用firewall-cmd命令来设置对IP的禁止访问。
添加或删除rules,增加或解除对IP的禁止访问。
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" reject' --permanent
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" reject' --permanent
firewall-cmd --reload
2、ftpusers文件的用途
ftpusers不受任何配置项的影响,它总是有效,就是一个黑名单!该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有过大权限的帐号(比如root)登入FTP,以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。
ftpusers和user_list没有任何关系,ftpusers文件总是生效。
3、user_list文件的用途
user_list文件是和userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单,具体设置请往下看。
4、设置允许或不允许访问的用户
对用户的访问控制由/etc/vsftpd/user_list和/etc/vsftpd/ftpusers文件来实现。相关配置命令如下表7-3-1:
表7-3-1 登录和用户访问控制语句
语句 | 功能 |
userlist_enable=YES | 是否使用控制用户登录的用户列表 |
userlist_file=/etc/vsftpd/user_list | 设置控制用户登录的用户列表文件 |
userlist_deny=YES | 禁止或允许user_list中的用户登录FTP服务器。只在userlist_enable设置为YES才生效 |
userlist_enable和userlist_deny两个选项联合起来针对的用户是:本地全体用户(除去ftpusers中的用户)、出现在user_list文件中的用户、不在user_list文件中的用户,这三类用户集合进行的设置。有三种方式的配置如下表7-3-2:
表7-3-2 白名单和黑名单的具体设置
方式 | 功能 |
userlist_enable=NO | 无论userlist_deny为何值都是无效的,本地全体用户(ftpusers中用户除外)都可以登入FTP |
userlist_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd/user_list | user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入; |
userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/user_list | user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);此时,匿名用户将无法登入!除非在user_list中加入一行:anonymous |
任务实施
前期的安装步骤与任务7.1的步骤1-3相同,此处从略,我们从配置文件的修改开始。
步骤1:测试VSFTP服务器配置主目录/etc/vsftpd/中ftpusers文件的作用。新建用户:xhadmin和test,并设置密码。再将test用户加入到文件ftpusers中。
[root@localhost ~]# useradd xhadmin
[root@localhost ~]# passwd xhadmin
[root@localhost ~]# useradd test
[root@localhost ~]# passwd test
[root@localhost ~]# vi /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
test
bin //保存退出
步骤2:Linux客户端测试,用test、root和xhadmin登录VSFTP服务器。
[root@localhost ~]# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.3)
Name (192.168.1.10:root): test
331 Please specify the password.
Password:
530 Login incorrect.
Login failed. //test用户登录失败
ftp> exit
221 Goodbye.
[root@localhost ~]# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.3)
Name (192.168.1.10:root): root
530 Permission denied.
Login failed. //root用户被拒绝登录
ftp> exit
221 Goodbye.
[root@localhost ~]# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.3)
Name (192.168.1.10:root): xhadmin
331 Please specify the password.
Password:
230 Login successful. //用户xhadmin成功登录
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
步骤3:控制主机的访问,因为Centos8系统不再支持使用tcp_wrappers方法来禁止IP访问。tcp_wrappers方法能通过编辑/etc/hosts.allow和/etc/hosts.deny配置文件对IP禁止访问。此时,需要使用firewall-cmd命令来设置对IP的禁止访问。
[root@localhost vsftpd]# systemctl start firewalld //启用防火墙
[root@localhost vsftpd]# firewall-cmd --zone=public --add-service=ftp --permanent
success //防火墙允许ftp服务
[root@localhost vsftpd]# firewall-cmd --permanent --add-port=20-21/tcp
success //防火墙开放20-21端口
[root@localhost vsftpd]# firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.1.20' reject" --permanent
success //防火墙拒绝192.168.1.20访问
[root@localhost vsftpd]# firewall-cmd –reload //重新加载防火墙规则
success
[root@localhost vsftpd]# firewall-cmd --remove-rich-rule="rule family='ipv4' source address='192.168.1.20' drop" --permanent
success //防火墙删除拒绝192.168.1.20访问
[root@localhost vsftpd]# firewall-cmd --reload
success
步骤4:在IP地址为192.168.1.20的Linux客户端测试:
[root@localhost ~]# ftp 192.168.1.10 //没有启用防火墙时能正常访问
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.3)
Name (192.168.1.10:root): xhadmin
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (192,168,1,10,91,215).
150 Here comes the directory listing.
-rw-r--r-- 1 1003 1003 2735 May 23 02:40 abc.txt
226 Directory send OK.
ftp> exit
221 Goodbye.
[root@localhost ~]# ftp 192.168.1.10 //启用防火墙后访问被拒绝
ftp: connect: Connection refused
ftp> exit
[root@localhost ~]# ftp 192.168.1.10 //删除拒绝规则后,能正常访问
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.3)
Name (192.168.1.10:root): xhadmin
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
步骤5:vsftp服务器对用户的拒绝,除了一个永远的黑名单ftpusers文件外,还有一个可能的黑名单user_list文件,这取决于userlist_enable=YES和userlist_deny=YES,当这两项都是YES时, user_list文件就是一个黑名单:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# vi /etc/vsftpd/vsftpd.conf
local_enable=YES
local_root=/ftpdir
userlist_enable=yes
userlist_deny=yes
[root@localhost ~]# vi /etc/vsftpd/user_list //此时,user_list文件就是一个黑名单
root
xhadmin
[root@localhost ~]# systemctl restart vsftpd
步骤6:客户端测试
[root@localhost ~]# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.3)
Name (192.168.1.10:root): xhadmin //xhadmin在黑名单中,被拒绝登录
530 Permission denied.
Login failed.
ftp>
步骤7:再修改vsftp服务器的主配置文件,对用户的拒绝,将userlist_enable=YES,而userlist_deny=NO,此时,user_list文件就是一个白名单。这时只有出现在白名单中的用户才会被准许登录 ,user_list之外的用户都被拒绝登入;此时,匿名用户也无法登入!除非在user_list中加入一行:anonymous。
[root@localhost ~]# vi /etc/vsftpd/vsftpd.conf
local_enable=YES
local_root=/ftpdir
userlist_enable=yes
userlist_deny=no
[root@localhost ~]# vi /etc/vsftpd/user_list //此时,user_list文件就是一个白名单
root
xhadmin
[root@localhost ~]# systemctl restart vsftpd
步骤8:客户端测试
[root@localhost ~]# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.3)
Name (192.168.1.10:root): xhadmin //在白名单中,能登录
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (192,168,1,10,40,163).
150 Here comes the directory listing.
-rw-r--r-- 1 1003 1003 2735 May 23 02:40 abc.txt
-rw-r--r-- 1 1003 1003 2735 May 23 02:44 xy.txt
226 Directory send OK.
ftp> exit
221 Goodbye.
[root@localhost ~]# ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.3)
Name (192.168.1.10:root): test //不在白名单中,登录失败
530 Permission denied.
Login failed.
ftp>