本节主要内容:
配置proftpd的mysql/ target=_blank class=infotextkey>mysql数据库虚拟用户认证
proftpd的Quotas磁盘限额。
1、什么是ProFTPD;
ProFTPD 是一个FTP服务器程序,和vsftpd、wuftp 类似的FTP服务器,他们最终实现功能和目的都是一样的,都是为了传输文件;
2、ProFTPD的编译和安装;
2.1、ProFTPD的下载;
ProFTPD的主页: http://www.proftpd.org
本教程选用版本: proftpd-1.3.0rc3.tar.gz
下载地址:
ftp://ftp.proftpd.org/distrib/source/
http://www.proftpd.org/download.html
2.2、编译安装;
编译安装时得用编译环境,比如需要gcc,如果少什么包,您可以在系统安装盘中找到;或者在线升级也行;现在大多的发行版都有支持在线升级的软件包管理工
具;比如RPM的系统有yum和apt可用,debian有apt可用。
另外,Proftpd的用户认证是通过Mysql数据库来实现的,也得把Mysql数据库服务器也得安装上吧。
想把ProFTPD 安装在 /opt/proftpd 目录中,把软件下载到 root用户的家目录中,因为安装软件需要
root权限,如果在普通用户下执行编译是,到make install 这步,得通过su命令切换到root用户,然后执行
解压、编译、安装
我的mysql安装在/usr/local/mysql下,如果不是安装在这个目录下,要做出相应的修改.
说明:
在configure过程中的错误排查:
如果在configure过程中,也就是上面的./configure 一长串指令执行后,有错误发生,无非是编译工具缺少或者Mysql的includes和libraries的目录指定的不对;
编译和安装:
如果没有错误发生,这样就安装好了,您可以在 /opt/目录下看到一个/opt/proftpd 的目录;
3、ProFTPD认证中的MySQL数据库
3.1、创建一个ProFTPD的数据库proftpd;
首先您应该会把MySQL数据库服务器打开,以MySQL的超级管理员root进入创建名为proftpd的数据库;
说明:
create database proftpd; 这行是创建名为proftpd的数据库;
Grant 这行是为proftpd 数据库授权,让用户名为proftpd,密码为123456(这只是一个例子,密码自己定义),这个用来管理proftpd这个数据库;
quit 这行是退出mysql界面;
3.2、导入proftpd数据库;
下面是一个现成的数据库,只需要导入即可。
把下面的代码拷贝下来,然后另存为 proftpd.sql;
然后通过下面的命令来导入;
[root@localhost ~]# mysql -uproftpd -p proftpd
AllowAll
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
# Limit login attempts
#
MaxLoginAttempts 5
# Set the maximum number of seconds a data connection is allowed
# to "stall" before being aborted.
TimeoutStalled 600
TimeoutLogin 900
TimeoutIdle 600
TimeoutNoTransfer 600
# Set the user and group under which the server will run.
User nobody
Group nobody
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~
# Users needs a valid shell
#
requireValidShell off
# Performance: skip DNS resolution when we process the logs...
UseReversedNS off
# Turn off Ident lookups
IdentLookups off
# Restart session support
#
AllowStoreRestart on
AllowRetrieveRestart on
#-------- load sql.mod for mysql authoritative --------#
SQLConnectInfo proftpd@localhost proftpd 123456
#注:上面这行是MySQL连接服务器部份,自己根据情况来改一改;
SQLAuthTypes Plaintext
SQLUserInfo ftpusers userid passwd uid gid homedir shell
SQLGroupInfo ftpgroups groupname gid members
SQLAuthenticate users groups
SQLNegativeCache on
SQLHomedirOnDemand on
SQLLogFile /var/log/proftpd.sql.log
SQLNamedQuery getcount SELECT "count from ftpusers where userid='%u'"
SQLNamedQuery getlastlogin SELECT "lastlogin from ftpusers where userid='%u'"
SQLNamedQuery updatelogininfo UPDATE "count=count+1,host='%h',lastlogin=current_timestamp() WHERE userid='%u'" ftpusers
SQLShowInfo PASS "230" "You've logged on %{getcount} times, last login at %{getlastlogin}"
SQLLog PASS updatelogininfo
#-------- load sql.mod for mysql authoritative --------#
#--------- load qudes.mod for Quota limit --------#
QuotaDirectoryTally on
QuotaDisplayUnits "Mb"
QuotaEngine on
#QuotaLog /var/log/proftpd.quota.log
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 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
#--------- load qudes.mod for Quota limit --------#
# Logging options
# Debug Level
# emerg, alert, crit (empfohlen), error, warn. notice, info, debug
#
SyslogLevel emerg
SystemLog /var/log/proftpd.system.log
TransferLog /var/log/proftpd.xferlog
# Some logging formats
#
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"
LogFormat write "%h %l %u %t "%r" %s %b"
# Log file/dir access
# ExtendedLog /var/log/proftpd.access_log WRITE,READ write
# Record all logins
ExtendedLog /var/log/proftpd.auth_log AUTH auth
# Paranoia logging level....
ExtendedLog /var/log/proftpd.paranoid_log ALL default
#注;上面几行是存放log的设置,不必改动也行;查看log就到上面相应的文件看吧;
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30 #注最多30个ip同时登录使用ftp;
# Maximum clients with message
#MaxClients 2 "Sorry, max %m users -- try again later"
MaxClientsPerHost 2 "Sorry, only 2 session for one host"
#注每个ip,只能两个线程程,请自己调整;
# Normally, we want files to be overwriteable.
AllowOverwrite on
RootLogin off
RequireValidShell off
# alphanumeric characters for uploads (and not shell code...)
#PathAllowFilter "^[a-zA-Z0-9_.-]()'+$"
#PathAllowFilter "^[a-zA-Z0-9 _.-]()'+$"
# We don't want .ftpaccess or .htaccess files to be uploaded
#PathDenyFilter "(.ftp)|(.ht)[a-z]+$"
#pathDenyFilter ".ftp[a-z]+$"
# Do not allow to pass printf-Formats (security! see documentation!):
#AllowFilter "^[a-zA-Z0-9@~ /,_.-]*$"
#DenyFilter "%"
5、系统用户和用户组ftp的UID和GID的调整;
由于在配置文件中,把ftp的用户和用户组的UID和GID都设置为了1000;
所以得调整一下/etc/passwd 和/etc/group中有关ftp用户和用户组的行;把UID和GID都改为1000;
可以在/etc/passwd 中找到 ftp用户一行,比如类似下面这行
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
在这行中,14是ftp用户的UID,要改为1000,50为ftp用户组的GID,也改为1000,其它的可以不变;也就是
ftp:x:1000:1000:FTP User:/var/ftp:/sbin/nologin
接着再找到 /etc/group ;在这个文件中找到一行,类似如下的;
ftp:x:50:
把这行中的50改为1000;也就是这样的;
ftp:x:1000:
6、启动ProFTPD,并测试;
[root@localhost ~]# /opt/proftpd/sbin/proftpd
[root@localhost ~]# pgrep proftpd
17965
说明:上面就把proftpd 启动起来了;通过pgrep 来查看是否有ProFTPD的进程,查看得知已经有了;证明服务器已经启动。进入测试阶段;
测试:测试帐号是test,密码是test;您可以用ftp命令来测试,也可以用lftp来测试,也可以用gftp来测试;
找一个FTP客户端就行;这个test帐号是怎么来的呢。回头看一下proftpd.sql那段代码中,是否有下面这行;
INSERT INTO `ftpusers` VALUES ('test', 'test', 1000, 1000, '/home/test', '/sbin/nologin',0,'','');
这是我在写文档时,添加的一个测试帐号;只要把proftpd.sql文件导入了,就有这个帐号;当然也可以删除它;
上面这行说的是在ftpusers的表中,添加一个录;
也就是ftp用户的记录;在本文的最下面有说明如何通过MySQL来管理帐号;
在这里只是测试是不是FTP能用了;
在默认的情况下,test用户的家目录是在/home/test,密码是test;
而/home/test是当您第一次以用户test登录时,系统自动建立的;这些都自动的;
如果您用ftp命令连接
[root@localhost home]# ftp localhost
Connected to localhost.localdomain.
220 ProFTPD 1.3.0rc3 Server (My TestFTP) [127.0.0.1]
500 AUTH not understood
500 AUTH not understood
KERBEROS_V4 rejected as an authentication type
Name (localhost:beinan): test 注:用户名
331 Password required for test. 注:密码
Password:
230-You've logged on 5 times, last login at 2006-01-02 12:50:27
230 User test logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls 注:ls 查看;
227 Entering Passive Mode (127,0,0,1,128,31).
150 Opening ASCII mode data connection for file list
226 Transfer complete.
ftp> mkdir mytestdir 注:创建目录看是否成功;
257 "/mytestdir" - Directory successfully created
ftp> dir 注:查看是否有mytestdir 目录;
227 Entering Passive Mode (127,0,0,1,128,32).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 test ftp 4096 Jan 2 04:53 mytestdir
226 Transfer complete.
ftp>
如果您用lftp 来连接测试
说明:
如果您想远程连接,请把localhost改为实际IP地址,比如我的机器在本地网是192.168.1.5,那就把localhost改为192.168.1.5;如果您想在公网测试,请把localhost改为公网的IP地址;
请查看是否有/home/test这个目录 ?是不是FTP服务器自己建了一个?答案是肯定的... ...
7、关于ProFTP的服务器管理、用户管理和磁盘限额管理
7.1 ProFTPD 服务器的管理;
ProFTPD服务器的启动程序是在安装目录的sbin中,也就是proftpd;还是以安装目录/opt/proftpd 为准来说明;
注意:更改proftpd.conf后,要重启proftpd ,否则改动不会生效。这时就要用到pkill proftpd ,然后再重启proftpd 服务器;每次改动proftpd.conf都要这么做;
下面是几个查看ProFTPD服务器状态的命令,您也可以尝试一下,具体用法自己尝试吧;
7.2 通过MySQL来管理FTP用户
在本文档中,ProFTPD 对FTP用户是通过MySQL来进行的,现在分析一下前面所提到proftpd数据库;ftp所有的用户都装在ftpusers这个表中,先分析一下这个表;分析这个表的目的是能明白如何添加用户;
首先,以proftpd 用户和密码登录到MySQL;并查看ftpusers表的结构;
注:看到了proftpd 还是存在的;
要查看ftpusers 这个表的结构,要用到 DESCRIBE 这个指令,后面接表的名称;
说明:
userid 就是FTP的用户名,这个是必填写字段;
passwd 是FTP用户的密码,这个是必填写字段;
uid和gid字段默认是1000;
homedir 是FTP用户的家目录放在哪里,要自己指定;
shell 这个是用来指定用户是否能登录系统,这里默认的是不能登录,因为是虚拟用户,所以不能让虚拟用户来登录系统;所以默认是/sbin/nologin;
count 是访问次数,默认是0;
host 是登录FTP服务器的IP地址记录,可以不设置;服务器会自己纪录;
lastlogin 是最后登录时间,这个也是自动生成,可以不必理会;
如何添加用户呢?
其实添加用户的过程,也就是向proftpd 数据库中的表ftpusers插入纪录的过程;上面分析了表的结构;那就按其要求来插入用户纪录;
看看ftpusers的表中,有哪些纪录;
尝试插入一条纪录
比如想加一个用户,用户名为test2,密码为test2,UID和GID为都为1000,家目录位于/home/test2;值得注意的是
UID和GID的只能是1000,因为在系统用户设置中做了改动;前面有提到;添加所有的FTP用户UID和GID都是 1000;
所以如果您添加用户时,只是改一下userid、passwd和homedir字段处就行了。其它不必改动,当然您非常性MySQL也没有什么不可;
查看是否插入成功
再举一例;添加一个用户名为test3,密码为test3 ,并且把test3的家目录放在/opt/test3中;
mysql> INSERT INTO `ftpusers` VALUES ('test3', 'test3', 1000, 1000, '/opt/test3', '/sbin/nologin',0,'','');
添加好后,测试一下用户test3是否能登录,并且上传文件;下面的例子证明是成功的;
删除一个用户,用 MySQL的delete 指令;比如想删除test2这个用户;可以用.....
更新一条用户纪录,比如test用户密码字段;
更新用户纪录的那个字段就更新什么,下面公式;
mysql>update 数据表 set 字段="赋值" where 关健字段="字段值";
在这里关健字段是唯一的,这样才能找到你所要更新的纪录,表达不太好;如果不太熟悉,慢慢理解吧;我也不会MySQL;呵,难为人师...... 在这里,还是把userid 做为关健字段,因为只有这个字段才是唯一的;
再比如,想更新用户的家目录,比如我想把test用户的家目录改到 /opt/test;
通过上面的,得知test目前的家目录在/home/test,下面来更改到/opt/test;
7.3 ProFTPD 用户磁盘限额管理;
在前面所导入的proftpd 数据库中,有这样一段;
说明:
上面其实就是在proftpd库中创建一个表quotalimits;
在proftpd的数据库中,再来查看一下quotalimits表的结构,这样方便理解和使用磁盘限额;
说明;
应该这样理解,既能表示单个用户,也能表示用户组名;如果在quota_type(限额类型)中使用group来认证的话,那就得在这里设置组名,这
样整组都具有统一的磁盘限额的特性;当然您要在ftpgroups表中插入组纪录;并且在member字段中得把用户一个一个的列进去,这是后话了;先自
己研究一下,只是插入纪录的事;只说最简单的单个用户的磁盘限额;默认值可以为空NULL,如果为空则针对所在有quota_type中设置的类型,
比如在quota_type中设置为user ,就是针对所有ftpusers 中的用户起作用;如果是group名,也是对ftpgroups
所有组作用;
由此看来,比如想让test用户,约束空间大小为100M,其它不受限制;则可用下面的mysql命令添加;
先让对照quotalimits表的结构,然后根据表的结构来添加;
添加记录
运算公式:
注意:磁盘限额生效,必须让FTP用户重新登录才有效;比如test用户正在ftp上,这时要先退出,然后再登录,这是磁盘限额就有效了;
查看用户空间使用情况
登录FTP后用下面的命令;
quote site quota;
举例: