目录:
一、系统真实(shell)用户登录
二、puredb虚拟用户支持
三、技巧

 

------------------------------------------------------------------分 割 线-----------------------------------------------------------------

 

一、系统真实(shell)用户登录

默认配置文件允许匿名用户登录,同时允许系统真实用户登录。经过上面的步骤后(详情见我的前一篇文章《pureftpd基础:安装、配置、实现匿名登录》http://indian.blog.163.com/blog/static/1088158200891134536877/),系统用户是可以登录并且可以上传、下载、建目录和删除等。匿名用户(anonymous或ftp)可以登录但不能上传、下载、建目录。

如果要让 FTP 只支持系统真实用户登录,你只要稍微修改一下 pureftpd 的配置文件就可以了。

# ee /usr/local/etc/pure-ftpd.conf

ChrootEveryone yes

NoAnonymous yes

UnixAuthentication yes //用“/etc/passwd”中的用户认

只需以上三行就可以实现只允许系统真实用户登录 FTP 。系统真实用户会登陆到自己的系统主目录中,可下载,可上传,可删除,没有任何限制。但是由于有 chroot 的限制,所以无法去真实系统的其它目录而已。在实际应用中,这种用法并不多见,我也就不费篇幅介绍了。

 

 

 

二、puredb虚拟用户支持

1、建立 FTP 专用的系统用户。

自从 0.99.2 版本开始,pure-ftpd 就开始支持虚拟用户。

虚拟用户方式是一个简单的用户列表机制,类似于“/etc/passwd”,它将用户的相关信息,如口令、姓名、 uid、gid、主目录等,存入一个文本文件。但是该文本文件文件只适用于 FTP 。这意味着,你可以很容易地设置 FTP 虚拟帐号,而不需要在系统中添加系统用户,以免和系统用户混淆在一起。

同时,可以为这些虚拟用户单独设置配额、ratio、带宽等限制,这些功能是系统用户认证无法实现的。很多虚拟用户可以共享同一个系统用户的属性,因此建议为这些虚拟用户单独创建一个系统用户,从而方便管理。

Pureftpd 中的虚拟用户最后都映射到一个系统用户,这个对应的系统用户的访问权限就是这些虚拟用户的访问权限(关于访问权限见我的后续章节)。你可以使用系统已经存在的帐号,比如“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

系统帐号建立好后,我们就开始着手准备虚拟用户了。

 

 

2、建立虚拟用户。

使用 ”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)

主目录后面的“/./”表示用户目录是被锁定的。

 

 

3、提交更改。

重要:

通过上面提到的命令,你可以创建、修改和删除虚拟用户,甚至可以手工方式编辑“/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”。

 

 

4、更改配置文件让虚拟用户生效

将配置文件中的 PureDB 文件路径改为你的PureDB 文件路径。

# ee /usr/local/etc/pure-ftpd.conf

PureDB /usr/local/etc/pureftpd.pdb //Puredb路径

通过以上建立的用户,可上传,可下载,可删除,拥有全部权限。可以通过对目录的限制来达到对用户权限的限制。关于用户权限问题,在我的后续章节有讲解。

开启虚拟用户后,如果在配置文件中设置“UnixAuthentication no”,pureftpd就只支持虚拟用户登录,不支持系统真实用户登录。如果设置“UnixAuthentication yes”,pureftpd不仅支持虚拟用户登录,同时还支持系统真实用户登录。

 

 

 

三、技巧

1、将系统用户转换为虚拟用户。

你可以用“pure-pwconvert”命令,将系统(/etc/passwd)用户转换为虚拟用户。

命令如下:

# pure-pwconvert >> /usr/local/etc/pureftpd.passwd

如果你以非特权的系统用户身份运行该命令,密码栏将是空的。如果你以 root 用户身份运行该命令,所有特性都被复制过来,甚至是经过哈希函数加密的密码。

这个转换只会把有 shell 访问权的用户转换过来,shell 访问设置为 nologin 的将不被转换。

系统用户转化为虚拟用户的意义在于,同一个用户名可以用不同的密码访问 FTP 和 Telnet 。

 

 

2、环境变量

默认的情况下,如果指定了环境变量 PURE_PASSWDFILE ,则虚拟用户的 passwd 文件位置由该变量的值指定。否则,默认位置是“/usr/local/etc/pureftpd.passwd”(Linux 中是“/etc/pureftpd.passwd”)。

同样,PURE_DBFILE 环境变量用来指定 pdb 文件的位置。默认位置“/usr/local/etc/pureftpd.pdb”(Linux中“/etc/pureftpd.pdb”)。

 

 

 

附:useradd 语法规范

指令名称:useradd

功能介绍:useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

语法格式:useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号] 或 useradd -D [-b][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>]

常用参数说明:

-c <备注>  加上备注文字。备注文字会保存在passwd的备注栏位中。

-d <登入目录>  指定用户登入时的启始目录。

-D  变更预设值。

-e <有效期限>  指定帐号的有效期限。

-f <缓冲天数>  指定在密码过期后多少天即关闭该帐号。

-g <群组>  指定用户所属的群组。

-G <群组>  指定用户所属的附加群组。

-m  自动建立用户的登入目录。

-M  不要自动建立用户的登入目录。

-n  取消建立以用户名称为名的群组。

-r  建立系统帐号。

-s <shell>   指定用户登入后所使用的shell。

-u <uid>  指定用户ID。

 

 

pure-pw 语法:

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 ip>/<mask>] [-R <deny client ip>/<mask>]
   [-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
   [-y <max number of concurrent sessions>]
   [-z <hhmm>-<hhmm>] [-m]
pure-pw usermod <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 ip>/<mask>] [-R <deny client ip>/<mask>]
     [-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
     [-y <max number of concurrent sessions>]
     [-z <hhmm>-<hhmm>] [-m]
pure-pw userdel <login> [-f <passwd file>] [-m]
pure-pw passwd  <login> [-f <passwd file>] [-m]
pure-pw show    <login> [-f <passwd file>]
pure-pw mkdb    [<puredb database file> [-f <passwd file>]]
pure-pw list    [-f <passwd file>]
-d <home directory> : chroot user (recommended)
     -D <home directory> : don't chroot user
     -<option> '' : set this option to unlimited
     -m : also update the /usr/local/etc/pureftpd.pdb database
     For a 1:10 ratio, use -q 1 -Q 10
     To allow access only between 9 am and 6 pm, use -z 0900-1800