myftpadmin+proftpd+mysql架设ftp服务器_[教程]在CentOS7上配置 FTP服务器 Proftpd 支持 MySQL 虚拟用户加密认证以及磁盘限额(Quota)...
发布日期:2021-06-24 17:18:46 浏览次数:2 分类:技术文章

本文共 8710 字,大约阅读时间需要 29 分钟。

有一些很古老的教程,一般都是走编译安装路线的,本文是教你不需要编译,而且随时都可以跟随 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

VRootEngine on

# 设置正确的时区,保证日志文件里的时间是当前时区。

SetEnv TZ “Asia/Shanghai”

Umask 022

# Allow users to overwrite files and change permissions

AllowOverwrite yes

AllowAll

ExtendedLog /var/log/proftpd/access.log WRITE,READ default

ExtendedLog /var/log/proftpd/auth.log AUTH auth

# 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

#

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 端口都打开。

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

转载地址:https://blog.csdn.net/weixin_34061793/article/details/114741390 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java三层结构的概念_Java中的mvc和三层结构究竟是什么关系
下一篇:java+map申明_Java中两种HashMap申明方式区别?

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月02日 04时21分49秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【英语学习】【Daily English】U11 Work L01 Would you like a tour of the office? 2019-04-28
【Linux使用】Centos 7安装图形界面/切换文本界面与图形界面 2019-04-28
【英语学习】【WOTD】opusculum 释义/词源/示例 2019-04-28
【英语学习】【WOTD】Parthian 释义/词源/示例 2019-04-28
【Linux使用】Centos 7设置时区与时钟(chrony / ntp /systemd) 2019-04-28
【Linux使用】Centos 7 YUM仓库配置文件代理服务器设置 2019-04-28
【英语学习】【WOTD】despot 释义/词源/示例 2019-04-28
【英语学习】【WOTD】thole 释义/词源/示例 2019-04-28
【Openstack】实录手动部署Openstack Rocky 双节点(5)- Neutron 2019-04-28
【Openstack】实录手动部署Openstack Rocky 双节点(6)- Horizon 2019-04-28
【英语学习】【Daily English】U11 Work L02 Just be honest 2019-04-28
【英语学习】【WOTD】lacuna 释义/词源/示例 2019-04-28
【英语学习】【WOTD】bread 释义/词源/示例 2019-04-28
【英语学习】【English L06】U03 House L1 What type of apartment do you want to rent? 2019-04-28
【英语学习】【English L06】U03 House L2 Let's look for an apartment online 2019-04-28
【英语学习】【加州教材】【G3】【科学】Science目录及术语表 2019-04-28
【英语学习】【WOTD】disbursement 释义/词源/示例 2019-04-28
【英语学习】【English L06】U03 House L3 How is your house hunt going? 2019-04-28
【英语学习】【English L06】U03 House L4 How much is the rent? 2019-04-28
【英语学习】【English L06】U03 House L5 Renting a House 2019-04-28