[教程]在CentOS7上配置 FTP服务器 Proftpd 支持 MySQL 虚拟用户加密认证以及磁盘限额(Quota)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文软件采用 yum 安装,不需要编译,而且随时都可以跟随 CentOS 升级 Proftpd 到最新版本,以避免可能的漏洞攻击。利用 Proftpd 现成的配置以及设置好的各种模块,可以实现 sftp 和 ssh 的结合,完美的实现虚拟用户加密密码存放于数据库。

有一些很古老的教程,一般都是走编译安装路线的,本文是教你不需要编译,而且随时都可以跟随 CentOS 升级 Proftpd 到最新版本,以避免可能的漏洞攻击。利用 Proftpd 现成的配置以及设置好的各种模块,可以实现 sftp 和 ssh 的结合,完美的实现虚拟用户加密密码存放于数据库。

1. 安装:

Proftpd 支持多种后端的数据库存储,在 CentOS7 上, 相关的软件包有:

proftpd-devel.x86_64 : ProFTPD – Tools and header files for developers
proftpd-ldap.x86_64 : Module to add LDAP support to the ProFTPD FTP server
proftpd-mysql.x86_64 : Module to add MySQL support to the ProFTPD FTP server
proftpd-postgresql.x86_64 : Module to add PostgreSQL support to the ProFTPD FTP server
proftpd-sqlite.x86_64 : Module to add SQLite support to the ProFTPD FTP server
proftpd-utils.x86_64 : ProFTPD – Additional utilities
proftpd.x86_64 : Flexible, stable and highly-configurable FTP server

我们只需要安装
proftpd-mysql-1.3.5e-4.el7.x86_64
proftpd-1.3.5e-4.el7.x86_64

可以选择安装: proftpd-utils-1.3.5e-4.el7.x86_64
至于想了解包里面的所有文件, 可以用 # rpm -ql proftpd 这样的命令来查看。

2. 设置自动启动:

# systemctl enable proftpd
# systemctl start proftpd
查看状态:
# systemctl status proftpd

3. 配置:
添加 ftp 用户和组:
# groupadd -g 2001 ftpgroup
# useradd -u 2001 -g 2001 ftpuser
查看基本模块: # proftpd -l
查看所有加载的模块: # proftpd -vv
如果结果里没有看到 mod_sql_mysql,就对了, 那是因为我们还没有把模块加载。
查看配置文件的路径: # proftpd -V , 可以看到 “Configuration File”指向 /etc/proftpd.conf
以下是我配置的一些核心的设置,其他没有包含在里面的,可以保留原来系统的配置。

LogFormat awstats “%t %h %u %m %f %s %b”
ExtendedLog /var/log/proftpd/transfer.log read,write awstats
TransferLog /var/log/proftpd/transfer.log
ServerLog /var/log/proftpd/server.log

ServerName “ProFTPD server”
ServerIdent on “FTP Server ready.”
ServerAdmin ftpadmin@freelamp.com
DefaultServer on

DefaultRoot ~ !adm

UseReverseDNS off

User ftpuser
Group ftpgroup

MaxInstances 20

UseSendfile off

LogFormat default “%h %l %u %t \”%r\” %s %b”
LogFormat auth “%v [%P] %h %t \”%r\” %s”

LoadModule mod_sql.c
LoadModule mod_sql_passwd.c
LoadModule mod_sql_mysql.c
LoadModule mod_quotatab.c
LoadModule mod_quotatab_sql.c
LoadModule mod_ctrls_admin.c
LoadModule mod_deflate.c
LoadModule mod_sftp.c

LoadModule mod_sftp_sql.c
LoadModule mod_vroot.c

 

<IfModule mod_vroot.c>
VRootEngine on
</IfModule>

<Global>
# 设置正确的时区,保证日志文件里的时间是当前时区。
SetEnv TZ “Asia/Shanghai”
Umask 022
# Allow users to overwrite files and change permissions
AllowOverwrite yes
<Limit ALL SITE_CHMOD>
AllowAll
</Limit>
ExtendedLog /var/log/proftpd/access.log WRITE,READ default
ExtendedLog /var/log/proftpd/auth.log AUTH auth

</Global>

# MySQL 相关的配置:
SQLBackend mysql
SQLEngine on
SQLAuthenticate on
SQLLogFile /var/log/proftpd/sql.log
# 这个 AuthTypes 网上的很多教程都是不对的。
SQLAuthTypes OpenSSL

SQLAuthenticate users* groups*
SQLConnectInfo MySQLUser@localhost MySQLDBName MySQLPassword

SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
SQLMinUserGID 2001
SQLMinUserUID 2001
# SQLHomedirOnDemand on
# Update count every time user logs in
SQLLog PASS updatecount
# SQLLog PASS counter
SQLNamedQuery updatecount UPDATE “count=count+1, accessed=now() WHERE userid=’%u'” ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE “modified=now() WHERE userid=’%u'” ftpuser

# User quotas
# ===========
#打开磁盘限额引擎
QuotaEngine on
#设置磁盘限额
QuotaDirectoryTally on
#设置测盘容量显示时的单位
QuotaDisplayUnits Mb
#允许显示磁盘限额信息,ftp登陆后可执行 quote site quota 命令察看当前磁盘使用情#况
QuotaShowQuotas on
#设置磁盘限额日志文件
QuotaLog “/var/log/proftpd/quota.log”

SQLNamedQuery get-quota-limit SELECT “name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = ‘%{0}’ AND quota_type = ‘%{1}'”

SQLNamedQuery get-quota-tally SELECT “name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = ‘%{0}’ AND quota_type = ‘%{1}'”

SQLNamedQuery update-quota-tally UPDATE “bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = ‘%{6}’ AND quota_type = ‘%{7}'” ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}” ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
# ===========

RootLogin off
RequireValidShell off

# =============== 配置 结束  ===============

4. MySQL 数据库部分,可以直接保存成 sql 文件,用 mysql 数据库名 < sql文件 来导入表结构和示例用户数据。
## 数据库部分
CREATE TABLE `ftpgroup` (
`groupname` varchar(16) NOT NULL DEFAULT ”,
`gid` smallint(6) NOT NULL DEFAULT ‘2001’,
`members` varchar(16) NOT NULL DEFAULT ”,
KEY `groupname` (`groupname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT=’ProFTP group table’;

INSERT INTO `ftpgroup` VALUES (‘ftpgroup’,2001,’ftpuser’);

CREATE TABLE `ftpquotalimits` (
`name` varchar(30) DEFAULT NULL,
`quota_type` enum(‘user’,’group’,’class’,’all’) NOT NULL DEFAULT ‘user’,
`per_session` enum(‘false’,’true’) NOT NULL DEFAULT ‘false’,
`limit_type` enum(‘soft’,’hard’) NOT NULL DEFAULT ‘soft’,
`bytes_in_avail` int(10) unsigned NOT NULL DEFAULT ‘0’,
`bytes_out_avail` int(10) unsigned NOT NULL DEFAULT ‘0’,
`bytes_xfer_avail` int(10) unsigned NOT NULL DEFAULT ‘0’,
`files_in_avail` int(10) unsigned NOT NULL DEFAULT ‘0’,
`files_out_avail` int(10) unsigned NOT NULL DEFAULT ‘0’,
`files_xfer_avail` int(10) unsigned NOT NULL DEFAULT ‘0’
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `ftpquotalimits` VALUES (‘exampleuser’,’user’,’true’,’hard’,15728640,0,0,0,0,0),(‘demo’,’user’,’false’,’soft’,104857600,0,0,0,0,0);

CREATE TABLE `ftpquotatallies` (
`name` varchar(30) NOT NULL DEFAULT ”,
`quota_type` enum(‘user’,’group’,’class’,’all’) NOT NULL DEFAULT ‘user’,
`bytes_in_used` int(10) unsigned NOT NULL DEFAULT ‘0’,
`bytes_out_used` int(10) unsigned NOT NULL DEFAULT ‘0’,
`bytes_xfer_used` int(10) unsigned NOT NULL DEFAULT ‘0’,
`files_in_used` int(10) unsigned NOT NULL DEFAULT ‘0’,
`files_out_used` int(10) unsigned NOT NULL DEFAULT ‘0’,
`files_xfer_used` int(10) unsigned NOT NULL DEFAULT ‘0’
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `ftpquotatallies` VALUES (‘demo’,’user’,0,0,0,0,0,0);

CREATE TABLE `ftpuser` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(32) NOT NULL DEFAULT ”,
`passwd` varchar(32) NOT NULL DEFAULT ”,
`uid` smallint(6) NOT NULL DEFAULT ‘2001’,
`gid` smallint(6) NOT NULL DEFAULT ‘2001’,
`homedir` varchar(255) NOT NULL DEFAULT ”,
`shell` varchar(16) NOT NULL DEFAULT ‘/sbin/nologin’,
`count` int(11) NOT NULL DEFAULT ‘0’,
`accessed` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00’,
`modified` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00′,
PRIMARY KEY (`id`),
UNIQUE KEY `userid` (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 COMMENT=’ProFTP user table’;

INSERT INTO `ftpuser` VALUES (1,’simon’,'{md5}md5password’,2001,2001,’/opt/ftphome/simon’,’/sbin/nologin’,0,’2018-02-18 19:48:48′,’0000-00-00 00:00:00′),(2,’simon2′,'{md5}uk7kAgOCIdt21o0YJ6grVg==’,2001,2001,’/opt/ftphome/simon2′,’/sbin/nologin’,4,’2018-02-18 20:35:04′,’0000-00-00 00:00:00′);

# =============== 数据库部分 结束  ===============

5. 添加用户的 shell 脚本,添加用户需要插表,创建用户目录等,参照网上的脚本修改如下:

# cat /usr/local/bin/add_ftpuser.sh
#!/bin/bash
# Modified by Albert Xu <albertxu@freelamp.com>
#
usage () {
        echo “”
        echo ”  USAGE: `basename $0` username user_home_dir “
        echo ”  e.g.: `basename $0` albertxu /opt/ftphome/albertxu “
        echo “”
        echo ”  Result:”
        echo ”          UserName: albertxu”
        echo ”          PassWord: N2Jy3Fqol”
        echo “”
exit
}
# == MySQL ========
MYSQL_USER=ftpd
MYSQL_PASS=MySQLP@ssw0rd
MYSQL_DB=ftpd
MYSQL_HOST=localhost
# ================
FTP_USER=ftpuser
FTP_UID=`id -u ${FTP_USER}`
FTP_GID=`id -g ${FTP_USER}`
FTP_GRP=`id -gn ${FTP_USER}`
# ===============
userid=$1
[ -z “${userid}” ] && usage
datetime=`date +”%Y-%m-%d %H:%M:%S”`
passwd=`mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1`
FTP_HOME=/opt/ftphome/${userid}
[ ! -d ${FTP_HOME} ] && mkdir -p ${FTP_HOME} && chown ${FTP_USER}.${FTP_GRP} ${FTP_HOME}
dst_passwd='{md5}’`/bin/echo -n “$passwd” | openssl dgst -binary -md5 | openssl enc -base64`
shell=’/sbin/nologin’
/bin/mysql -u ${MYSQL_USER} -p${MYSQL_PASS} -h ${MYSQL_HOST} ${MYSQL_DB}  \
-e “INSERT INTO ftpuser (userid,passwd,uid,gid,homedir,shell,accessed) VALUES (‘$userid’,’$dst_passwd’,${FTP_UID},${FTP_GID},’${FTP_HOME}’,’/sbin/nologin’,’$datetime’);”
echo “UserName: $userid”
echo “PassWord: $passwd”
echo “userHome: ${FTP_HOME}”
echo “”
exit

# =============== 添加用户脚本 结束  ===============

6. 测试
重启 proftpd 服务后,用脚本添加用户后,可以尝试用 ftp 主机名 以及 ftp 主机名 22,端口来测试两种方式的认证。
我们不需要在操作系统添加用户,而是直接把用户和组的配置通过数据库实现,后端的数据库用户和组可以灵活的通过和其他应用整合,实现完美的安全 ftp 解决方案。 在 ftphome 的权限配置上,我们需要把所有 /opt/ftphome 下创建的用户目录和组的读写都设置为 ftpuser:ftpgroup 的 755 权限。在防火墙设置上,我们仍旧需要把 20/21 TCP 端口都打开。

很多人根据本教程可能会遇到数据库连接问题,本人认为这些都是基本功,看过这个教程就应该明白数据库的用户怎么设置了。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
存储 分布式计算 固态存储
阿里云2核16G、4核32G、8核64G配置云服务器租用收费标准与活动价格参考
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择。目前2核16G配置按量收费最低收费标准为0.54元/小时,按月租用标准收费标准为260.44元/1个月。4核32G配置的阿里云服务器按量收费标准最低为1.08元/小时,按月租用标准收费标准为520.88元/1个月。8核64G配置的阿里云服务器按量收费标准最低为2.17元/小时,按月租用标准收费标准为1041.77元/1个月。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
5天前
|
监控 PHP Apache
优化 PHP-FPM 参数配置:实现服务器性能提升
优化PHP-FPM的参数配置可以显著提高服务器的性能和稳定性。通过合理设置 `pm.max_children`、`pm.start_servers`、`pm.min_spare_servers`、`pm.max_spare_servers`和 `pm.max_requests`等参数,并结合监控和调优措施,可以有效应对高并发和负载波动,确保Web应用程序的高效运行。希望本文提供的优化建议和配置示例能够帮助您实现服务器性能的提升。
22 3
|
8天前
|
存储 缓存 固态存储
阿里云服务器2核8G、4核16G、8核32G配置租用收费标准与活动价格参考
2核8G、8核32G、4核16G配置的云服务器处理器与内存比为1:4,这种配比的云服务器一般适用于中小型数据库系统、缓存、搜索集群和企业办公类应用等通用型场景,因此,多为企业级用户选择。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
9天前
|
存储 编解码 安全
阿里云服务器2核4G、4核8G、8核16G配置租用收费标准与活动价格参考
通常情况下,个人和一般企业用户在购买阿里云服务器时比较喜欢购买2核4G、4核8G、8核16G等配置,这些配置既能满足各种图文类中小型网站和应用又能满足企业网站应用、批量计算、中小型数据库系统等场景,2核4G配置适合新手入门或初创企业,4核8G与8核16G兼具成本与性能优势,适合通用场景,本文介绍这些配置的最新购买价格,包含原价收费标准和最新活动价格。
|
3天前
|
SQL 安全 算法
揭秘网络安全:漏洞、加密与安全意识的三重奏
【10月更文挑战第39天】在数字时代的交响乐中,网络安全扮演着不可或缺的角色。本文旨在通过浅显易懂的语言,揭示网络安全的三大核心要素:网络漏洞、加密技术以及安全意识。我们将探索这些元素如何相互交织,共同维护我们的数字安全。从初学者到资深专家,每个人都能从中获得宝贵的知识和启示。
|
3天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第39天】在数字化时代,网络安全和信息安全成为了我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,帮助读者更好地了解网络安全的重要性,并提供一些实用的技巧和方法来保护自己的信息安全。
14 2
|
5天前
|
安全 算法 网络安全
网络安全的盾牌与利剑:漏洞防御与加密技术的双刃舞
【10月更文挑战第37天】在数字世界的海洋里,网络安全是航船的锚,保护我们的数据不受风暴侵袭。本文将深入浅出地探讨网络安全的两大支柱——漏洞防御和加密技术。我们将从网络安全的基本概念出发,逐步深入到漏洞的类型、检测方法以及防御策略。同时,我们也将探索加密技术的原理和应用,如何通过这一技术保护信息的完整性和私密性。最后,我们将讨论提升个人及组织安全意识的重要性,以及如何构建一个安全的网络环境。这不仅是技术人员的战斗,每个人都是自己信息安全的第一道防线。让我们一起扬帆起航,探索网络安全的世界,学习如何成为自己数据的守护者。
|
5天前
|
SQL 安全 网络安全
网络安全的护城河:漏洞防御与加密技术的深度解析
【10月更文挑战第37天】在数字时代的浪潮中,网络安全成为守护个人隐私与企业资产的坚固堡垒。本文将深入探讨网络安全的两大核心要素——安全漏洞和加密技术,以及如何通过提升安全意识来强化这道防线。文章旨在揭示网络攻防战的复杂性,并引导读者构建更为稳固的安全体系。
16 1
|
4天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第38天】本文将探讨网络安全与信息安全的重要性,包括网络安全漏洞、加密技术和安全意识等方面。我们将通过代码示例和实际操作来展示如何保护网络和信息安全。无论你是个人用户还是企业,都需要了解这些知识以保护自己的网络安全和信息安全。
|
3天前
|
存储 安全 网络安全
网络安全与信息安全:漏洞、加密技术与安全意识的交织
【10月更文挑战第39天】在数字化时代,网络安全与信息安全成为保护个人隐私和组织资产的重要屏障。本文将探讨网络安全中的常见漏洞、加密技术的应用以及提升安全意识的重要性。通过具体案例分析,我们将深入了解网络攻击的手段和防御策略,同时提供实用建议,以增强读者对网络安全的认识和防护能力。