结合pam_mysql搭建vsftpd服务,实现从mysql数据库中读取虚拟用户信息

1、前言

本文记录了我实验vsftpd服务利用pam_mysql读取mysql数据库中的用户信息来进行vsftpd服务认证的配置流程及要点。
这里得pam是Linux系统中的有一个可插入认证模块,是一种高效且灵活便利的用户认证方式。系统管理员可以随意选择程序的认证方式,且不用重新对应用程序进行编译。pam的配置文件存放在/etc/pam.d目录下,分别为不同的应用程序提供pam认证。pam认证的模块存放在/lib/security目录下,以加载动态库的形式进行调用。
本次实验准备了两台Centos7虚拟机服务器,其分别为:vsftpd服务器:192.168.0.81,mariadb服务器:192.168.0.84

2、搭建Mariadb服务器

安装mariadb服务:

[root@mysql ~]# yum install -y mariadb-server

编辑/etc/my.cnf文件:

[root@mysql ~]# vim /etc/my.cnf
[mysqld]
skip-name-resolve=ON

在执行mysql初始化安全加固后启动mariadb服务:

[root@mysql ~]# mysql_secure_installation
[root@mysql ~]# systemctl start mariadb

随后创建一个新的数据库,并生成vsftpd用户相应的数据表:


[root@mysql ~]# mysql -uroot -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
MariaDB [(none)]> CREATE DATABASE vsftpd;  #创建vsftpd数据库
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> USE vsftpd  #进入vsftpd数据库
Database changed
#创建vsftpuser数据表,包含着vsftp用户的账号和密码信息
MariaDB [vsftpd]> CREATE TABLE vsftpuser ( name VARCHAR(30) PRIMARY KEY UNIQUE KEY NOT NULL,passwd VARCHAR(50));
Query OK, 0 rows affected (0.00 sec)

#使用password加密函数能对密码进行加密,以免被人查看导致泄露
MariaDB [vsftpd]> INSERT INTO vsftpuser (name,passwd) values ("magedu",password(123456)),("vsftp",password("hello")),("charlie",password("magedu")); 
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [vsftpd]> select * from vsftpuser;
+---------+-------------------------------------------+
| name    | passwd                                    |
+---------+-------------------------------------------+
| charlie | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 |
| magedu  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| vsftp   | *6B4F89A54E2D27ECD7E8DA05B4AB8FD9D1D8B119 |
+---------+-------------------------------------------+
3 rows in set (0.00 sec)

Query OK, 1 row affected (0.00 sec)

MariaDB [vsftpd]> GRANT ALL ON vsftpd.vsftpuser TO 'vsftpuser'@'192.168.%.%' IDENTIFIED BY "magedu";  #新增vsftpuser授权管理vsftpd数据库中的vsftpuser表
Query OK, 0 rows affected (0.00 sec)
MariaDB [vsftpd]> FLUSH PRIVILEGES;  #刷新授权表;
Query OK, 0 rows affected (0.00 sec)

建议检查firewalld和selinux的状态,以免对结果造成影响。

3、搭建vsftpd服务器

首先安装vsftpd服务

[root@vsftp ~]# yum install -y vsftp
.....
已安装:
  vsftpd.x86_64 0:3.0.2-22.el7                                                                                  
完毕!

由于系统自带的pam认证默认不支持mysql认证,因此需要自己编译安装:

[root@vsftpd ~]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz --no-check-certificate  #获取pam_mysql源码包
100%[================================================================================================================>] 335,240     18.6KB/s 用时 18s    

2018-04-25 00:39:57 (18.6 KB/s) - 已保存 “pam_mysql-0.7RC1.tar.gz” [335240/335240])
[root@vsftpd ~]# yum groupinstall -y "development tools"  #安装开发环境组
#此处事先需安装mariadb-devel和pam-devel包提供相应的头文件和链接库给pam_mysql编译使用
#否则会出现类似报错:configure: error: Cannot locate mysql client library.和configure: error: Cannot find pam headers
[root@vsftpd pam_mysql-0.7RC1]# yum install -y mariadb-devel pam-devel  openssl-devel 
[root@vsftpd ~]# tar xf pam_mysql-0.7RC1.tar.gz
[root@vsftpd ~]# cd pam_mysql-0.7RC1
[root@vsftpd ~]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security  #编译pam_mysql
[root@vsftpd ~]# make && make install
[root@vsftpd ~]# ll /lib64/security/ | grep mysql
-rwxr-xr-x. 1 root root    882 4月  25 02:06 pam_mysql.la
-rwxr-xr-x. 1 root root 141673 4月  25 02:06 pam_mysql.so

随后编辑/etc/pam.d/vsftpd文件:

[root@localhost ~]# vim  /etc/pam.d/vsftpd.mysql
#添加下面两行
auth required /lib64/security/pam_mysql.so user=vsftpuser passwd=magedu host=192.168.0.84 db=vsftpd table=vsftpuser usercolumn=name passwdcolumn=passwd crypt=2
account required /lib64/security/pam_mysql.so user=vsftpuser passwd=magedu host=192.168.0.84 db=vsftpd table=vsftpuser usercolumn=name passwdcolumn=passwd crypt=2

其中crypt分别表示:

crypt=0: 明文密码
crypt=1: 使用crpyt()函数加密
crypt=2: 使用MYSQL中的password()函数加密
crypt=3:使用md5的散列方式

随后编辑/etc/vsftpd/vsftpd.conf文件:

[root@vsftpd ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=vftp
user_config_dir=/etc/vsftpd/vusers_profile
anon_upload_enable=YES
pam_service_name=vsftpd.mysql
chroot_local_user=YES
allow_writeable_chroot=YES
[root@vsftpd ~]# useradd -d /var/vuserroot -s /sbin/nologin vftp  #创建系统用户vftp,并制定其家目录为/var/vuserroot
[root@vsftpd ~]# chmod -Rf 755 /var/vuserroot/  #修改目录的权限使得其他用户也可以访问

随后分别编辑虚拟用户的权限配置文件:

[root@vsftpd ~]# mkdir /etc/vsftpd/vusers_profile/
[root@vsftpd ~]# vim /etc/vsftpd/vusers_profile/vsftp
local_root=/var/vsftp
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

[root@vsftpd ~]# vim /etc/vsftpd/vusers_profile/charlie 
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES

[root@vsftpd ~]# vim /etc/vsftpd/vusers_profile/magedu 
local_root=/vftp/magedu
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES

最后分别创建各个虚拟用户对应的根目录并更改属主和属组为vsftp的guest用户:

[root@vsftpd ~]# mkdir /var/vsftp/  
[root@vsftpd ~]# mkdir /vftp/magedu/
[root@vsftpd ~]# chown vftp:vftp /var/vsftp/
[root@vsftpd ~]# chown vftp:vftp /vftp/magedu/

启动vsftpd服务:

[root@vsftpd ~]# systemctl start vsftpd

在第三方测试机上连接测试:

[root@test ~]# ftp 192.168.0.81
Connected to 192.168.0.81 (192.168.0.81).
220 (vsFTPd 3.0.2)
Name (192.168.0.81:root): charlie  #测试charlie用户的权限及连接性
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put linuxguide 
local: linuxguide remote: linuxguide
227 Entering Passive Mode (192,168,0,81,212,115).
150 Ok to send data.
226 Transfer complete.
ftp> mkdir charlie_dir
257 "/charlie_dir" created
ftp> rm charlie_dir
250 Remove directory operation successful.
[root@test ~]# lftp 192.168.0.81 -uvsftp  #测试vsftp用户的权限及连接性
Password: 
lftp [email protected]:~> ls
-rw-r--r--    1 0        0              12 Apr 24 19:46 testfile
lftp [email protected]:/> put linuxguide 
lftp [email protected]:/> mkdir magedu_dir
mkdir ok, `magedu_dir' created
lftp [email protected]:/> rm testfile
rm ok, `testfile' removed

[root@test ~]# lftp 192.168.0.81 -umagedu  #测试magedu用户的权限及连接性
Password: 
lftp [email protected]:~>          
lftp [email protected]:~> 
lftp [email protected]:~> ls
-rw-r--r--    1 0        0               0 Apr 23 19:34 hello
-rw-r--r--    1 0        0               0 Apr 23 19:34 magedu
lftp [email protected]:/> put linuxguide 
lftp [email protected]:/> get magedu
lftp [email protected]:/> rm hello 
rm ok, `hello' removed

你可能感兴趣的:(结合pam_mysql搭建vsftpd服务,实现从mysql数据库中读取虚拟用户信息)