Proftpd是红旗DC Server 5.0自带的FTP服务端软件,也是一个非常优秀的开源套件。其默认使用操作系统的PAM模块作认证。在用户量比较少的情况下,其速度很理想,管理也方便。但若随着用户量的增长,单纯依赖PAM模块的认证方式就会显露出问题,而且也不利于于第三方软件的配合(例如论坛用户)。所以,随着其快速的发展,很多开发人员为其提供了大量的模块插件,供特殊情况使用。SQL模块和LDAP模块就是其中之一。
今天我要讲解的配置,就是基于以下功能模块的:
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,并安装新版本:
# yum install proftpd*
2、创建数据库
mysql> create database proftp;
mysql> grant all on proftp.* to linuxing@localhost identified by 'redflag';
3、生成表
在上述rpm包中,我也已经把示例文件放在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、修改配置文件
# 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、创建用户
# 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中定义的路径:
ClamLocalSocket /var/run/clamav/clamd.sock
为让Clamav可以扫描proftpd中的文件,还需把clamav用户加入到FTPGROUP组中:
7、启动proftpd
使用上面设置的演示用户登陆即可。
查看磁盘配额:
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认证部分
详细的参数说明,请参考:这里
在使用上述标签的时候,要注意两方面:
b、标签的Context是表明其可以适用的范围,例如我默认放在<Global>中。
加入SQL认证模块:
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、磁盘配额部分
配置文件中定义如下,拷贝即可:
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表:
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服务,否则会出现错误:
而如果你没有把clamav用户加入对应的用户组(可能你配置了多个用户组),则也会报错:
当你一切配置正确后,Clamav即会默默的进行扫描的工作,除非发现病毒:
asptest local6 16:05:50 clamd[13957]: /home/FTP/user1/clam.zip: ClamAV-Test-File FOUND
含毒的文件会被自动删除。
4、增加用户
使用如下语句加入用户,并分配到uid和gid为1000的实际用户中:
配置用户的磁盘配额,0为不限制,1024000是10M:
※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编码
搭建Master-Master Mysql Replication 集群
在红旗Asianux 3.0 上安装Moodle
WAS 5.1使用J2C 认证数据条目
配置WebSphere 5.1的数据库连接池
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/linux/112502.html