热门标签 | 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 就完成


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文详细介绍如何使用Samba软件配置CIFS文件共享服务,涵盖安装、配置、权限管理及多用户挂载等关键步骤。通过具体示例和命令行操作,帮助读者快速搭建并优化Samba服务器。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
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社区 版权所有