vsftpd使用mysql完成用户验证(解决/var/lib/mysql/mysql.sock)

下面是我对vsftpd如何使用mysql完成用户验证的学习总结,不周之处,希望各位不吝赐教。

vsftpd的用户验证机制分为虚拟用户、系统用户(本地用户)、匿名用户。因为涉及到读写磁盘,所以用户管理机制至关重要。

系统用户也叫本地用户,无非就是操作系统自己的用户,vsftp可以使用服务器上现有的用户来登录。有关的配置项大都带有local字样,意为“本地用户”。

匿名用户就是一个众人皆知账密的用户,它映射为系统上一个名字叫ftp的用户,而后有一些关于anonymous的专用配置为之服务。

虚拟用户是说,vsftp自己的用户机制,但是它也映射为系统上的某个用户,而这个系统用户不是用于真正登录系统的,所以所谓“虚拟”大概就是相对于操作系统而言。

而vsftpd的虚拟用户又可以有用户文件和mysql两种方式,其中用户文件方式需要hash格式存储,不是记录的重点,以下主要记录vsftpd+mysql方式实现vsftp登录。

1、准备工作

操作系统是centos6.10,mysql我使用的是之前通用二进制包安装的mariadb10.5.13,算是比较新的版本。

安装vsftpd过程省略。

安装依赖:pam_mysql,有关pam概念在此先不深究,重点放在ftp上。

2、mysql数据库建立

就是在mysql里面建立一个存储用户信息的表,以后登录vsftp时,从这个表里查询实现验证。因为我做开发多年,所以数据库部分按照习惯随便做就可以了。我只说结果。

我建立的:库vsftpdb,表users(fID,fName,fPwd),其中fID是主键,我使用了自动生成uuid(guid)。fPwd我使用了password函数加密。这些都是用于登录vsftp用户的信息。跟mysql无关,只是利用mysql存储和查询。

授权方面:授权一个vsftpd账号用于登录mysql。我只授权给它查询权限。这是用于登录数据库的mysql用户。实际上mysql里有个库名为:mysql,库里面有个表名为:user,表里面存的就是用于登录mysql的用户信息。

代码贴出来给初学数据库的朋友参考。

create database vsftpdb;

use vsftpdb;

create table users (
    fID varchar(36) NOT NULL DEFAULT uuid() PRIMARY KEY,
    fName varchar(20),
    fPwd varchar(50)
);

insert into users (fName,fPwd) values 
('tom',password('123')),
('jerry',password('456')),
('mike',password('789'));

grant select on vsftpdb.* to 'vsftpd'@'localhost' identified by 'db_password';
grant select on vsftpdb.* to 'vsftpd'@'127.0.0.1' identified by 'db_password';

flush privileges;

3、pam_mysql

新建一个文件/etc/pam.d/vsftpd.mysql,也可以直接改/etc/pam.d/vsftpd。里面添加:

auth    required        pam_mysql.so    user=vsftpd passwd=db_password host=/usr/local/mysql/mariadb.sock db=vsftpdb table=users usercolumn=fName passwdcolumn=fPwd crypt=2
account required        pam_mysql.so    user=vsftpd passwd=db_password host=/usr/local/mysql/mariadb.sock db=vsftpdb table=users usercolumn=fName passwdcolumn=fPwd crypt=2

其中host我使用了我安装mariadb的sock路径,也可以使用127.0.0.1,但是使用localhost的话,无法登录。查看日志/var/log/secure能看到错误信息:

vsftpd[3891]: pam_mysql - MySQL error (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2))

我现在一看到有关mysql.sock的错误信息,立刻就知道如何解决。所以才有了上面的方式。

我查了一下有关pam的文件,并不能找到'/var/lib/mysql/mysql.sock'这个路径的来历。在编译安装lamp的时候,我知道mariadb通用二进制包安装以后,默认的/tmp/mysql.sock其实最终是安装目录下的bin/mariadb_config --socket这个命令生成的。所以系统自带的/usr/bin/mysql_config --socket默认路径也一定是/var/lib/mysql/mysql.sock。我尝试用mariadb_config替代系统自带的mysql_config并不能影响pam_mysql的这个提示路径,所以我认为,这是pam_mysql写死的东西,因此就不深究了。

有关上面pam配置文件内容的格式,可以参考man pam.conf,也可以:

[root@192 ~]# rpm -ql pam_mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7
/usr/share/doc/pam_mysql-0.7/COPYING
/usr/share/doc/pam_mysql-0.7/CREDITS
/usr/share/doc/pam_mysql-0.7/ChangeLog
/usr/share/doc/pam_mysql-0.7/NEWS
/usr/share/doc/pam_mysql-0.7/README
[root@192 ~]# less /usr/share/doc/pam_mysql-0.7/README

里面内容挺多的,不一一列举,总之看了就会用。

4、建立一个虚拟系统用户

useradd -s /sbin/nologin -d /var/ftproot virtual_user
chmod go+rx /var/ftproot

5、修改vsftpd配置文件,/etc/vsftpd/vsftpd.conf

anonymous_enable=YES
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES

实际上我就没怎么改,默认就差不多。

添加:

guest_enable=YES
guest_username=virtual_user(跟上一步创建那个用户一致)

修改:

pam_service_name=vsftpd.mysql(因为我之前创建了这个文件,一致就行了。)

然后重载一下配置文件就可以了。

service vsftpd reload

在windows下登录vsftp成功,就表示完成了。

d76ca33d45d74a5a934d7f0bfdb38834.png

 建议失败的时候,看日志文件:

/var/log/message

/var/log/secure

本文完。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值