本文主要是介绍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成功,就表示完成了。
建议失败的时候,看日志文件:
/var/log/message
/var/log/secure
本文完。
这篇关于vsftpd使用mysql完成用户验证(解决/var/lib/mysql/mysql.sock)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!