使用vsftp虚拟用户实现安全访问控制

一、ftp连接方式

1、命令连接

   ftp在与用户交互时,首先打开的是TCP的21号端口,建立命令连接,这个连接会始终存在,直到用户输入bye的那一刻,才断开命令连接。

2、数据连接

   1)主动连接

   主动连接是基于TCP21号端口的,这种方式下,是ftp服务器主动去连接客户端的,而客户端该使用哪个端口来响应这个请求呢?在这种情况下,ftp服务器和客户端就会达成一个共识:ftp服务器主动连接请求的端口是用于命令连接的端口加1,如果端口被占用,就再加1,直到找到空闲的端口为止。假如客户端与服务端建立的命令连接是:CIP,12345,SIP,21 此时客户端使用12345这个端口与ftp服务器的21号端口建立命令连接,那么在主动连接时,服务器就会使用12345+1=12346这个端口去主动连接客户端。

   使用主动连接这种方式去连接客户端,就必然会造成一种缺陷:客户端是不向外提供服务的,所以对于像这种主动来扫描它端口的行为就会被认为是一种赤裸裸的挑衅,一种攻击,因此很容易被客户端防火墙拒绝掉,造成连接的失败。

   2)被动连接

   被动连接是基于TCP的随机端口,这种方式下,客户端会发送给服务器两个数字(如123,89),那么这时建立的数据连接端口就是123*256+89。

二、用户认证方式

1、匿名用户

   在登录FTP时使用默认的用户名,一般是ftp或anonymous

2、系统用户

   使用系统用户登录,在/etc/passwd中

3、虚拟用户

   FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户登录FTP,只能访问FTP服务器提供的资源,大大增强了系统的安全。

   虚拟用户的优点:

   1)独立:即为虚拟的,那么不会受到系统其他用户的影响

2)安全:如果vsftpd用本地用户搭建的话,有可能由于限制目录,权限等问题而引发安全为题

三、配置虚拟用户,实现安全控制(vsftpd+pam_mysql+mysql)

1、使用ftp虚拟用户案例

   某技术论坛需要做一个与用户交流使用的FTP服务器,需实现以下2条功能:

   1)专用账号(ftpuser1)允许用户上传文件、下载文件、删除文件、创建目录

   2)专用账号(ftpuser2)则只允许用户下载,不允许上传

2、新建本地用户"vuser"

   为什么需要本地用户呢?因为虚拟用户在服务器系统上不存在,所以需要新建一个本地用户,把所有的虚拟用户映射为一个系统用户,它们访问时的文件目录就是此系统用户的家目录(默认权限是700)

wKiom1M_kSrhqJ3TAAAnR-ZexTE307.png

3、安装相关软件程序

[root@nmshuishui ~]# yum -y install vsftpd mysql-server mysql-devel pam_mysql

4、创建虚拟用户账号

   1)准备数据库及相关表

   (1)创建数据库

[root@nmshuishui ~]# service mysqld start

wKiom1M_k8qCmnL5AAAornfkznA427.png

   (2)授权管理数据库的用户及网段

wKiom1M_vveQWzhMAABGnDDInt8579.png

   (3)为vsftpd数据库创建用户表

wKioL1M_l5byw4hCAAAfc4RGuA4897.png

   2)添加测试的虚拟用户

   为了密码安全,在为虚拟用户添加密码时应该使用PASSWORD函数加密后存储

wKioL1M_v-WD_KLwAABJo1FEfqs455.png

5、配置vsftpd

   1)建立基于pam认证配置文件

[root@nmshuishui ~]# vim /etc/pam.d/vsftpd.mysql

   添加如下两行

auth required /lib64/security/pam_mysql.so user=vsftp passwd=vsftpd host=172.16.251.93 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.so user=vsftp passwd=vsftpd host=172.16.251.93 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

   注意:由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。

   2)修改vsftpd的配置文件(/etc/vsftpd/vsftpd.conf),使其支持mysql认证

wKiom1M_xNbDcdc-AAB0x1aKVBo553.png

   3)启动vsftpd服务进行测试

wKioL1M_wnuhI69ZAAApGoYZX6c873.png

为了以示区别,在公共目录/var/ftp/pub目录下,touch一个pub.txt,在/var/ftproot/目录下touch一个ftproot.txt

   (1)匿名用户登录

wKioL1M_uwGyIzAmAACTc7y8h1U413.png

   (2)虚拟用户ftpuser1登录

wKiom1M_u4-j91VCAAEOsrmTxws247.png

再看它所处的目录,是在/var/ftproot/目录下,有文件为证

wKioL1M_vDyQv2EGAABcZA8LTLA006.png

(3)虚拟用户ftpuser2登录

   虚拟用户ftpuser2登录后与ftpuser1登录所处的位置完全一样,不再贴图。

6、配置虚拟用户的访问权限

   vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。

   1)配置vsftpd为虚拟用户提供配置文件目录

#vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers  #添加此项

   2)创建虚拟用户的配置文件目录,并提供配置文件

[root@nmshuishui ~]# cd /etc/vsftpd/                #进入vsftpd目录
[root@nmshuishui vsftpd]# mkdir vusers              #创建虚拟用户的配置文件目录
[root@nmshuishui vsftpd]# cd vusers                 #进入虚拟用户的配置文件目录
[root@nmshuishui vusers]# touch ftpuser1 ftpuser2   #提供虚拟用户的配置文件
[root@nmshuishui vusers]# ls
ftpuser1  ftpuser2

   3)配置虚拟用户的访问权限

   (1)ftpuser1允许用户上传文件、下载文件、删除文件、创建目录

#vim ftpuser1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022

      在windows上使用FlashFXP测试

wKioL1M_1-Oip_RuAAETbyRKHKg711.png

   (2)ftpuser2只允许用户下载,不允许上传

既然只允许ftpuser2下载,不允许上传,那就不需要给它任何权限了,只要ftpuser1上传的文件可读,ftpuser2即可下载。

wKiom1M_2ljQOgSAAAF-sHU9U_g783.png

四、经验分享时刻

1、如果没有iptables规则的话,请关闭iptables,否则它会阻挡你vsftp服务的正常运行

2、如果不使用selinux,也请关闭,如果不关闭会报下面这个错(使用FlashFXP连接FTP服务器)

wKioL1NAFKmBfsuRAAB5uNWd29U178.png



你可能感兴趣的:(pam,FTP主动模式,vsftp虚拟用户)