用MySQL来管理Proftpd 的帐号

运维 系统运维
用MySQL来管理Proftpd 的帐号:Linux下Proftpd搭建FTP服务器的高级设置:proftpd(Professional FTP daemon)是一项针对Wu-FTP的弱项而开发的FTP服务器技术程序。除了改进的安全性,另外还具备许多Wu-FTP没有的特点。比如,可以以Stand-alone、xinetd模式运行等。ProFTP不仅配置很方便,而且还有MySQL和Quota模块可供选择。本文将介绍用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.

 

 

  1.   mysql -u root -p  
  2.  
  3.   create database ftp;  
  4.  
  5.   GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'ftp_password';  
  6.  
  7.   GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'ftp_password';  
  8.  
  9.   FLUSH PRIVILEGES;  
  10.  
  11.   use ftp;  
  12.  
  1.   CREATE TABLE ftpgroup (  
  2.  
  3.   groupname varchar(16) NOT NULL default '',  
  4.  
  5.   gid smallint(6) NOT NULL default '5500',  
  6.  
  7.   members varchar(16) NOT NULL default '',  
  8.  
  9.   KEY groupname (groupname)  
  10.  
  11.   ) TYPE=MyISAM COMMENT='ProFTP group table';  
  12.  
  1.   CREATE TABLE ftpuser (  
  2.  
  3.   id int(10) unsigned NOT NULL auto_increment,  
  4.  
  5.   userid varchar(32) NOT NULL default '',  
  6.  
  7.   passwd varchar(32) NOT NULL default '',  
  8.  
  9.   uid smallint(6) NOT NULL default '5500',  
  10.  
  11.   gid smallint(6) NOT NULL default '5500',  
  12.  
  13.   homedir varchar(255) NOT NULL default '',  
  14.  
  15.   shell varchar(16) NOT NULL default '/sbin/nologin',  
  16.  
  17.   count int(11) NOT NULL default '0',  
  18.  
  19.   accessed datetime NOT NULL default '0000-00-00 00:00:00',  
  20.  
  21.   modified datetime NOT NULL default '0000-00-00 00:00:00',  
  22.  
  23.   PRIMARY KEY (id),  
  24.  
  25.   UNIQUE KEY userid (userid)  
  26.  
  27.   ) TYPE=MyISAM COMMENT='ProFTP user table';  
  28.  
  29.   # 这边是要建立一个 Group 和两个帐号  
  30.  
  31.   INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');  
  32.  
  33.   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, '', '');  
  34.  
  35.   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, '', '');  
  36.  
  37.   quit; # 离开 MySQL  
  38.  

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

  1.   mkdir /home/www.demo.com  
  2.  
  3.   mkdir /home/www.demo2.com  
  4.  
  5.   chown ftpuser:ftpgroup /home/www.demo.com  
  6.  
  7.   chown ftpuser:ftpgroup /home/www.demo2.com  
  8.  

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

  1.   vim /etc/proftpd/proftpd.conf  
  2.  
  3.   UseIPv6 on => UseIPv6 off  
  4.  
  5.   # 不加这行, 此帐号就存取到根目录的所有资源  
  6.  
  7.   DefaultRoot ~  
  8.  
  9.   RootLogin off  
  10.  
  11.   RequireValidShell off  
  12.  
  13.   # The passwords in MySQL are encrypted using CRYPT  
  14.  
  15.   SQLAuthTypes Plaintext Crypt  
  16.  
  17.   SQLAuthenticate users groups  
  18.  
  19.   SQLConnectInfo ftp@localhost proftpd ftp_password  
  20.  
  21.   SQLUserInfo ftpuser userid passwd uid gid homedir shell  
  22.  
  23.   SQLGroupInfo ftpgroup groupname gid members  
  24.  
  25.   SQLLog PASS updatecount  
  26.  
  27.   SQLNamedQuery updatecount UPDATE "countcount=count+1, accessed=now() WHERE userid='%u'" ftpuser  
  28.  
  29.   SQLLog STOR,DELE modified  
  30.  
  31.   SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser  
  32.  
  33.   #SQLLogFile /var/log/sql.log  
  34.  
  35.   #SQLMinID 500  
  36.  
  37.   # 如果使用这帐号的 Home Directory 不存在的话, 会自动去建立  
  38.  
  39.   #SQLHomedirOnDemand on  
  40.  

  六、设定 Proftpd 载入的模组

  1.   vim /etc/proftpd/modules.conf  
  2.  
  3.   #LoadModule mod_sql_postgres.c # 不用载入 PostgreSQL 的 Module  
  4.  

  七、重新启动 Proftpd 即完成

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

  八、快速 开帐号 的步骤

  1.   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, '', '');  
  2.  
  3.   (修改 3, 'USERNAME', 'PASSWORD', 2003, '/home/www.demo.com' 这些值即可.)  
  4.  
  5.   mkdir /home/www.demo.com # 建目录  
  6.  
  7.   chown ftpuser:ftpgroup /home/www.demo.com # 改权限  
  8.  

  这样子就完成啰~

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

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

  MySql 加这两个 Table 和 资料:

 

  1.   CREATE TABLE ftpquotalimits (  
  2.  
  3.   name varchar(30) default NULL,  
  4.  
  5.   quota_type enum('user','group','class','all') NOT NULL default 'user',  
  6.  
  7.   per_session enum('false','true') NOT NULL default 'false',  
  8.  
  9.   limit_type enum('soft','hard') NOT NULL default 'soft',  
  10.  
  11.   bytes_in_avail int(10) unsigned NOT NULL default '0',  
  12.  
  13.   bytes_out_avail int(10) unsigned NOT NULL default '0',  
  14.  
  15.   bytes_xfer_avail int(10) unsigned NOT NULL default '0',  
  16.  
  17.   files_in_avail int(10) unsigned NOT NULL default '0',  
  18.  
  19.   files_out_avail int(10) unsigned NOT NULL default '0',  
  20.  
  21.   files_xfer_avail int(10) unsigned NOT NULL default '0'  
  22.  
  23.   ) TYPE=MyISAM;  
  24.  
  1.   CREATE TABLE ftpquotatallies (  
  2.  
  3.   name varchar(30) NOT NULL default '',  
  4.  
  5.   quota_type enum('user','group','class','all') NOT NULL default 'user',  
  6.  
  7.   bytes_in_used int(10) unsigned NOT NULL default '0',  
  8.  
  9.   bytes_out_used int(10) unsigned NOT NULL default '0',  
  10.  
  11.   bytes_xfer_used int(10) unsigned NOT NULL default '0',  
  12.  
  13.   files_in_used int(10) unsigned NOT NULL default '0',  
  14.  
  15.   files_out_used int(10) unsigned NOT NULL default '0',  
  16.  
  17.   files_xfer_used int(10) unsigned NOT NULL default '0'  
  18.  
  19.   ) TYPE=MyISAM;  
  20.  
  21.   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);  
  22.  
  23.   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, '', '');  
  24.  

  十、修改 Proftpd 设定

  以支援 MySQL 的 Quote data

  1.   vim /etc/proftpd/proftpd.conf 加入  
  2.  
  3.   # User quotas  
  4.  
  5.   # ===========  
  6.  
  7.   QuotaEngine on  
  8.  
  9.   QuotaDirectoryTally on  
  10.  
  11.   QuotaDisplayUnits Mb  
  12.  
  13.   QuotaShowQuotas on  
  14.  
  15.   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}'"  
  16.  
  17.   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}'"  
  18.  
  19.   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  
  20.  
  21.   SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies  
  22.  
  23.   QuotaLimitTable sql:/get-quota-limit  
  24.  
  25.   QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally  
  26.  
  27.   SQLNamedQuery gettally SELECT "ROUND((bytes_in_used/1048576),2) FROM ftpquotatallies WHERE name='%u'"  
  28.  
  29.   SQLNamedQuery getlimit SELECT "ROUND((bytes_in_avail/1048576),2) FROM ftpquotalimits WHERE name='%u'"  
  30.  
  31.   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'"  
  32.  
  33.   SQLShowInfo LIST "226" "Used %{gettally}MB from %{getlimit}MB. You have %{getfree}MB available space."  
  34.  
  35.   RootLogin off  
  36.  
  37.   RequireValidShell off  
  38.  

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

【编辑推荐】

  1. Proftpd下 贴心小技巧
  2. Linux ProFTPd服务器配置(全)
  3. ProFTPD 下的五大问题
  4. ProFTPD 有问必答
  5. Debian Proftpd 的安装设定
  6. 如何安装ProFTPD
  7. ProFTPd服务器相关命令
责任编辑:zhaolei 来源: 互联网
相关推荐

2011-03-08 11:21:55

proftpdxinetd

2011-03-02 17:56:13

Xinetd启动Proftpd

2011-03-03 10:32:28

ProftpdMysql管理

2011-05-16 09:44:40

Mysql

2011-02-23 09:01:37

2010-11-12 12:51:26

2011-03-03 10:06:13

ProftpdMysqlQuota

2011-03-03 14:04:08

ProftpdFtp server

2011-03-03 09:40:58

2011-03-03 10:00:14

ProFTPD建立MySQL

2011-02-22 15:09:32

ProFTPD服务器

2011-02-22 14:26:04

ProFTPD

2011-02-22 14:26:04

ProFTPD

2011-02-25 14:48:25

ProftpdMySQL

2011-02-22 15:29:39

2011-03-07 16:13:09

MySQL数据库管理

2011-03-03 09:26:59

ProFTPD服务器管理

2011-02-25 16:14:09

proftpdftp

2011-03-01 14:39:16

2011-03-08 15:47:57

Proftpdmysqlquota
点赞
收藏

51CTO技术栈公众号