PureFTPd 系列中文文档之 README.MySQL ---- 配合MySQL使用 Pure-FTPd

--------------------------------------------------------------------------------
中文版声明:本文根据 Pure-FTPd 1.0.18 源代码中的同名英文原文翻译而来(英文原文所在
的原代码压缩包可以通过 http://pureftpd.sourceforge.net/ 获得),遵循GPL协议。鼓
励复制、传播、分发和修改,不过请保留作者署名和本声明。
欢迎来信交流:jeffwu_cn at hotmail.com
--------------------------------------------------------------------------------

如果你之前从来没有听说过 MySQL ,请不要在 Pure-FTPd 中启用 MySQL 支持。如果你不
需要管理大量的共享帐号的话,MySQL支持是没有多少用的。但是,好...,如果你想要了
解任何有关MySQL的信息的话,http://www.mysql.com/ 是一个好的起点。


------------------------------- MYSQL 支持 ------------------------------------


从 0.99.1 版本起,Pure-FTPd 内建了 MySQL 数据库的支持。当 MySQL 启用时,所有的
帐户信息都从一个中心 MySQL 数据库中获取。

编译带 MySQL 支持的服务器时,你必须首先编译和安装 MySQL 客户端库。MySQL 可从
http://www.mysql.com/ 免费获得,而且二进制包也被包括在了许多主要的发布包中了。
不过,如果你选择了一个二进制形式的话,在开发包和安装包分离的情况下,不要忘了把
开发包也安装上。

然后,使用 --with-mysql 选项和其他你喜爱的小配件来配置 Pure-FTPd :

    ./configure --with-mysql --with-cookie --with-throttling --with-ratios

如果你的 MySQL 库被安装在一个特别的路径中,你可以像这样来指定它:

    ./configure --with-mysql=/opt/mysql

在这个例子中,头文件(像 mysql.h)将在目录 /opt/mysql/include 和
/opt/mysql/include/mysql 中查找,相关的库文件将在目录 /opt/mysql/lib 和
/opt/mysql/lib/mysql 中查找。

然后,像通常一样安装服务器:

                                 make install

---------------------------- MYSQL 配置文件 -----------------------------------

在运行服务器前,你必须创建一个配置文件。你也许会问,为什么要用配置文件代替简单
的命令行参数呢?因为安全问题,你可能需要隐藏 Pure-FTPd 是怎么连接到你的 MySQL数
据库的。在本地用户能发现命令的命令行选项(例如使用 'ps auxwww')的情况下,为敏
感的数据使用配置文件可能会更安全。确保配置文件是仅 root 用户可读的(chmod 600)。

下面是一个配置文件的例子:

#MYSQLServer     localhost
#MYSQLPort       3306
MYSQLSocket     /tmp/mysql.sock
MYSQLUser       root
MYSQLPassword   rootpw
MYSQLDatabase   pureftpd
MYSQLCrypt      cleartext
MYSQLGetPW      SELECT Password FROM users WHERE User="\L"
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L"
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L"

看看这 pureftpd-mysql.conf 配置文件例子中每个关键字的解释。

可以把这个配置文件保存在任何地方。让我们假如它是 /etc/pureftpd-mysql.conf 。

然后,你必须使用带这个配置文件路径的命令选项 '-l mysql:' 来启动 pure-ftpd。下面
是用于 tcpserver 的一个例子:

tcpserver -DHRl0 0 21 /usr/local/bin/pure-ftpd -l mysql:/etc/pureftpd-mysql.conf &

你可以混合不同的多种认证方式。比如:在一个帐号在 MySQL 数据库中找不到时你想使用
系统帐号 (/etc/passwd) 中对应的某个帐号时,可以使用:

-l mysql:/etc/pureftpd-mysql.conf -l unix

----------------------------- 数据表格结构 ------------------------------------

Pure-FTPd 非常灵活而且用户信息可以任何形式存储在 SQL 表格中。你仅仅只需要有保存
下列信息的列:

- 用户登陆。

- 用户密码,可以以明文、MD5、crypt()或者 MySQL的 password() 等多种格式。
Pure-FTPd 还接受 MySQLCrypt 列的“任何”值。所谓“任何”,指所有的散列函数(除
了明文)都是经过测试过的。

* 推荐:在使用非常老的 C 库的 Solaris 系统上,使用 MySQL MD5 散列函数。在所有其
他系统上,最好使用 crypt()。最好不用非常弱的 password() 函数,它不能移植,且一
般仅在 MySQL 服务器内部帐号使用的。在 MySQL 4.1.0 和以后版本,Pure-FTPd 不再支
持 password() 函数了。

- FTP 用户映射到的系统用户ID(uid)。可以是一个数字或用户名,在运行时查找。

- 系统用户组ID(gid)(数字或非数字)。

- 用户主目录。

这里有一个处理这些东西的简单表格的示例:

CREATE TABLE users (
  User varchar(16) NOT NULL default '',
  Password varchar(64) NOT NULL default '',
  Uid int(11) NOT NULL default '-1',
  Gid int(11) NOT NULL default '-1',
  Dir varchar(128) NOT NULL default '',
  PRIMARY KEY  (User)
);

如果你需要使用用户名代替数字的话,可以将 Uid 和 Gid 的数据类型用 char() 代替
int()。

然后,在配置文件 pureftpd-mysql.conf 中,你需要提供 SQL 模板来获取必须的信息。

我们利用前面的例子:

MYSQLGetPW      SELECT Password FROM users WHERE User="\L"
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L"
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L"

其中,在每个一个查询中:

\L 由尝试登陆的用户的用户名代替。
\I 由客户端要求连接到的 IP 地址代替。
\P 由客户端要求连接到的端口号代替。
\R 由客户端连接过来的远端 IP 地址代替。
\D 由远端 IPv4 地址代替,一个长整型的十进制数。

你可以混合所有这些并在不同的表中保存信息。比如:使用 \I,每一个域你可以使用不同
的表,这样 joe@domain1 和 joe@domain2 就是不同的帐号的了。使用 \R,你可以限制一
个特定的IP地址才能使用某个帐号。

请注意,登陆用户名尽包括普通的字符:A-Z , a-z , 0-9 , - , . , _ , 空格 , : ,
@ 和 ' 。出于安全目的,其他字符是禁止的。

你也可以在你的表格中去掉 uid 和 gid 这两列,而使用缺省的值代替(这样就减少了无
用的查找)。有两个指令对于实现这样的目的是有用的:MYSQLDefaultUID 和
MYSQLDefaultGID。

明显的例子:

MYSQLDefaultUID 1000
MYSQLDefaultGID 1000

使用这些指令来覆盖 MYSQLGetUID 和 MYSQLGetGID。

----------------------------- 每一个用户的设置 --------------------------------

使用可选的查询,可以为每一个用户设定个人的设置。

- MySQLGetQTAFS 是用户能在其主目录保存的最大的文件数目。

例如:
MySQLGetQTAFS  SELECT QuotaFiles FROM users WHERE User="\L"

- MySQLGetQTASZ 是用户能使用的最大的硬盘空间,以兆(Megabytes)为单位。

例如:
MySQLGetQTASZ  SELECT QuotaSize FROM users WHERE User="\L"

- MySQLGetRatioUL 和 MySQLGetRatioDL 是可选的比率。

例如:
MySQLGetRatioUL SELECT ULRatio FROM users WHERE User="\L"
MySQLGetRatioDL SELECT DLRatio FROM users WHERE User="\L"

- MySQLGetBandwidthUL 和 MySQLGetBandwidthDL 是可选的上传和下载带宽限制。返回值
以 KB/s 为单位。

例如:
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"

- MySQLForceTildeExpansion 也是另外一个可选特性,开启 "~" 来扩展路径。0 是禁止
(默认值),1 为开启。仅在真实的系统用户与虚拟(MySQL)用户相匹配时才开启。在其
他任何情况下,请不要盲目的开启它。

------------------------------- 事务 ------------------------------------------

如果你升级你的表格到支持事务的表格时,你可以配置你的 Pure-FTPd 来利用事务。这样
的话,你就可以保证服务器能完成所有信息的解析,即使你在同时进行更新x作时也是。

开启事务,添加下面一行:

MySQLTransactions On

在表格依然是 ISAM 或 MyISAM 格式时不要开启事务。事务仅工作在更新的后端(Gemini,
InnoDB,BerkeleyDB...)和目前最新的 MySQL 版本。

------------------------------ 匿名用户 ---------------------------------------


如果你需要匿名用户连接你的 FTP 服务器,你不需要在 MySQL 中由任何 'ftp' 用户。不
过,你需要在 FTP 服务器中拥有一个系统的 'ftp' 用户。

----------------------------- ROOT 用户 ---------------------------------------

如果一个 MySQL 用户条目拥有 root (0) 用户ID或者组ID, Pure-FTPd 将拒绝它的登陆。

没有这个预防性质的限制的话,如果你的 MySQL 服务器受到损害或牵连,攻击者就能很容
易的牵连到 FTP 服务器。

安全屏障也被实现来避免因错误的数据类型(例如,binary blobs 代替了plain text)被

SQL 查询获取而产生的坏的牵连。


转自:http://www.fresh3g.org/blog/post/16/

你可能感兴趣的:(linux)