Unix系统下pureftpd使用详解
摘要:Unix系统下pureftpd使用详解。特别是解决了很多人匿名用户无法登录的问题。与数据库的结合使得管理成千上万的用户很轻松。
基础篇
一、安装
二、启动
三、匿名登录
四、系统真实用户登录
五、puredb虚拟用户支持
六、技巧
进阶篇
七、匿名用户的权限
八、真实用户和虚拟用户的权限
高级篇
九、PureFTPd和MySQL的结合
十、pureftpd与其它工具的结合
基础篇
1. 安装
我是以FreeBSD为平台的,其它Unix/Linux平台请参考相关shell命令。在shell提示符下输入:
# cd /usr/ports/ftp/pure-ftpd
# make install clean
# rehash
FreeBSD会以ports方式安装pureftpd。其它平台的安装方法参看相关文章。
2. 启动
将pureftpd配置文件的样例文件复制为配置文件:
# cp /usr/local/etc/pure-ftpd.conf.sample /usr/local/etc/pure-ftpd.conf
用配置文件启动 PureFTPd :
# /usr/local/sbin/pure-config.pl /usr/local/etc/pure-ftpd.conf
注意:如果是其它平台,或者采用编译方式安装,路径可能与上面的不同。
3. 匿名登录
经过上面的步骤,pureftpd已经启动。用 flashfxp 连接,只能系统用户连接(用“/etc/passwd”文本文件中的用户认
证)。 这是因为默认的配置文件中是允许匿名用户和系统用户(根帐号 root 除外)都可以访问的。但这时匿名用户还无法访问,出现“421 无法建立
安全匿名 FTP”错误。还需要几个步骤才能实现匿名登录。
pureftpd 的官方文件(http://download.pureftpd.org/pub/pure-ftpd/doc/README)说:
------------------------ SETTING UP AN ANONYMOUS FTP ------------------------
If a 'ftp' user exists and its home directory is reachable, Pure-FTPd will
accept anonymous login, as 'ftp' or 'anonymous'. Files have to be located in
the home FTP directory. There's no need for 'bin', 'lib', 'etc' and 'dev'
directories, nor any external program. Don't chown the public files to
'ftp', just writable directories ('incoming') .
就是说需要存在一个名称必须为“ftp”的系统用户,并且它的主目录可用。就可以实现匿名用户登录了。
心得:很多人在问为什么不能匿名登录,原因就在于没有“ftp”系统帐号,以及没有创建主目录()这里。
(1)、为匿名用户添加系统帐号和组。
增加一个“ftp”组:
# pw groupadd ftp
如果组存在,直接添加用户即可。
添加“ftp”系统用户:
# pw useradd ftp -g 14 -d /var/ftp -s /sbin/nologin
其中的 “/var/ftp”就是匿名用户的主目录,你可以指定为其它目录,比如“/home/ftp”等。
14是“ftp”组的组id 。其它的,比如 www 系统用户的 uid/gid 是:“80/80”,等等(见 /etc/passwd )。
如果发现帐号是存在的,那么请检查帐号的主目录是否存在,如果不存在,也会提示上述错误。
(2)、建立匿名用户的主目录。
# mkdir /var/ftp
# mkdir /var/ftp/readme
其中“mkdir /var/ftp/readme”是给个参照,因为“/var/ftp”是空的。
马上用 flashfxp 匿名登录,见到 readme 文件夹了,成功,激动!但是上传、下载、建目录什么的都不允许,要实现这些功能需要进一步修改配置文件,这个后面再说。
4. 系统真实用户登录
(1)、默认配置文件允许匿名用户登录,同时允许系统真实用户登录。经过上面的步骤后,这时我们用系统用户登录,是可以登录,并且可以上传、下载、建目录和删除等。
(2)、如果要让 FTP 只支持系统真实用户登录,你只要稍微修改一下 pureftpd 的配置文件就可以了。
# ee /usr/local/etc/pure-ftpd.conf
ChrootEveryone yes
NoAnonymous yes
UnixAuthentication yes //用“/etc/passwd”中的用户认
只需以上三行就可以实现只允许系统真实用户登录 FTP 。系统真实用户会登陆到自己的系统主目录中,可下载,可上传,可删除,没有任何限制。但是由于有 chroot 的限制,所以无法去真实系统的其它目录而已。在实际应用中,这种用法并不多见,我也就不费篇幅介绍了。
5. puredb虚拟用户支持
(一)建立 FTP 专用的系统用户。
自从 0.99.2 版本开始,pure-ftpd 就开始支持虚拟用户。
虚拟用户方式是一个简单的用户列表机制,类似于“/etc/passwd”,它将用户的相关信息,如口令、姓名、 uid、gid、主目录等,存
入一个文本文件。但是该文本文件文件只适用于 FTP 。这意味着,你可以很容易地设置 FTP 虚拟帐号,而不需要在系统中添加系统用户,以免和系统用
户混淆在一起。
同时,可以为这些虚拟用户单独设置配额、ratio、带宽等限制,这些功能是系统用户认证无法实现的。很多虚拟用户可以共享同一个系统用户的属性,因此建议为这些虚拟用户单独创建一个系统用户,从而方便管理。
你可以使用系统已经存在的帐号,比如“nobody”用户,作为虚拟用户的系统帐号。但最好使用一个单独的帐号,专门对应 FTP 。我们选择新
建系统用户(经测试,在 linux 系统中如果用 linux 系统自带的 ftp 用户,在用虚拟用户登陆时会出现不被信任的提示。大家也可以做做实
验,看是不是这样)。建立方法如下:
对于 Linux/OpenBSD/NetBSD/Solaris/HPUX/ 或其它的类 Unix 系统,使用下面的命令:
groupadd ftpgroup
useradd -g ftpgroup -d /home/ftp -s /sbin/nologin ftpuser
对于 FreeBSD ,用下面的命令:
# pw groupadd ftpgroup
# pw useradd ftpuser -g ftpgroup -d /home/ftp -s /sbin/nologin
系统帐号建立好后,我们就开始着手准备虚拟用户了。
(二)建立虚拟用户。
使用 ”pure-pw”命令实现创建、修改和删除虚拟用户等操作。虚拟用户的信息以每个用户一行的方式存放在相应的文本文件中。你也可以手工编辑这个文件。其存储格式如下:
<account>:<password>:<uid>:<gid>:<gecos>:<home directory>:<upload bandwidth>:<download bandwidth>:<upload ratio>:<download ratio>:<max number of connections>:<files quota>:<size quota>:<authorized local IPs>:<refused local IPs>:<authorized client IPs>:<refused client IPs>:<time restrictions>
除了帐号、口令、uid、gid 和 home directory 之外,其它的可以是空值。
下面是 pure-pw 命令用法。
1、创建新用户。
要创建一个新用户,用下列的语法。
pure-pw useradd <login> [-f <passwd file>] -u <uid> [-g <gid>]
-D/-d <home directory> [-c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client host>[/<mask>][,<allow client host>[/<mask>]]...]
[-R <deny client host>[/<mask>][,<deny client host>[/<mask>]]...]
[-i <allow local host>[/<mask>][,<allow client host>[/<mask>]]...]
[-I <deny local host>[/<mask>][,<deny local host>[/<mask>]]...]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m]
假设我们要创建“tim”这样一个虚拟用户,则可以使用如下命令:
# pure-pw useradd tim -u ftpuser -d /home/ftp/tim
其中:
-u 将虚拟用户 tim 同系统用户 ftpuser 关联在一起。
-d 参数使 tim 只能访问其 home 目录。而如果想让他访问整个文件系统,可以用 -D 选项。
执行完上述命令后,会提示输入密码,两次输入 tim 用户的密码即可。用户的口令会根据系统对加密方式的支持情况,选择一个最安全的方式进行加密。
然后需要建立“/home/ftp/tim”目录,并修改它的属性。
# mkdir /home/ftp
# mkdir /home/ftp/tim
注意:在配置文件中有选项自动建立主目录。
CreateHomeDir yes //设置为 yes 创建新虚拟用户时 pureftpd 自动创建用户的主目录。
但是有一点需要大家注意,就是它只支持二层目录的建立而不支持三层以上目录的建立。举个例子,如果我们创建虚拟用户是用如下语句:
# pure-pw useradd test -u ftpuser -d /home/ftp
而这时系统只有“/home”目录而没有“/home/ftp”目录,那么在 test 用户第一次登陆时 pureftpd 会创“/home/ftp”目录。
如果我们改变以上命令如下:
# pure-pw useradd test -u ftp -d /home/ftp/test
而这时系统只有“/home”目录或“/home/ftp”目录,而没有“/home/ftp/test”目录,那么我们登陆时会得到没有主目录的提示。
其他参数含义:
-z 选项运用用户在一天当中指定的时间段连接服务器。如 -z 0900-1800 ,则该用户只能在上午 9 点到晚上 6 点之间连接服务器。
-r 选项或 -R 选项,可以限制用户从指定 IP 和掩码连入服务器。如,单一的 IP/掩码对(-r 192.168.1.0/24)。多
个IP/掩码对用英文逗号隔开(-r 192.168.1.0/24,10.1.0.0/16,127.0.0.1/32)。
仅 IP (-r 192.168.1.4,10.1.1.5)。主机名(-r bla.bla.net,yopcitron.com)。或者以上形式的
任何组合。(-r,允许;-R拒绝)
-y ,用户同一时间的并发连接数。或者 0 意味着不限制。也就是同一 IP 的连接数。
-f ,默认虚拟用户的信息会被存放在“./etc/pureftpd.passwd”文件中,通过该选项可以改变该文件的位置。
默认的存储用户信息的文件存放在“./etc/pureftpd.passwd”,我用 ports 方式安装的 pureftpd ,其存放位置在“/usr/local/etc/pureftpd.passwd”。
我们看下这个文本文件的内容。
# cat /usr/local/etc/pureftpd.passwd
tim:$1$LX/3.F60$bYdYwsQOYIaWq.Ko.hfI3.:500:101::/home/ftp/tim/./:::::::::::::
密码是系统自己加密的。
2、更改用户。
与 pure-pw adduser 不同的是,使用 pure-pw usermod 不是创建一个用户,而是更改已存在用户的某些属性。
例如,我们给 joe 用户添加一个限额,限制 joe 用户最多拥有1000个文件,最大10 Megabytes 空间。命令如下:
# pure-pw usermod joe -n 1000 -N 10
重置某些属性的语法如下:
pure-pw usermod <user> -n '' :禁用文件配额
pure-pw usermod <user> -N '' :禁用文件大小配额
pure-pw usermod <user> -q '' -Q '' :禁用 ratio
pure-pw usermod <user> -t '' :禁用下载带宽限制
pure-pw usermod <user> -T '' :禁用上传带宽限制
pure-pw usermod <user> <-i,-I,-r or -R> '' :禁用 IP 过滤
pure-pw usermod <user> -z '' :禁用时间段约束
pure-pw usermod <user> -y '' :禁用并发数限制
3、删除用户。
删除一个用户的命令语法是:
# pure-pw userdel <login> [-f <passwd file>] [-m]
这时,用户的信息会被从指定的 passwd 文件中删除,但是用户的 home 目录会被保留,需要手工删除。
4、修改口令。
更改一个用户口令的语法是:
# pure-pw passwd <login> [-f <passwd file>] [-m]
5、显示用户信息。
“ ./etc/pureftpd.passwd” 文件中记录的信息不方便用户的阅读,因此 pure-ftpd 提供了显示用户信息的命令。其语法是:
# pure-pw show <login> [-f <passwd file>]
例如:
# pure-pw show joe
Login : joe
Password : $1$LX/3.F60$bYdYwsQOYIaWq.Ko.hfI3.
UID : 500 (ftpuser)
GID : 101 (ftpgroup)
Directory : /home/ftpusers/joe/./
Full name :
Download bandwidth : 0 Kb (unlimited)
Upload bandwidth : 0 Kb (unlimited)
Max files : 1000 (enabled)
Max size : 10 Mb (enabled)
Ratio : 0:0 (unlimited:unlimited)
Allowed local IPs :
Denied local IPs :
Allowed client IPs : 192.168.0.0/16
Denied client IPs : 192.168.1.1,blah.verybadhost.com
Time restrictions : 0900-1800 (enabled)
Max sim sessions : 0 (unlimited)
主目录后面的“/./”表示用户目录是被锁定的。
(三)、提交更改。
重要:
通过上面提到的命令,你可以创建、修改和删除虚拟用户,甚至可以手工方式编辑“/usr/local/etc/pureftpd.passwd”文件。但是,只有提交这些更改,pure-ftpd 访问才能生效。类似数据库中的事务处理。
提交更改,意味着系统会根据(或者指定的其它文件)来创建一个 pure-ftpd 可读的二进制格式的文件。 该二进制文件中的帐号是分类存储并索引优化了的,可以加快访问速度。
创建 PureDB 文件的命令如下:
# pure-pw mkdb
运行命令后,系统会在“/usr/local/etc/pureftpd.passwd”文件所在目录自动生成“/usr/local/etc/pureftpd.pdb”索引文件。
如果你想从你指定的 passwd 文本文件中生成PureDB 文件,用“-f”选项。
# pure-pw mkdb /etc/accounts/ftpusers.pdb -f /etc/accounts/ftpusers.txt
创建了 PureDB 文件(也就是提交)后,不必重启 pure-ftpd 服务,对虚拟用户进行的创建、修改和删除等操作立即生效。
同时,也可以通过“-m”选项,让“/usr/local/etc/pureftpd.passwd”文本文件在修改(如添加用户、修改密码、删除用户等等)后自动提交。命令格式如下:
# pure-pw passwd joe –m
这个命令将修改“/usr/local/etc/pureftpd.passwd”文本文件中的用户密码,并将更改提交给“/usr/local/etc/pureftpd.pdb”。
(四)更改配置文件让虚拟用户生效
将配置文件中的 PureDB 文件路径改为你的PureDB 文件路径。
# ee /usr/local/etc/pure-ftpd.conf
PureDB /usr/local/etc/pureftpd.pdb //Puredb路径
通过以上建立的用户,可上传,可下载,可删除,拥有全部权限。可以通过对目录的限制来达到对用户权限的限制,以后再讲解。
开启虚拟用户后,如果在配置文件中设置“UnixAuthentication no”,pureftpd就只支持虚拟用户登录,不支持系统真实
用户登录。如果设置“UnixAuthentication yes”,pureftpd只支持虚拟用户登录,同时支持系统真实用户登录。
6. 技巧
(一)将系统用户转换为虚拟用户。
你可以用“pure-pwconvert”命令,将系统(/etc/passwd)用户转换为虚拟用户。
命令如下:
# pure-pwconvert >> /usr/local/etc/pureftpd.passwd
如果你以非特权的系统用户身份运行该命令,密码栏将是空的。如果你以 root 用户身份运行该命令,所有特性都被复制过来,甚至是经过哈希函数加密的密码。
这个转换只会把有 shell 访问权的用户转换过来,shell 访问设置为 nologin 的将不被转换。
系统用户转化为虚拟用户的意义在于,同一个用户名可以用不同的密码访问 FTP 和 Telnet 。
(二)环境变量
默认的情况下,如果指定了环境变量 PURE_PASSWDFILE ,则虚拟用户的 passwd 文件位置由该变量的值指定。否则,默认是位
置是“/usr/local/etc/pureftpd.passwd”(Linux 中是“/etc/pureftpd.passwd”)。
同样,PURE_DBFILE 环境变量用来指定 pdb 文件的位置。默认是“/usr/local/etc/pureftpd.pdb”(Linux中“/etc/pureftpd.pdb”)。
这个地方讲的也不错:http://www.ha97.com/book/OpenSource_Guide/ch23s05.html