当前位置: > Linux服务器 > ftp >

图文详解vsftpd配置:虚拟用户篇

时间:2015-10-14 00:13来源:51cto.com 作者:IT
ftp服务器架设进阶设置
上季我们学习了vsftpd基于匿名用户的下载和上传功能,但是匿名始终是不安全的,所以今天我们就会讲到基于用户的访问和上传
要开启基于用户的访问控制,需要注意两个方面
1、配置文件的修改
2、selinux的修改

接着上季我们的配置,现在我们来修改配置文件
vim  /etc/vsftpd/vsftpd.conf

修改12行,是否允许匿名登陆改成NO

注释掉27和31行,意思是不允许匿名用户上传文件和目录

OK后,保存退出
第二步,修改selinux了哈
今天我们就不介绍图形界面了,直接使用命令来设置selinux
使用getsebool 找出关于ftp的selinux命令
getsebool -a | grep ftp

然后修改selinux,允许用户在家目录写入数据
setsebool -P allow_ftpd_anon_write off
setsebool -P ftp_home_dir .

第三步、创建虚拟用户
先创建一个用户,然后修改用户的登陆shell为nologin,让用户不能登陆系统,只能使用ftp之内的服务,然后使用passwd  redhat修改密码  

三步完成以后,就可以重新启动vsftpd服务,然后测试
  
我们先使用win来测试,打开资源管理器

现在提示输入用户和密码

登陆成功
  
现在测试能否写入数据,测试成功
  
现在ftp上去是可以删除的,在什么地方改,让他只能上传,不能删除呢?

这个问题不错,我们可以实现
但是如果自己上传了不能删除,那么谁来删除文件呢?

难道每次让服务器管理员来帮你删?好吧,我们来实现这个功能
把local umask 修改成222

然后保存,重新启动服务器

现在我们来测试,建立一个test vsftpd unmask222文件夹

我们删除他试试
  
删除刚才我们建立的目录vsftpd文件夹和UNIXCcode.rar文件试试

被成功删除了
  
  
就是本地用户上传文件的权限掩码,权限掩码是基础中文件权限的知识,参考RHCE课程-RH033Linux基础笔记八-文件强制位冒险位、ACL访问控制列表
一般我们都不这样设置,自己的目录自己有完全控制权限是正常,只是在一些公共目录里,我们需要设置强制位和冒险位,让其他用户不能 删除和更改自己的文件
好了,下面我们使用lftp测试  
像上季那样lftp 192.168.0.188登陆会失败
  
正确的登陆方法是lftp redhat@192.168.0.188

现在大家使用pwd试试,是不是看见自己在 /home/redhat目录下啊?


现在我们cd到/etc 下去试试 ,成功切换


现在我们下载系统的passwd 文件试试,下载成功,我们去看看

这样系统有多少用户都暴露在我们面前了


IE方式redhat登录的ftp界面

而且还可以下载shadow密码文件,进行破解。这样是不是很不安全啊,而且黑客还可以去看你服务器的配置文件,和你系统里的一些机密文件
下面我们就要使用chroot功能,修改配置文件,取消94行和96行的注释
意思是,开启chroot_list功能,而且chroot_list文件就在 /etc/vsftpd/目录下面

保存退出
chroot list默认是不存在的,需要我们手动建立,把redhat这个用户加到这个文件中,重新启动vsftpd服务

现在我们再来测试,现在使用pwd命令就看见自己已经在/下了

但是ls 发现这并不是真的/根目录
这里就是用户的家目录,这里没有etc目录,所以切换到etc就会失败


还有一点,提醒大家,匿名用户登陆,默认是choot了的
这个就是chroot_list的功能,大家明白了吗?这样就大大提高了我们系统的安全性
OK,下面我们把系统所有用户都加到chroot文件里
如果是很多用户每个都要加入chroot_list吗?可以使用cut命令
cut  -d  :  -f  1  /etc/passwd  >> chroot_list
cut命令是切去某一列,-d是每一列的分隔符,-f 是切取第几列,然后重定向到chroot文件

这样所有用户就进去了
我们现在测试的环境是RHEL5.1,防火墙默认是accept,selinux是强制
下面我们测试ftpusers 文件的功能,我们先看看ftpusers这个文件的内容

这里面都是些系统用户,ftpusers的功能是,阻止这个文件中的用户登陆
我们把redhat用户加进去,然后重启vsftpd服务

现在我们使用redhat登录试试

我输入了正确的密码,但是还是登陆失败了
OK,现在我们取消redhat用户的限制,让他可以登陆

又可以成功登陆了

如果系统有很多用户,不能使用ftp,我们要一个一个添加到这个文件里面,是不是很麻烦啊?
还有,系统添加一个用户也默认有ftp的登陆权限,是不是也不安全?
所以我们要制定更严格的ftp用户策略,我们将通过下面的配置,使只有在user_list文件中的用户才能登录系统
修改配置文件:vim /etc/vsftpd/vsftpd.conf
文件最后添加两行,修改成我图片中的样子
  
然后保存退出,重启vsftpd服务

使用刚才的用户测试下看能不能登陆,现在redhat不能登录了哈~

能登陆就有问题了,应该是不能登陆哈,然后把redhat用户加入到user_list文件中,重新启动服务,这样就可以登陆了

可以登陆了哈~

大家测试吧,注意检查ftpusers 这个文件里,不能有测试的用户存在,不然对测试结果要出现误导哈~
现在把ftpusers里的root用户删除了,然后加到user_list中

root应该都可以登陆的

现在就是访问控制了,使用iptables来控制ftp,只允许本地网络使用自己的ftp服务器
我们不测试本地网络,我们测试只允许某个IP地址访问我们的ftp服务器,这样好测试点
iptables -L 查看filter表的内容
由于我们现在不用NAT,我们就先不讲,只学filter,包过滤

iptables分两个表:filter和nat
filter表里面有3个链:
INPUT  chain
FORWARD chain
output chain
一般服务器上就用input连,来控制进入服务器的流量和包
下面我们写一个规则:禁止一个IP地址访问
这个IP地址就用你的服务器的IP地址
给INPUT添加一条规则内容

匹配源,也就是来自 192.168.0.188这个IP

[url=file:///C:/Documents%20and%20Settings/michael/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/8a9ed16b-4973-489a-bba3-35157a2b3217/image[138].png][img=454,28]file:///C:/Documents%20and%20Settings/michael/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/8a9ed16b-4973-489a-bba3-35157a2b3217/image_thumb[46].png[/img][/url]
接着就是匹配的协议和端口,我用的是tcp的21端口,也就是ftp服务器的命令连接端口

最后就是匹配这个规则的动作 -j REJECT 拒绝哈~
完整的命令就是这样:
在INPUT连中添加一条规则,匹配来自源为192.168.0.254的tcp包,连接自己的21号端口,匹配了的包就被REJECT,拒绝
iptables -A INPUT -s 192.168.0.188 -p tcp --dport 21 -j REJECT

查看,这条规则就写进入了,可以使用iptables -nL 查看,n参数的意思是不解析,这样看更直观,速度更快
大家看看他们的差别

修改规则后,保存,切记要保存,不然你的配置重新启动就会丢失

service iptables save
service iptables restart

现在我们用被拒绝的IP地址来测试还能不能够访问

登录失败了,访问被禁止了
OK,我们删除这条规则
删除INPUT的第五条规则:iptables -D INPUT 5

刚才的规则就被删除了,记住:保存

再测试

成功哈~
下面我们使用tcp_wrapper 来控制vsftpd
解释下tcp_wrapper
tcp_wrapper 就是tcp封装,是运行在介于防火墙和内部服务间的一个模块
只要支持tcp封装的服务,我们都可以使用tcp封装来控制他
那这么查看一个服务是不是支持tcp_wrapper呢?
我给大家介绍两个命令
只有运行这两个命令中其中一个有回显,就证明这个服务支持tcp封装,我们就可以使用tcp封装来控制这个服务的访问
这是第一个命令:
ldd `which vsftpd` | grep libwrap

这个是第二个命令:
strings `which vsftpd` | grep host

大家运行试试, which vsftpd 是 !旁边那个符号,意思是执行里面的命令取值,不是单引号,单引号的意思是不解释引号里面的内容
怎么使用tcp_wrapper呢,这就需要两个配置文件了
/etc/hosts.deny  
/etc/hosts.allow

要拒绝的IP地址我们写入hosts.deny里面,写进去后保存退出就生效,不需要重启之类的操作


这样192.168.0.186就被禁止了

tcp_wrapper和iptables,我们会跟着课程慢慢深入的介绍
好了,今天的课程就到这里。谢谢大家
#######################################
(责任编辑:IT)
------分隔线----------------------------