实现基于MYSQL验证的vsftpd虚拟用户访问

发布时间 2023-10-07 15:14:03作者: 小糊涂90

 

#利用 pam_mysql 模块可以实现基于MySQL的FTP虚拟用户功能
#项目网站:http://pam-mysql.sourceforge.net/
#说明:因为此项目年代久远不再更新,当前只支持CentOS 6,7,不支持CentOS 8
环境准备:
本实验在两台主机上实现
一台作为FTP服务器centos7
一台作为mariadb数据库服务器centos8

#在数据库服务器安装mariadb数据库
[root@mariadb ~]#yum install -y mariadb-server;systemctl enable --now mariadb

#在数据库服务器上配置数据库支持vsftpd服务
[root@mariadb ~]#mysql
MariaDB [(none)]> create database vsftpd;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> use vsftpd;
Database changed

MariaDB [vsftpd]> create table users(id int auto_increment not null primary key,name char(50) binary not null,password char(48) binary not null);
Query OK, 0 rows affected (0.003 sec)

MariaDB [vsftpd]> insert into users(name,password) values('ftp_tan',password('123456'));
Query OK, 1 row affected (0.001 sec)

MariaDB [vsftpd]> insert into users(name,password) values('ftp_liang',password('123456'));
Query OK, 1 row affected (0.001 sec)

MariaDB [vsftpd]> select * from users;
+----+-----------+-------------------------------------------+
| id | name | password |
+----+-----------+-------------------------------------------+
| 1 | ftp_tan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | ftp_liang | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+-----------+-------------------------------------------+
2 rows in set (0.000 sec)

#创建连接数据库的用户
MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.000 sec)

MariaDB [vsftpd]> flush privileges;
Query OK, 0 rows affected (0.000 sec)

#在ftp服务器上安装vsftpd和pam_mysql的包
[root@ftp ~]# yum install -y vsftpd
#对于centos6,pam_mysql的包由epel源提供,对于centos7无对应的rpm包,需要手动编译安装
#当前版本的源码不支持centos8,使用中会提示如下错误
[root@centos8 ~]#tail -f /var/log/secure
Jan  2 10:20:31 centos8 vsftpd[15519]: PAM unable to
dlopen(/usr/lib64/security/pam_mysql.so): /usr/lib64/security/pam_mysql.so:
undefined symbol: make_scrambled_password

#centos7编译安装pam_mysql
[root@ftp ~]# yum install -y gcc gcc-c++ make mariadb-devel pam-devel
[root@ftp ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@ftp ~]# tar xf pam_mysql-0.7RC1.tar.gz
[root@ftp ~]# cd pam_mysql-0.7RC1
[root@ftp pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security
[root@ftp pam_mysql-0.7RC1]# make install
[root@ftp pam_mysql-0.7RC1]# ll /lib64/security/pam_mysql.*
-rwxr-xr-x 1 root root 882 Nov 18 17:02 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141712 Nov 18 17:02 /lib64/security/pam_mysql.so

#在ftp服务器上建立pam认证所需要的文件
[root@ftp ~]# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.150 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=10.0.0.150 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

#说明:配置参数参考pam_mysql-0.7RC1目录下的README文档
配置字段说明
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后
面为给此模块传递的参数
user=vsftpd为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密
crypt 加密方式:
0表示不加密
1表示crypt(3)加密
2表示使用mysql password()函数加密
3表示md5加密
4表示sha1加密

#建立相应用户和修改vsftpd配置文件
[root@ftp ~]# useradd -s /sbin/nologin -d /data/ftproot -r vuser
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql

#启动vsftpd服务
[root@ftp ~]# systemctl enable --now vsftpd

#在ftp服务器上配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户
的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其
路径及名称即可
[root@ftp ~]#vim /etc/vsftpd/vsftpd.conf
#添加如下选项
user_config_dir=/etc/vsftpd/conf.d/

#创建所需要目录,并为虚拟用户提供配置文件
[root@ftp ~]#mkdir /etc/vsftpd/conf.d/
#配置虚拟用户的访问权限
#虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户tan具有上传文件的权限,可修改/etc/vsftpd/conf.d/ftp_tan文件,在里面添加如下选项并设置为YES即可,只读则设为NO
#注意:需确保对应的映射用户对于文件系统有写权限
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
#登录目录改变至指定的目录
local_root=/data/ftproot2

[root@ftp ~]# cat /etc/vsftpd/conf.d/ftp_tan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@ftp ~]# cat /etc/vsftpd/conf.d/ftp_liang
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
local_root=/data/ftproot2

#ftp_tan用户还是访问根目录/data/ftproot,ftp服务放开了上传权限,再在文件系统放开vuser写权限
[root@ftp ~]#chmod 555 /data/ftproot
[root@ftp ~]# mkdir -pv /data/ftproot/upload
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/ftproot’
mkdir: created directory ‘/data/ftproot/upload’
[root@ftp ~]#setfacl -m u:vuser:rwx /data/ftproot/upload
[root@ftp ~]#touch /data/ftproot/f1

#ftp_liang用户访问的ftp根目录该为了/data/ftproot2,需要去掉写权限,否则此用户登录失败
[root@ftp ~]# chmod 555 /data/ftproot2
[root@ftp ~]#touch /data/ftproot2/f2

#测试:使用ftp_tan用户上传文件成功,ftp_liang用户登录看到/data/ftproot2目录下的文件成功
[root@mariadb ~]#ftp 10.0.0.152
Connected to 10.0.0.152 (10.0.0.152).
220 (vsFTPd 3.0.2)
Name (10.0.0.152:root): ftp_tan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,152,184,151).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 18 09:45 f1
drwxrwxr-x 2 0 0 6 Nov 18 09:12 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> send anaconda-ks.cfg
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (10,0,0,152,41,212).
150 Ok to send data.
226 Transfer complete.
1314 bytes sent in 0.000241 secs (5452.28 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (10,0,0,152,239,137).
150 Here comes the directory listing.
-rw------- 1 998 996 1314 Nov 18 09:54 anaconda-ks.cfg
226 Directory send OK.

[root@mariadb ~]#ftp 10.0.0.152
Connected to 10.0.0.152 (10.0.0.152).
220 (vsFTPd 3.0.2)
Name (10.0.0.152:root): ftp_liang
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,152,142,203).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 18 10:16 f2
226 Directory send OK.
ftp>