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的安装目录)

  1. $ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
  2. # 定义MySQL安装目录
  3. $ mysql_home=/opt/mysql-5.7.30/
  4. # 3306实例目录
  5. $ mysql_3306=${mysql_home}mysql-3306/
  6. # 数据存放目录
  7. $ mysql_data=${mysql_3306}data
  8. # MySQL运行用户
  9. $ mysql_user=mysql
  10. # 定义MySQL数据库的root密码
  11. $ mysql_pwd='cF!TSadGT6y'
  12. # 开始安装
  13. yum -y install libaio
  14. mkdir -p ${mysql_3306}/{data,logs}
  15. useradd -M -s /sbin/nologin ${mysql_user}
  16. tar zxf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C ${mysql_home} --strip-components=1
  17. # 定义配置文件
  18. cat > ${mysql_3306}/my.cnf << EOF
  19. [client]
  20. port=3306
  21. socket=/tmp/mysql.sock
  22. default-character-set=utf8
  23. [mysql]
  24. port=3306
  25. socket=/tmp/mysql.sock
  26. default-character-set=utf8
  27. [mysqld]
  28. port=3306
  29. character-set-server=utf8
  30. socket=/tmp/mysql.sock
  31. basedir=${mysql_home}
  32. datadir=${mysql_data}
  33. explicit_defaults_for_timestamp=true
  34. federated
  35. lower_case_table_names=1
  36. secure_file_priv =${mysql_3306}
  37. back_log=150
  38. max_connections=3000
  39. max_connect_errors=10
  40. table_open_cache=2048
  41. external-locking=FALSE
  42. secure_file_priv =
  43. max_allowed_packet=32M
  44. sort_buffer_size=8M
  45. join_buffer_size=8M
  46. thread_cache_size=8
  47. query_cache_size=512M
  48. query_cache_limit=4M
  49. transaction_isolation=REPEATABLE-READ
  50. tmp_table_size=96M
  51. max_heap_table_size=96M
  52. ###***slow query parameters
  53. long_query_time=1
  54. slow_query_log = 1
  55. slow_query_log_file=${mysql_3306}logs/slow.log
  56. ###***binlog parameters
  57. log-bin=mysql-bin
  58. binlog_cache_size=4M
  59. max_binlog_cache_size=8M
  60. max_binlog_size=1024M
  61. binlog_format=row
  62. log_timestamps=system
  63. expire_logs_days=15
  64. wait_timeout = 1200
  65. interactive_timeout = 1200
  66. log_slave_updates=1
  67. gtid_mode=ON
  68. enforce-gtid-consistency
  69. log_timestamps = SYSTEM
  70. #***MyISAM parameters
  71. key_buffer_size=32M
  72. read_buffer_size=2M
  73. read_rnd_buffer_size=16M
  74. bulk_insert_buffer_size=64M
  75. myisam_sort_buffer_size = 16M
  76. myisam_max_sort_file_size = 16M
  77. myisam_repair_threads = 1
  78. skip-name-resolve
  79. ###***master-slave replication parameters
  80. server-id=1
  81. #slave-skip-errors=all
  82. #***Innodb storage engine parameters
  83. innodb_buffer_pool_size=8192M
  84. innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G
  85. innodb_data_file_path=ibdata1:10M:autoextend
  86. #innodb_file_io_threads=8
  87. #innodb_thread_concurrency=16
  88. innodb_flush_log_at_trx_commit=1
  89. innodb_log_buffer_size=16M
  90. innodb_log_file_size=128M
  91. innodb_log_files_in_group=3
  92. innodb_max_dirty_pages_pct=90
  93. innodb_buffer_pool_dump_pct=90
  94. innodb_lock_wait_timeout=2
  95. innodb_file_per_table=on
  96. [mysqldump]
  97. quick
  98. max_allowed_packet=32M
  99. [myisamchk]
  100. key_buffer=16M
  101. sort_buffer_size=16M
  102. read_buffer=8M
  103. write_buffer=8M
  104. [mysqld_safe]
  105. open-files-limit=8192
  106. EOF
  107. # 配置环境变量
  108. $ cat >> /etc/profile <<EOF
  109. PATH=${mysql_home}bin/:\$PATH
  110. EOF
  111. source /etc/profile
  112. # 初始化MySQL
  113. $ chown -R ${mysql_user} ${mysql_home}
  114. $ su -s /bin/bash -c "mysqld --initialize --user=mysql --datadir=${mysql_data} --basedir=${mysql_home}" ${mysql_user} &> init_db.log
  115. # 获取MySQL初始化密码
  116. $ tmp_passwd=$(grep root@localhost init_db.log | awk -F 'root@localhost: ' '{print $2}')
  117. # 后台启动MySQL
  118. su -s /bin/bash -c "mysqld_safe --defaults-file=${mysql_3306}my.cnf" ${mysql_user} &
  119. $ ss -lnput | grep 3306 # 确定端口在监听
  120. tcp LISTEN 0 128 :::3306 :::* users:(("mysqld",pid=22074,fd=24))
  121. # 修改MySQL的root密码
  122. $ mysqladmin -uroot -p''${tmp_passwd}'' password ''${mysql_pwd}''
  123. # 测试登录数据库正常
  124. $ 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服务器。