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