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

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


利用 pam_mysql 模块可以实现基于MySQL的FTP虚拟用户功能
项目网站:

http://pam-mysql.sourceforge.net/
https://sourceforge.net/projects/pam-mysql/
http://sf.net/projects/pam-mysql

注意:因为此项目年代久远不再更新,当前只支持CentOS 6,7,不支持CentOS 8

一、环境准备

在这里插入图片描述

本实验在两台主机上实现:
一台做为FTP服务器CentOS 7
一台做 Mariadb 数据库服务器
二、在数据库服务器上安装向导

安装mysql数据库

#注意:MySQL8.0由于取消了PASSWORD()函数不支持,因此选择Mariadb
[root@centos8 ~]#yum -y install mariadb-server
[root@centos8 ~]#systemctl enable --now mariadb.service

配置数据库支持vsftpd服务

#建立存储虚拟用户数据库和表
[root@centos8 ~]#mysql
mysql> CREATE DATABASE vsftpd;
mysql> USE vsftpd;
mysql> CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL
);
#添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储
mysql> INSERT INTO users(name,password) values('ftp_wang',password('magedu'));
mysql> INSERT INTO users(name,password) values('ftp_mage',password('magedu'));
mysql> select * from users;
+----+-----------+-------------------------------------------+
| id | name     | password                                   |
+----+-----------+-------------------------------------------+
|  1 | ftp_wang | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664  |
|  2 |ftp_wang   | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 |
+----+-----------+-------------------------------------------+
2 rows in set (0.001 sec)
#创建连接的数据库用户
mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'10.0.0.%' IDENTIFIED BY 'magedu';
mysql> FLUSH PRIVILEGES;
三、在FTP服务器上安装向导

安装vsftpd 和 pam_mysql包

[root@centos7 ~]#yum -y install vsftpd

安装 pam_mysql

对于 centos 6:pam_mysql由EPEL的源中提供

[root@centos6 ~]#yum install pam_mysql

对于 centos7 和 8:无对应rpm包,需手动编译安装

注意: 当前版本的源码不支持 CentOS 8,使用中会提示下面错误

[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

pam-mysql 源码进行编译

#安装相关包
[root@centos7 ~]#yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel 
#下载pam-mysql源码进行编译
[root@centos7 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-
0.7RC1.tar.gz
#https://github.com/NigelCunningham/pam-MySQL/archive/v0.8.1.tar.gz
[root@centos7 ~]#tar xvf pam_mysql-0.7RC1.tar.gz
[root@centos7 ~]#cd pam_mysql-0.7RC1/
[root@centos7 pam_mysql-0.7RC1]#./configure --with-pam-mods-dir=/lib64/security
#如果上面命令不指定 --with-pam-mods-dir=/lib64/security 会报以下错误
#checking if the second argument of pam_conv.conv() takes const pointer... no
configure: error: Your system doesn't appear to be configured to use PAM. 
Perhaps you need to specify the correct location where the PAM modules reside.
[root@centos7 pam_mysql-0.7RC1]#make install 
[root@centos7 pam_mysql-0.7RC1]#ll /lib64/security/pam_mysql*
-rwxr-xr-x 1 root root    882 Dec 17 14:34 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141712 Dec 17 14:34 /lib64/security/pam_mysql.so

建立pam认证所需文件

[root@centos7 ~]#vi /etc/pam.d/vsftpd.mysql 
#添加如下两行
auth required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd 
table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver 
db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

crypt 加密方式:

  • 0表示不加密
  • 1表示crypt(3)加密
  • 2表示使用mysql password()函数加密
  • 3表示md5加密
  • 4表示sha1加密

配置字段说明

  • auth 表示认证
  • 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 密码的加密方式mysqlpassword()函数加密
四、建立相应用户和修改vsftpd配置文件
#建立虚拟用户映射的系统用户及对应的目录
[root@centos7 ~]#useradd -s /sbin/nologin -d /data/ftproot -r vuser
#centos7 需除去ftp根目录的写权限
               
[root@centos7 ~]#mkdir -pv /data/ftproot/upload
[root@centos7 ~]#setfacl -m u:vuser:rwx /data/ftproot/upload
#确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql
启动vsftpd服务
[root@centos7 ~]#systemctl enable --now vsftpd

登陆ftp测试(在ftproot目录下创建ftproot.txt文件)

[root@localhost ~]# cd /data/ftproot/
[root@localhost ftproot]# touch ftproot.txt

登陆
[root@localhost ~]# ftp 172.26.122.116  (连接)
Connected to 172.26.122.116 (172.26.122.116).
220 (vsFTPd 3.0.2)
Name (172.26.122.116:root): li
331 Please specify the password.
Password:
230 Login successful.  (登陆成功)
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls  (可以看到/data/ftproot/下的目录和文件)
227 Entering Passive Mode (172,26,122,116,98,217).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Mar 11 03:23 ftproot.txt
drwxrwxr-x    2 0        0               6 Mar 11 02:50 upload
226 Directory send OK.
ftp> cd upload
ftp> put /etc/hosts  (但是无法上传,下面2.5.2.7方法设置不同用户的文件权限不一样,其中一个拥有上传权限)
local: /etc/hosts remote: /etc/hosts
227 Entering Passive Mode (172,26,122,116,104,48).
550 Permission denied.
五、在FTP服务器上配置虚拟用户具有不同的访问权限

vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户

的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其

路径及名称即可

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

登陆ftp测试

Name (172.26.122.116:root): li
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (172,26,122,116,132,90).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Mar 11 03:23 ftproot.txt
drwxrwxr-x    2 0        0               6 Mar 11 02:50 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.

ftp> put   (只能上次此目录下的文件)
anaconda-ks.cfg          .bashrc                  .mysql_history           .tcshrc
.bash_logout             .cshrc                   pam_mysql-0.7RC1/        
.bash_profile            ftproot.txt              pam_mysql-0.7RC1.tar.gz  
ftp> put ftproot.txt   (上次成功)
local: ftproot.txt remote: ftproot.txt
227 Entering Passive Mode (172,26,122,116,136,170).
150 Ok to send data.
226 Transfer complete.


虚拟用户登录有的目录改变至指定的目录(/data/ftproot2此目录需要提前创建,或者之后创建后重新登陆ftp)
local_root=/data/ftproot2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值