前言
- 1.FTP虚拟用户:FTP虚拟用户由ftp服务器提供,依赖于一个服务器本地账号,可以同时设置多个虚拟账号。vsftpd分辨虚拟用户,由可插入认证模块(PAM)认证,该模块的账号信息可用文件或者数据库存储。
FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户账号可以提供集中管理的FTP根目录,方便了管理员的管理,同时将用于FTP登录的用户名、密码与系统用户账号区别开,进一步增强了FTP服务器的安全性。
使用虚拟用户登录FTP服务器,可以避免使用操作系统帐号作为FTP用户带来的一些安全问题,也便于通过数据库或其它程序来进行管理。虚拟用户的特点是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源。
- 2.数据库存储:服务器的ftp功能使用vsftpd,配合pam-mysql模块来访问数据库进行虚拟用户认证。其中数据库只负责存储用户信息。
- 3.基本流程:FTP用户访问->PAM配置文件(由vsftpd.conf中pam_service_name指定)->PAM认证->区别用户读取配置文件(由vsftpd.conf中user_config_dir指定配置文件路径,文件名即用户名)
1、环境
ftp服务器x2:centos7,分ip1、ip2。需要使用pam-mysql模块
数据库服务器x1:mysql
pam-mysql模块:该模块项目较久远,支持centos6和7,不支持centos8,且centos7需要用源码编译安装,最后版本的附件如下:
pam_mysql-0.7RC1.tar.gz
链接:https://pan.baidu.com/s/15l6M36lDJPOTspA6KXHcaw
提取码:njdx
2、配置数据库
1. 建库和表
新建vsftpd库,并创建users表:
// 创建数据库
CREATE DATABASE vsftpd;
// 创建虚拟用户表
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
`password` varchar(48) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码,需要password函数加密',
`service_ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '服务器ip',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
2. 新增虚拟用户信息
// 密码需要使用password函数进行加密
INSERT INTO users(name,password,service_ip) values('test01',password('test'),'服务器ip1');
INSERT INTO users(name,password,service_ip) values('test02',password('test'),'服务器ip2');
3. 授权访问
// 创建数据库用户,并授权该用户可访问。用户名:vsftpd,密码:123456
GRANT SELECT,INSERT,UPDATE ON vsftpd.* TO vsftpd@'%' IDENTIFIED BY '123456';
// 也可以限制使用的ip网段,例如
GRANT SELECT,INSERT,UPDATE ON vsftpd.* TO vsftpd@'10.0.0.%' IDENTIFIED BY '123456';
3、安装pam-mysql模块
1.安装对应的依赖
安装对应的依赖:
yum install vsftpd gcc gcc-c++ make mariadb-devel pam-devel -y
2.ftp服务器下载pam-mysql模块
wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
3.解压并进入对应目录
tar xvf pam_mysql-0.7RC1.tar.gz && cd pam_mysql-0.7RC1/
4. 编译
# 设置编译参数
./configure --with-pam-mods-dir=/lib64/security
# 编译
make install
# 查看是否成功生成对应模块
ll /lib64/security/pam_mysql*
## 结果应包含如下文件:
# /lib64/security/pam_mysql.la
# /lib64/security/pam_mysql.so
5.设置pam_mysql认证配置
新建文件/etc/pam.d/vsftpd.mysql
,在其中设置以下内容:
auth required pam_mysql.so user=vsftpd passwd=123456 host=数据库ip db=vsftpd table=users usercolumn=name passwdcolumn=password where=`service_ip`='当前服务器ip' crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=数据库ip db=vsftpd table=users usercolumn=name passwdcolumn=password where=`service_ip`='当前服务器ip' crypt=2
4、设置vsftpd的ftp虚拟用户
1. ftp服务器安装vsftpd
yum install vsftpd
2.设置vsftpd支持虚拟用户
- 复制一份vsftpd设置文件做备份:
/etc/vsftpd/vsftpd.conf
- 然后修改以下设置:
# 关闭匿名登录
anonymous_enable=NO
# 锁定本地用户在主目录,不允许切换到上一级目录中
chroot_local_user=YES
# 将pam文件指定为vsftpd.mysql,不启用原设置
pam_service_name=vsftpd.mysql
- 然后新增以下设置:
# 允许禁锢的FTP根目录可写
allow_writeable_chroot=YES
# 将虚拟用户映射为本地vuser用户(前提是local_enable=YES)
guest_enable=YES
guest_username=vuser
# 设置虚拟用户使用的配置文件目录
user_config_dir=/etc/vsftpd/vusers.d/
# 这个参数表示虚拟用户和本地用户有相同的权限,可不设置
# virtual_use_local_privs=YES
- 重启vsftpd服务:
service vsftpd restart
- 设置每个虚拟用户的权限与目录
- 在/etc/vsftpd/vusers.d目录下新建虚拟用户配置文件。例如test01的用户,对应配置文件:
/etc/vsftpd/vusers.d/test01
- 在test01文件内配置对应权限:
#设定允许写操作 // write_enable=YES #设定权限:可以上传文件 //anon_upload_enable=YES #设定权限:不能新建目录 //anon_mkdir_write_enable=NO #设定权限:不能删除/重命名文件 //anon_other_write_enable=NO #设定权限:可以浏览目录下的文件 // anon_world_readable_only=NO #设定上传文件权限掩码,022对应:新建的目录权限是755,文件的权限是 644 // anon_umask=022 #指定虚拟用户的具体主路径 // local_root=/var/ftp/virtual/username #设定空闲连接超时时间 // idle_session_timeout=600 #设定单次连续传输最大时间 // data_connection_timeout=120 #设定并发客户端访问个数 // max_clients=10 #设定单个客户端的最大线程数,这个配置主要来照顾Flashget、迅雷等多线程下载软件 // max_per_ip=5 #设定该用户的最大传输速率,单位b/s" >> /etc/vsftpd/vconf/vconf.tmp // #local_max_rate=50000
- 在/etc/vsftpd/vusers.d目录下新建虚拟用户配置文件。例如test01的用户,对应配置文件:
5、测试
如果有遇到登录失败的情况,可以看下登录日志文件/var/log/secure
7、步骤脚本包
在自己尝试过程中,将以上步骤整理成脚本和配置文件,内含说明,有需要可取用。建议先自己实践过1-4步骤后,再使用脚本包的文件,便于理解和根据需要调整
百度链接 提取码: 6mai
6、参考引用
mysql管理ftp账号设置1:https://blog.51cto.com/johnnyfang/5213966
mysql管理ftp账号设置2:https://www.cnblogs.com/lvzhenjiang/p/14406450.html
ftp账号理解:https://cloud.tencent.com/developer/article/1025979
vsftpd选项设置:https://developer.aliyun.com/article/294506
vsftpd选项设置说明和自动化脚本:https://www.cnblogs.com/UG9527/p/11409703.html
pam-mysql原github:https://github.com/NigelCunningham/pam-MySQL