--------------------------------------------------------------------------------
中文版声明:本文根据 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)被
中文版声明:本文根据 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/