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


推荐阅读
  • 基于SSL的mysql服务器的主从架构实现说明:本文选用172.16.22.1作为主服务器,172.16.22.3作为从服务器从服务器的mysql软件版 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • 项目运行环境配置及可行性分析
    本文介绍了项目运行环境配置的要求,包括Jdk1.8、Tomcat7.0、Mysql、HBuilderX等工具的使用。同时对项目的技术可行性、操作可行性、经济可行性、时间可行性和法律可行性进行了分析。通过对数据库的设计和功能模块的设计,确保系统的完整性和安全性。在系统登录、系统功能模块、管理员功能模块等方面进行了详细的介绍和展示。最后提供了JAVA毕设帮助、指导、源码分享和调试部署的服务。 ... [详细]
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社区 版权所有