Nov 26

[原]Proftpd+Clamav+Mysql+MD5+Quota混合配置 不指定

linuxing , 10:17 , 网络服务 » 常见服务 , 评论(2) , 引用(0) , 阅读(31838) , Via 本站原创 | |
   Proftpd是红旗DC Server 5.0自带的FTP服务端软件,也是一个非常优秀的开源套件。其默认使用操作系统的PAM模块作认证。在用户量比较少的情况下,其速度很理想,管理也方便。但若随着用户量的增长,单纯依赖PAM模块的认证方式就会显露出问题,而且也不利于于第三方软件的配合(例如论坛用户)。所以,随着其快速的发展,很多开发人员为其提供了大量的模块插件,供特殊情况使用。SQL模块和LDAP模块就是其中之一。
   今天我要讲解的配置,就是基于以下功能模块的:
引用
1、Mod_sql模块,提供基于Mysql或Postgresql数据库的认证功能;
2、Quota模块,提供数据库的磁盘配额功能;
3、Clamav模块,提供对传输文件的实时病毒扫描功能;

此外,因原Mod_sql模块没有提供MD5的口令认证方式,所以,我也对其做了一些改动,以方便和其他软件的整合。至于,Postgresql和LDAP模块的配置,可参考Mysql的规则定义实现。

一、获取软件
虽然红旗DC Server 5.0自带Proftpd套件,但其只包括基本的功能,并没有提供第三方的模块,需要从源码进行编译。
为方便使用(已经放入yum库),可以直接从这里下载。
红旗DC Server 5.0 for x86用的版本:

红帽 5 for x86用的版本:

源码:

※若你希望对其他平台使用,可使用rpmbuild对源码包编译。而其默认会增加Clamav模块的,所以,编译前,请安装Clamav-devel包。编译时需要注意的问题,见后面附录介绍。

二、配置示例
1、安装proftpd
首先,卸载原来的proftpd,并安装新版本:
# rpm -e proftpd
# yum install proftpd*


2、创建数据库
# mysql -uroot -p
mysql> create database proftp;
mysql> grant all on proftp.* to linuxing@localhost identified by 'redflag';


3、生成表
在上述rpm包中,我也已经把示例文件放在sample-configurations目录中,可修改相关变量简化配置:
# cd /usr/share/doc/proftpd-1.3.1/sample-configurations/
# sed -i 's/@DATABASE/proftp/g' mod_sql_sample.sql
# sed -i 's/@GROUPS_TABLE/FTPGROUPS/g' mod_sql_sample.sql
# sed -i 's/@USERS_TABLE/FTPUSERS/g' mod_sql_sample.sql
# sed -i 's/@DEMO_USER/ftptest/g' mod_sql_sample.sql
# mysql -ulinuxing -predflag proftp < mod_sql_sample.sql

※上述变量含义如下:
@DATABASE:数据库名称
@GROUPS_TABLE:用于存放组的表名称
@USERS_TABLE:用于存放用户的表名称
@DEMO_USER:测试用户


4、修改配置文件
# cd /etc/
# sed -i 's/@DATABASE/proftp/g' proftpd.conf
# sed -i 's/@FTPUSER/linuxing/g' proftpd.conf
# sed -i 's/@FTPPWD/redflag/g' proftpd.conf
# sed -i 's/@USERS_TABLE/FTPUSERS/g' proftpd.conf
# sed -i 's/@GROUPS_TABLE/FTPGROUPS/g' proftpd.conf

※上述变量含义如下:
@DATABASE:数据库名称
@GROUPS_TABLE:用于存放组的表名称
@USERS_TABLE:用于存放用户的表名称
@FTPUSER:登陆数据库的用户
@FTPPWD:登陆数据库的用户密码


5、创建用户
# groupadd -g 1000 -r FTPGROUP
# adduser -u 1000 -g 1000 -d /FTP -s /bin/nologin -r FTPUSER
# mkdir /FTP
# chown FTPUSER:FTPGROUP /FTP

这里,定义一个供所有Mysql中所有用户共享登陆的目录/FTP。其中的UID和GID都是1000,必须和数据库中的值一致。(这里是以我的默认配置为准,若修改,请同时修改数据库中的值)

6、配置支持Clamav
修改/etc/proftpd.conf中的下述变量,指向/etc/clamd.conf中定义的路径:
引用
ClamAV on
ClamLocalSocket /var/run/clamav/clamd.sock

为让Clamav可以扫描proftpd中的文件,还需把clamav用户加入到FTPGROUP组中:
# usermod -G FTPGROUP clamav


7、启动proftpd
# service proftpd start

使用上面设置的演示用户登陆即可。
查看磁盘配额:
引用
lftp ftptest@localhost:/> quote site QUOTA
200-The current quota for this session are [current/limit]:
Name: ftptest
Quota Type: User
Per Session: False
Limit Type: Soft
  Uploaded Kb: unlimited
  Downloaded Kb:       unlimited
  Transferred Kb:      unlimited
  Uploaded files:      unlimited
  Downloaded files:    unlimited
  Transferred files:   unlimited
200 Please contact root@localhost if these entries are inaccurate

默认的演示用户是没有配额为0,也就是不限制的。

三、配置说明
下面对一些重要的参数说明一下,以方便大家今后配置。
1、SQL认证部分
详细的参数说明,请参考:这里
在使用上述标签的时候,要注意两方面:
引用
a、必须先加载mod_sql.c库后,才能使用标签;
b、标签的Context是表明其可以适用的范围,例如我默认放在<Global>中。

加入SQL认证模块:
引用
AuthPAMConfig                   proftpd
AuthOrder                       mod_sql.c mod_auth_pam.c* mod_auth_unix.c

SQL参数有:
引用
#定义登陆数据库的信息
SQLConnectInfo proftp@127.0.0.1:3306 linuxing qwer0987

#定义密码验证的方式
#包括:使用passwd函数、明文、OpenSSL、Crypt函数、空密码等
#SQLAuthTypes Backend Plaintext OpenSSL Crypt Empty

#MD5验证方式是我外加的,方便从mysql的md5()函数生成密码,也可以配合论坛、博客的用户绑定
SQLAuthTypes MD5

#定义从Mysql获取用户的资料
#用户的信息必须按照规定的顺序:表、用户名、密码、uid、gid、主目录、shell
#信息的定义与Mysql中的列名相同,home和shell可为空(NULL)
SQLUserInfo FTPUSERS userid passwd uid gid home shell

#定义从Mysql获取用户组的资料,规则同上
SQLGroupInfo FTPGROUPS grpname gid members

#因shell可为空,或/dev/nologin等不合法的定义,故关闭校验shell的选项
RequireValidShell off

#定义支持用户和用户组的校验方式,fast的定义见说明
SQLAuthenticate users groups usersetfast groupsetfast

#定义SQL的日志记录,方便排错,以后可不用
SQLLogFile /var/log/proftpd/sqllog.log

#SQLLog标签定义那些FTP命令会执行下面的SQLNamedQuery命令
#这里,当登陆进入FTP,运行PASS命令成功后,就会运行SQLNamedQuery的updatecount更新数据库
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1,lastime=now() WHERE userid='%u'" FTPUSERS
#也可以支持insert操作
#SQLNamedQuery accesslog INSERT "now(), '%u'" FTPUSERS

#当使用select的时候,可以得到从数据库反馈的值,供SQLShowInfo显示使用
SQLNamedQuery countnum SELECT "count from FTPUSERS where userid='%u'"
SQLNamedQuery lastime SELECT "lastime from FTPUSERS where userid='%u'"
SQLShowInfo PASS "230" "You've logged on %{countnum} times,last login at %{lastime}"

#若你希望每个用户都有一个独立的主目录,则可以在数据库中指定home的值,并打开下述设置
#这样,当用户登陆的时候,若主目录不存在,会由proftpd自动创建
#创建的目录,其用户和用户组与数据库中的uid、gid一致
#若关闭该选项,但定义的用户主目录不存在,用户将不能登陆
#但该标签已经被丢弃,不建议使用。我们应在shell中先预先创建主目录,以避免安全问题。
#SQLHomedirOnDemand on

#若该标签定义定义SQL管理的用户默认的主目录,可被Mysql中的home值覆盖
#下面的路径不要使用单引号定义,原文有错
SQLDefaultHomedir /FTP

2、磁盘配额部分
配置文件中定义如下,拷贝即可:
引用
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 quotalimits \
   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 quotatallies \
   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}'" quotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

磁盘配额使用SQL储存的时候,写在两个表:quotalimits和quotatallies中。
quotalimits表:
引用
name: - 用户帐号
quota type: - user, group, class, all,定义对用户、主、级别还是全部进行配置
per_session: - true or false 是否对每个session限制
limit_type: - 硬限制 or 软限制,硬限制是永远不能超过下面定义的值,而软限制,当一次传输文件时,不会即时对文件的大小判断,即使其超过下面的值,也可以传输成功的;但当传输下一个文件时,就会被告知超过磁盘配额。(已经传输的文件不会被截断,也不会删除)
bytes_in_avail: - 允许上传的字节数
bytes_out_avail: - 允许下载的字节数
bytes_xfer_avail: - 允许传输的字节数(包括上传/下载)
files_in_avail: - 允许上传的文件数
files_out_avail: - 允许下载的文件数
files_xfer_avail: - 允许传输的文件数(包括上传/下载)

quotatallies表:
不需要我们添加值,其内容由proftpd实时更新,存放对应上面磁盘配额已经使用的大小。
※需要注意的是,该表只会记录通过FTP发生的变化。
举例:某用户的上传磁盘配额是10M,当使用ftp上传10M数据后,quotatallies表中bytes_in_used就会记录10M的大小;但当登陆后台,删除该数据,bytes_in_used的值并不会减少。这意味着,此时该用户还是不能上传数据的。除非,你手动更新bytes_in_used的值。
所以,若你创建了磁盘配额,建议配合bash、php等定时对用户的空间进行统计,并更新quotatallies表的内容。
磁盘配额中的定义,以字节计算,1024byte=1K


3、防病毒部分
若你希望clamav实时扫描FTP传输的内容,在启动proftpd服务前,应启动clamd服务,否则会出现错误:
引用
proftpd[13142]: asptest.localdomain (::ffff:192.168.228.244[::ffff:192.168.228.244]) - mod_clamav/0.5: error: Cannot connect to ClamAVd: (2) /tmp/clamd.socket

而如果你没有把clamav用户加入对应的用户组(可能你配置了多个用户组),则也会报错:
引用
proftpd[13142]: asptest.localdomain (::ffff:192.168.228.244[::ffff:192.168.228.244]) - mod_clamav/0.5: error: Cant write to the ClamAVd socket: 9

当你一切配置正确后,Clamav即会默默的进行扫描的工作,除非发现病毒:
引用
proftpd[14115]: asptest.localdomain (::ffff:127.0.0.1[::ffff:127.0.0.1]) - mod_clamav/0.5: warning: /home/FTP/user1/clam.zip: ClamAV-Test-File FOUND
asptest local6 16:05:50 clamd[13957]: /home/FTP/user1/clam.zip: ClamAV-Test-File FOUND

含毒的文件会被自动删除。

4、增加用户
使用如下语句加入用户,并分配到uid和gid为1000的实际用户中:
引用
INSERT INTO `FTPUSERS` VALUES ('用户名',md5('用户密码'),1000,1000,'/FTP','',0,now());

配置用户的磁盘配额,0为不限制,1024000是10M:
引用
INSERT INTO `quotalimits` VALUES ('用户名','user','false','soft',1024000,0,0,0,0,0);

※proftpd在使用mod_sql模块进行用户认证时,除需要一个实际的用户和用户组外,新增加的用户是不需要在系统中创建用户的。

5、权限
好可惜,目前proftpd还是不能支持在数据库中定义权限。
所以,相应用户的权限还是得用实际得用户,即mysql对应得uid和gid来控制权限,并使用Directory等标签规定。在部署的时候,请配合组方式定义咯。

四、附录
因篇幅的问题,我使用的MD5认证方式,以及源码编译的注意事项放在另一份日志中进行说明。

五、参考资料
ProFTPD module mod_sql_mysql
http://www.proftpd.org/docs/contrib/mod_sql.html
http://www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-SQL.html

ProFTPD module mod_quotatab
http://www.proftpd.org/docs/contrib/mod_quotatab_sql.html

ClamAV module for ProFTPD
http://www.uglyboxindustries.com/open-source.php
http://www.uglyboxindustries.com/mod_clamav_new.html

http://www.chinaunix.net/jh/15/3028.html
http://www.5ilinux.com/blog/archives/000091.html

※2007-11-29 修改模板数据库,使用utf8编码
Tags: , , , ,
hover
2008/06/26 19:01
博主,为什么用proftpd+mysql,登陆ftp那么慢的?有什么解决办法吗?谢谢
linuxing 回复于 2008/06/27 11:20
似乎是proftpd调用mysqk链接库时有延迟,我这里也一样,暂时没有处理方法。幸亏只是登陆的时候延迟,进去以后问题就不大了。
(你可看看后台日志,因quota等设置,验证及切换目录等动作时都需要运行SQL语句,肯定会有一定的性能损失的)
jw
2008/03/10 09:48
太有用了
非常感谢!zan
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]