date: 2020-09-13title: Pure-ftp使用MySQL进行用户认证 #标题
tags: Pureftp #标签
categories: linux大杂烩 # 分类
记录下Pure-ftp使用MySQL实现用户认证登录的配置过程。
安装MySQL
如果不需要基于MySQL做用户鉴权,则可以跳过此步骤,不安装MySQL。
这里写下二进制部署msyql的方法,同时我的网盘上(提取码:wny3)提供了一个MySQL离线安装的脚本,解压后直接执行install-mysql-5.7.23.sh
脚本安装即可(可编辑install-mysql-5.7.23.sh
文件中的mysql_home
变量,指定mysql的安装目录)
$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
# 定义MySQL安装目录
$ mysql_home=/opt/mysql-5.7.30/
# 3306实例目录
$ mysql_3306=${mysql_home}mysql-3306/
# 数据存放目录
$ mysql_data=${mysql_3306}data
# MySQL运行用户
$ mysql_user=mysql
# 定义MySQL数据库的root密码
$ mysql_pwd='cF!TSadGT6y'
# 开始安装
yum -y install libaio
mkdir -p ${mysql_3306}/{data,logs}
useradd -M -s /sbin/nologin ${mysql_user}
tar zxf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C ${mysql_home} --strip-components=1
# 定义配置文件
cat > ${mysql_3306}/my.cnf << EOF
[client]
port=3306
socket=/tmp/mysql.sock
default-character-set=utf8
[mysql]
port=3306
socket=/tmp/mysql.sock
default-character-set=utf8
[mysqld]
port=3306
character-set-server=utf8
socket=/tmp/mysql.sock
basedir=${mysql_home}
datadir=${mysql_data}
explicit_defaults_for_timestamp=true
federated
lower_case_table_names=1
secure_file_priv =${mysql_3306}
back_log=150
max_connections=3000
max_connect_errors=10
table_open_cache=2048
external-locking=FALSE
secure_file_priv =
max_allowed_packet=32M
sort_buffer_size=8M
join_buffer_size=8M
thread_cache_size=8
query_cache_size=512M
query_cache_limit=4M
transaction_isolation=REPEATABLE-READ
tmp_table_size=96M
max_heap_table_size=96M
###***slow query parameters
long_query_time=1
slow_query_log = 1
slow_query_log_file=${mysql_3306}logs/slow.log
###***binlog parameters
log-bin=mysql-bin
binlog_cache_size=4M
max_binlog_cache_size=8M
max_binlog_size=1024M
binlog_format=row
log_timestamps=system
expire_logs_days=15
wait_timeout = 1200
interactive_timeout = 1200
log_slave_updates=1
gtid_mode=ON
enforce-gtid-consistency
log_timestamps = SYSTEM
#***MyISAM parameters
key_buffer_size=32M
read_buffer_size=2M
read_rnd_buffer_size=16M
bulk_insert_buffer_size=64M
myisam_sort_buffer_size = 16M
myisam_max_sort_file_size = 16M
myisam_repair_threads = 1
skip-name-resolve
###***master-slave replication parameters
server-id=1
#slave-skip-errors=all
#***Innodb storage engine parameters
innodb_buffer_pool_size=8192M
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G
innodb_data_file_path=ibdata1:10M:autoextend
#innodb_file_io_threads=8
#innodb_thread_concurrency=16
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=16M
innodb_log_file_size=128M
innodb_log_files_in_group=3
innodb_max_dirty_pages_pct=90
innodb_buffer_pool_dump_pct=90
innodb_lock_wait_timeout=2
innodb_file_per_table=on
[mysqldump]
quick
max_allowed_packet=32M
[myisamchk]
key_buffer=16M
sort_buffer_size=16M
read_buffer=8M
write_buffer=8M
[mysqld_safe]
open-files-limit=8192
EOF
# 配置环境变量
$ cat >> /etc/profile <<EOF
PATH=${mysql_home}bin/:\$PATH
EOF
source /etc/profile
# 初始化MySQL
$ chown -R ${mysql_user} ${mysql_home}
$ su -s /bin/bash -c "mysqld --initialize --user=mysql --datadir=${mysql_data} --basedir=${mysql_home}" ${mysql_user} &> init_db.log
# 获取MySQL初始化密码
$ tmp_passwd=$(grep root@localhost init_db.log | awk -F 'root@localhost: ' '{print $2}')
# 后台启动MySQL
su -s /bin/bash -c "mysqld_safe --defaults-file=${mysql_3306}my.cnf" ${mysql_user} &
$ ss -lnput | grep 3306 # 确定端口在监听
tcp LISTEN 0 128 :::3306 :::* users:(("mysqld",pid=22074,fd=24))
# 修改MySQL的root密码
$ mysqladmin -uroot -p''${tmp_passwd}'' password ''${mysql_pwd}''
# 测试登录数据库正常
$ mysql -uroot -p'cF!TSadGT6y'
至此,数据库部署完成。
安装pure-ftpd
编译pure-ftp
$ yum -y install gcc pam-devel
$ wget https://github.com/jedisct1/pure-ftpd/releases/download/1.0.49/pure-ftpd-1.0.49.tar.gz
$ tar zxf pure-ftpd-1.0.49.tar.gz -C /tmp/
cd /tmp/pure-ftpd-1.0.49/
$ ./configure \
--prefix=/opt/pureftpd \
--with-mysql \
--with-shadow \
--with-pam \
--with-welcomemsg \
--with-uploadscript \
--with-cookie \
--with-virtualchroot \
--with-virtualhosts \
--with-diraliases \
--with-quotas \
--with-puredb \
--with-sysquotas \
--with-tls \
--with-ratios \
--with-ftpwho \
--with-throttling \
--with-language=simplified-chinese \
--with-rfc2640
make
make install
配置环境变量
$ cat >> /etc/profile << EOF
PATH=/opt/pureftpd/bin:/opt/pureftpd/sbin:\$PATH
EOF
source /etc/profile
配置基于MySQL的用户鉴权
配置pureftp
$ cd /opt/pureftpd/etc
mv pure-ftpd.conf{,.default}
$ cat > pure-ftpd.conf << EOF
ChrootEveryone yes
Bind 192.168.20.10,21
BrokenClientsCompatibility no
MaxClientsNumber 500
Daemonize yes
MaxClientsPerIP 8
VerboseLog yes
CreateHomeDir yes
DisplayDotFiles yes
AnonymousOnly no
NoAnonymous yes
SyslogFacility ftp
DontResolve yes
MaxIdleTime 10
#PureDB /opt/pureftpd/etc/pureftpd.pdb
MySQLConfigFile /opt/pureftpd/etc/pureftpd-mysql.conf
LimitRecursion 10000 80
AnonymousCanCreateDirs no
#MaxLoad 4
AntiWarez yes
Umask 133:022
MinUID 1000
AllowUserFXP no
AllowAnonymousFXP no
ProhibitDotFilesWrite no
ProhibitDotFilesRead no
AutoRename no
AnonymousCantUpload yes
MaxDiskUsage 95
CustomerProof yes
EOF
配置MySQL
创建库及表
# 以下操作属于MySQL相关知识,自行琢磨,不解释太多,主要是将IP及授权网段改为你自己即可
$ mysql -uroot -p'cF!TSadGT6y'
mysql> CREATE DATABASE pureftpd;
mysql> use pureftpd
mysql> CREATE TABLE `users` ( `id` int(32) unsigned NOT NULL auto_increment,
`User` varchar(16) NOT NULL default '',
`Password` varchar(64) NOT NULL default 'Qaz!wsx',
`Uid` varchar(11) NOT NULL default '6000',
`Gid` varchar(11) NOT NULL default '6000',
`Dir` varchar(128) NOT NULL default '/tmp/',
`QuotaSize` smallint(5) NOT NULL default '0',
`QuotaFiles` int(11) NOT NULL default '0',
`ULBandwidth` smallint(5) NOT NULL default '0',
`DLBandwidth` smallint(5) NOT NULL default '0',
`ULRatio` smallint(6) NOT NULL default '0',
`DLRatio` smallint(6) NOT NULL default '0',
`comment` tinytext NOT NULL,
`ipaccess` varchar(15) NOT NULL default '*',
`status` enum('0','1') NOT NULL default '0',
`create_date` datetime NOT NULL default '2020-01-01 00:00:00',
`modify_date` datetime NOT NULL default '2020-01-01 00:00:00',
PRIMARY KEY (`id`,`User`), UNIQUE KEY `User` (`User`) );
mysql> INSERT INTO `users` VALUES (3, 'wangwu','jianzhao87', '6000', '6000', '/data/ftp/wangwu', 0, 0, 0, 0, 0, 0, '','*', '1', '2020-09-12 16:10:00', '2020-09-12 16:10:00');
mysql> grant all on pureftpd.* to pureftpd@"192.168.20.10" identified by 'XPnk@a77b2';
mysql> flush privileges;
定义MySQL连接及查询相关信息
cat > /opt/pureftpd/etc/pureftpd-mysql.conf << EOF
MYSQLServer 192.168.20.10
MYSQLPort 3306
#MYSQLSocket /tmp/mysql.sock
MYSQLUser pureftpd
MYSQLPassword XPnk@a77b2
MYSQLDatabase pureftpd
MYSQLCrypt cleartext
MYSQLGetPW SELECT Password FROM users WHERE User="\L"
#MYSQLGetUID SELECT Uid FROM users WHERE User="\L"
#MYSQLGetGID SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir SELECT Dir FROM users WHERE User="\L"
MySQLGetQTAFS SELECT QuotaFiles FROM users WHERE User="\L"
MySQLGetQTASZ SELECT QuotaSize FROM users WHERE User="\L"
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"
MySQLTransactions On
MYSQLDefaultUID 6000
MYSQLDefaultGID 6000
EOF
创建用户和组
需要创建uid/gid为6000的用户和组,因为数据库中指定的uid和gid必须是系统上存在的。
groupadd -g 6000 ftpgroup
useradd -M -g 6000 -u 6000 ftpuser -s /sbin/nologin
# 创建目录
$ mkdir /data/ftp/wangwu -p
$ chown 6000.6000 /data/ftp/ -R
启动pureftp并验证
# pure-ftpd启动去/lib64/tls/目录下找libmysqlclient.so.20文件
$ ln -sf /opt/mysql-5.7.30/lib/libmysqlclient.so.20 /lib64/tls/
# 启动pure-ftpd
$ pure-ftpd /opt/pureftpd/etc/pure-ftpd.conf
# 确定端口在监听
$ ss -lnput | grep 21
tcp LISTEN 0 65 *:21 *:* users:(("pure-ftpd",pid=44231,fd=4))
tcp LISTEN 0 65 :::21 :::* users:(("pure-ftpd",pid=44231,fd=5))
至此,即可使用数据库中的wangwu
用户进行登录到ftp服务器。