热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

使用MySQL建立ProFTPd虚拟帐号

用MySQL来管理Proftpd的帐号:Unix和Linux中,vsftpd是一款非常安全的FTP服务器。任何发行版本中的vsftpd都非常安全。像RedHat、Debian、GNU、GNOME、KDE等等一些大型站点,都采用vsftpd作为它们的FTP服务器。本文将介绍用MySQL来管理Proftpd的帐号。一般

用MySQL来管理Proftpd 的帐号:Unix和Linux中,vsftpd是一款非常安全的FTP服务器。任何发行版本中的vsftpd都非常安全。像RedHat、Debian、GNU、GNOME、KDE 等等一些大型站点,都采用vsftpd作为它们的FTP服务器。本文将介绍用MySQL来管理Proftpd 的帐号。

一般建 FTP 帐号, 都是直接在系统上直接开个使用者的帐号, 但是如果是要开帐号给安全观念不够的人, 还是另外找个方法来做.

所以想到的是, FTP 帐号独立出来, 让 MySQL 来管理 FTP 的帐号, 而且 FTP 顺便限制存取的范围, 至少会比较安全一点(另外就是上传后的程式执行问题, 就不在此讨论).

在 Debian 上面跑 Proftpd, 使用 MySQL 来管理帐号已经有不少人做过这种事了~ 下述叁篇文章都有写, 在此主要是参考第叁篇:

一、安装 MySQL Apache Proftpd 和 proftpd-mysql

apt-get install mysql-server mysql-client libmysqlclient15-dev apache2 proftpd-mysql

  二、设定 FTP 使用的 User 和 Group

groupadd -g 2001 ftpgroup

useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

三、建立 MySQL ftpuser For Proftpd

因为要用 MySQL 来管理 Proftpd 的 User, 所以要建下面的 Table 来存放 User data.

mysql -u root -p  

create database ftp;  

GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'ftp_password';  

GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'ftp_password';  

FLUSH PRIVILEGES;  

use ftp;  

CREATE TABLE ftpgroup (  

groupname varchar(16) NOT NULL default '',  

gid smallint(6) NOT NULL default '5500',  

members varchar(16) NOT NULL default '',  

KEY groupname (groupname)  

) TYPE=MyISAM COMMENT='ProFTP group table';  

CREATE TABLE ftpuser (  

id int(10) unsigned NOT NULL auto_increment,  

userid varchar(32) NOT NULL default '',  

passwd varchar(32) NOT NULL default '',  

uid smallint(6) NOT NULL default '5500',  

gid smallint(6) NOT NULL default '5500',  

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)  

) TYPE=MyISAM COMMENT='ProFTP user table';  

# 这边是要建立一个 Group 和两个帐号  

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');  

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'USERNAME', 'PASSWORD', 2001, 2001, '/home/www.demo.com', '/sbin/nologin', 0, '', '');  

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (2, 'USERNAME2', 'PASSWORD2', 2002, 2001, '/home/www.demo2.com', '/sbin/nologin', 0, '', '');  

quit; # 离开 MySQL  

四、建立使用者 FTP 登入后的目录环境

mkdir /home/www.demo.com  

mkdir /home/www.demo2.com  

chown ftpuser:ftpgroup /home/www.demo.com  

chown ftpuser:ftpgroup /home/www.demo2.com  

五、修改 Proftpd 设定, 读取 MySQL 当帐号来源

vim /etc/proftpd/proftpd.conf  

UseIPv6 on => UseIPv6 off  

# 不加这行, 此帐号就存取到根目录的所有资源  

DefaultRoot ~  

RootLogin off  

RequireValidShell off  

# The passwords in MySQL are encrypted using CRYPT  

SQLAuthTypes Plaintext Crypt  

SQLAuthenticate users groups  

SQLConnectInfo ftp@localhost proftpd ftp_password  

SQLUserInfo ftpuser userid passwd uid gid homedir shell  

SQLGroupInfo ftpgroup groupname gid members  

SQLLog PASS updatecount  

SQLNamedQuery updatecount UPDATE "countcount=count+1, accessed=now() WHERE userid='%u'" ftpuser  

SQLLog STOR,DELE modified  

SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser  

#SQLLogFile /var/log/sql.log  

#SQLMinID 500  

# 如果使用这帐号的 Home Directory 不存在的话, 会自动去建立  

#SQLHomedirOnDemand on  

六、设定 Proftpd 载入的模组

vim /etc/proftpd/modules.conf  

#LoadModule mod_sql_postgres.c # 不用载入 PostgreSQL 的 Module  

七、重新启动 Proftpd 即完成

/etc/init.d/proftpd restart # 重新启动 Proftpd即可  

八、快速 开帐号 的步骤

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (3, 'USERNAME', 'PASSWORD', 2003, 2001, '/home/www.demo.com', '/sbin/nologin', 0, '', '');  

(修改 3, 'USERNAME', 'PASSWORD', 2003, '/home/www.demo.com' 这些值即可.)  

mkdir /home/www.demo.com # 建目录  

chown ftpuser:ftpgroup /home/www.demo.com # 改权限  

这样子就完成~

九、FTP 要限制使用容量(Quota)

以下只是做笔记, 尚未测试.

MySql 加这两个 Table 和 资料:

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'  

) TYPE=MyISAM;  

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'  

) TYPE=MyISAM;  

INSERT INTO `ftpquotalimits` (`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`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);  

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'USERNAME', 'PASSWORD', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');  

十、修改 Proftpd 设定

以支援 MySQL 的 Quote data

vim /etc/proftpd/proftpd.conf 加入  

# User quotas  

# ===========  

QuotaEngine on  

QuotaDirectoryTally on  

QuotaDisplayUnits Mb  

QuotaShowQuotas on  

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_usedbytes_in_used = bytes_in_used + %{0}, bytes_out_usedbytes_out_used = bytes_out_used + %{1}, bytes_xfer_usedbytes_xfer_used = bytes_xfer_used + %{2}, files_in_usedfiles_in_used = files_in_used + %{3}, files_out_usedfiles_out_used = files_out_used + %{4}, files_xfer_usedfiles_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  

SQLNamedQuery gettally SELECT "ROUND((bytes_in_used/1048576),2) FROM ftpquotatallies WHERE name='%u'"  

SQLNamedQuery getlimit SELECT "ROUND((bytes_in_avail/1048576),2) FROM ftpquotalimits WHERE name='%u'"  

SQLNamedQuery getfree SELECT "ROUND(((ftpquotalimits.bytes_in_avail-ftpquotatallies.bytes_in_used)/1048576),2) FROM ftpquotalimits,ftpquotatallies WHERE ftpquotalimits.name = '%u' AND ftpquotatallies.name = '%u'"  

SQLShowInfo LIST "226" "Used %{gettally}MB from %{getlimit}MB. You have %{getfree}MB available space."  

RootLogin off  

RequireValidShell off  

再来重新启动 Proftpd: /etc/init.d/proftpd restart 就完成


推荐阅读
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文介绍了一个基于 Java SpringMVC 和 SSM 框架的综合系统,涵盖了操作日志记录、文件管理、头像编辑、权限控制、以及多种技术集成如 Shiro、Redis 等,旨在提供一个高效且功能丰富的开发平台。 ... [详细]
  • 本文详细介绍了在不同操作系统中查找和设置网卡的方法,涵盖了Windows系统的具体步骤,并提供了关于网卡位置、无线网络设置及常见问题的解答。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 使用PHP实现网站访客计数器的完整指南
    本文详细介绍了如何利用PHP构建一个简易的网站访客统计系统。通过具体的代码示例和详细的解释,帮助开发者理解和实现这一功能,适用于初学者和有一定经验的开发人员。 ... [详细]
  • 智能医疗,即通过先进的物联网技术和信息平台,实现患者、医护人员和医疗机构之间的高效互动。它不仅提升了医疗服务的便捷性和质量,还推动了整个医疗行业的现代化进程。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
author-avatar
剪子61_199
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有