前言:

    在上一篇博客中,我们已经实现了基于文件认证的ftp服务,不过此方法也存在不少问题,比如过用户数据不好管理呀,以明文存储不安全呀。不能把用户数据单独存放在其他服务器呀等等。所以此次我们把用户数据放在mysql中,然后通过pam模块去mysql中找用户数据来实现认证。主体的过程和上篇区别不大~那我们就开始把~

正文:

    此次,我们的环境是centos6,因为centos7中的pam_mysql模块得自己手动编译,所以就先使用centos6,不过两者区别也不大,而且编译pam_mysql模块也不难。老规矩,第一步先安装要使用到的程序:

yum install vsftpd mysql-server pam_mysql

此次我们依然使用系统的ftp用户来作为虚拟用户登录后的guest。当然,也可以自行创建新的用户,此处就不再演示啦~在centos7中记住一点,用户的家目录,用户不可以有写权限哟。好吧,我们先在mysql中创建认证需要的数据库和表~先启动mysql服务

#service mysqld start
#mysql                    #用mysql命令以匿名的方式连接到数据库
#mysql>CREATE DATABASE vsftpd; #创建名为vsftpd的数据库
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY '1234';  #给mysql用户 vsftpd权限,让其有查询权限,且密码为1234,因为我们的mysqld和vsftpd在同一服务器,所以host填写的是localhost,如果你们的mysql在单独的服务器就添服务器的地址啦~
mysql>FLUSH PRIVILEGES;   
mysql>USE vsftpd;  #进入我们的数据库,开始创建表啦~~
mysql>CREATE TABLE users (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,name CHAR(50)
BINARY NOT NULL,password CHAR(48) BINARY NOT NULL);  #创建一个名为users的表,有三个字段分别是id为整型,主键,并且可以自增,name字段 是有50位的字符串,不能为空,password字段,因为我们还要对密码进行加密处理,处理后的长度是48位,所以长度是48 且不能为空
mysql> INSERT INTO users(name,password) values(‘xiaofengfeng',password('1234'));
mysql> INSERT INTO users(name,password) values(‘xiaofengfeng2',password('1234'));
#添加两个用户,密码都为1234

好啦~我们用于验证的数据库这边已经创建完毕,接下就开始配置ftp服务器啦,和上篇博客没太大区别,主要就是用了不同的pam模块,此处用到的是pam_mysql.so模块,首先我们先修改ftp的配置文件,只列出修改过的配置哈~

#/etc/vsftpd/vsftpd.conf
anonymous_enable=NO               #进制匿名登录
guest_enable=YES 
guest_username=ftp                 #所有登录的用户在服务端都当作ftp用户
pam_service_name=vsftpd.mysql      #pam的配置文件在/etc/pam.d目录下需要 自己创建

然后我们来创建pam模块需要的配置,在/etc/pam.d目录下新建文件vsftpd.mysql

#/etc/pam.d/vsftpd.mysql
auth required  pam_mysql.so user=vsftpd passwd=1234 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required  pam_mysql.so user=vsftpd passwd=1234 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

#此处用到pam_mysql.so模块,数据库的用户名为vsftpd 密码为1234 因为mysql数据库在本地所以host为localhost,如果在远端就写ip地址,数据库名为 vsftpd 表名为users 且要是用的用户名在name字段,用到的密码在password字段,因为密码字段是用musql的password()函数加密的,标号为2的加密算法可以就是与mysql的password()函数对应,所以此处crypt为2

还是老规矩,检查selinux是否关闭,iptables是否放行ftp服务。如果没有问题我们就可以用数据库的两个帐号登录了。如果需要哪个用户有上传数据的功能可以参考上篇博客,建立单独的用户配置文件,开启匿名上传功能。特别要注意的一点是,能让ftp用户对/var/ftp/pub有写权限,可以用acl也可以直接开放所有权限,或者建一个属主为ftp的目录upload专门用来让用户ftp上传文件。