[原创]vsftpd的虚拟用户配置:PAM + PgSQL + FreeBSD-4

发表于:2007-06-09来源:作者:点击数: 标签:
vsftpd的虚拟用户配置:PAM+PgSQL+FreeBSD-4 (1.01beta,欢迎de bug ,本人也会随时更新) vsftpd可能是世界上最好的ftpd。它在 linux 世界非常流行, 安全 , 性能 高。 本文的目的是让PgSQL存储你的vsftp的虚拟用户和密码,通过一个叫做pam的东东来认证。 [

vsftpd的虚拟用户配置:PAM + PgSQL + FreeBSD-4
(1.01beta,欢迎debug,本人也会随时更新)
vsftpd可能是世界上最好的ftpd。它在linux世界非常流行,安全性能高。
本文的目的是让PgSQL存储你的vsftp的虚拟用户和密码,通过一个叫做pam的东东来认证。

[size=18:f65ab15ce4][b:f65ab15ce4]零、简述PAM原理。[/b:f65ab15ce4][/size:f65ab15ce4]
[i:f65ab15ce4]如果你已经对pam有所了解,请跳过,我知道的可能还不如你多。你不感兴趣也请跳过,因为不看这个也可配置。[/i:f65ab15ce4]
[code:1:f65ab15ce4]
用户 <-> vsftpd <-> PAM模块 <-> 用户和密码数据库
[/code:1:f65ab15ce4]
vsftpd用了一种很聪明同时也是unix/linux规范的方法来认证用户,就是PAM。大家对于PAM,也许有些陌生,但是一直在用。所谓PAM,英文是:Pluggable Authentication Modules,可拔插认证模块(不知道这样翻译对不对)。看见plug这个关键字,就知道是很灵活的。
现在几乎所有daemon程序一般都是用PAM来进行认证的,包括te.net/sshd/imapd,甚至你的login,都是用PAM。在fbsd 4上的朋友,你可以打ps -ax|grep pam,你会发现login了多少个控制台,就会有多少个写着pam的进程。

PAM的最大好处是灵活。它不管你的用户和密码用什么数据格式存储(数据库也好,通常用的密码文件也好),只要有相应的PAM模块就可以存储。比如说,大家不仅可以用vsftpd + PgSQL做用户登陆验证,只要你喜欢你还可以用MySQLOracle,LDAP数据库存储用户数据,只要有相应的PAM就可以。所有的daemon都可以用一个后台数据库来做用户验证登陆,包括telnet/sshd等等。

pam的配置机制在不同版本的freebsd上有差异。
freebsd-4放在/etc/pam.conf,一个文件记录所有pam服务。
freebsd-5放在/etc/pam.d,/usr/local/etc/pam.d。每个pam服务由一个独立的文件记录。

本文不打算详细叙述PAM的配置。PAM的配置不是很难,毕竟,只是要你配置一些参数,不是叫你开发一个pam模块出来。而且本文的篇幅所限,偶刚刚知道的一点东西希望能够起到抛砖引玉的作用。等偶对pam再玩得深入和熟一点的时候,再写一篇关于深入一点关于pam的东东?

[size=18:f65ab15ce4][b:f65ab15ce4]准备开始:提要[/b:f65ab15ce4][/size:f65ab15ce4]
简单讲讲要用到的配置文件的作用。
[quote:f65ab15ce4]
/etc/pam.conf                       #pam服务的配置
/etc/pam_pgsql.conf             #pam_pgsql.so的配置
/usr/local/etc/vsftpd.conf      #vsftpd的配置
[/quote:f65ab15ce4]

[size=18:f65ab15ce4][b:f65ab15ce4]一、安装vsftpd,PostgreSQL,pam_pgsql。[/b:f65ab15ce4][/size:f65ab15ce4]

[color=red:f65ab15ce4]我都是使用port来安装的,请大家用port/package来安装,不要自己下载源码来编译,否则可能根据本文的方法可能无法正常使用。其中vsftpd和pam-pgsql一定要用port/package来安装。[/color:f65ab15ce4]
以下是他们的port目录:
[quote:f65ab15ce4]
/usr/ports/ftp/vsftpd
/usr/ports/databases/postgresql7
/usr/ports/security/pam-pgsql
[/quote:f65ab15ce4]

安装:只要cd进去,然后make install就OK了。

[b:f65ab15ce4]二、PostgreSQL安装[color=red:f65ab15ce4](如果你已经有了PostgreSQL,不需要看这一节)[/color:f65ab15ce4][/b:f65ab15ce4]
简单提提用port来装PostgreSQL的过程,因为BSD版上的装PgSQL的方法都是自己下载源码编译的。我是用port来编译安装,因为这是fbsd推荐的安装方法,而且安装的软件会根据bsd的hier(目录结构)来安装,比较便于管理。
当用port来安装好PostgreSQL,默认的数据库管理用户是pgsql(port里头的安装程序自动添加的),其他系统默认的是postgres。初始化PostgreSQL的程序如下:
1、初始数据库。请先用root登陆或者su到root。然后,打命令:
[code:1:f65ab15ce4]
# su pgsql
# initdb
[/code:1:f65ab15ce4]
正常初始化的应该有以下提示:
[quote:f65ab15ce4]
This database system will be initialized with username "pgsql".
This user will own all the data files and must also own the server process.

Creating directory /usr/local/pgsql/data
Creating directory /usr/local/pgsql/data/base
Creating directory /usr/local/pgsql/data/global
Creating directory /usr/local/pgsql/data/pg_xlog
Creating template1 database in /usr/local/pgsql/data/base/1

[snip]

Success. You can now start the database server using:

    /usr/local/bin/postmaster -D /usr/local/pgsql/data
or
    /usr/local/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
[/quote:f65ab15ce4]

2、启动PostgreSQL
[code:1:f65ab15ce4]
# /usr/local/etc/rc.d/010.pgsql.sh start
[/code:1:f65ab15ce4]
更多详细的帮助,请看freebsddiary上面的一篇用port来安装PostgreSQL的文章,全英文。
http://www.freebsddiary.org/postgresql.php

[size=18:f65ab15ce4][b:f65ab15ce4]三、设定用户数据库。[/b:f65ab15ce4][/size:f65ab15ce4]
我是PgSQL的初学者,命令行用得不熟,因而要借助phpPgAdmin来管理数据库。
1、先创建一个数据库,叫做mydb。
2、建立一个数据表叫做ftp,用来存储用户名和帐号。这个数据表的结构是pam_pgsql模块规定的最简单的表了,每一个字段都是必须的,你可以扩展这个表的结构,但是不要删除这些字段。我导出了一个SQL脚本,方便大家创建。
[code:1:f65ab15ce4]
CREATE TABLE "ftp" (
 "ID"                int4 DEFAULT nextval('public."ftp_ID_seq"')  NOT NULL ,
 "usr"               varchar(32) NOT NULL ,
 "pass"              varchar(32) NOT NULL ,
 "expired"           bool DEFAULT false  NOT NULL ,
 "newtok"            bool DEFAULT false  NOT NULL 
);
[/code:1:f65ab15ce4]

请创建一些用户,方便调试:
这是我的ftp表,这些记录名字都是随便起的。但请注意只有expired为f(假)的可以成功登陆。
[code:1:f65ab15ce4]
 ID |   usr   |  pass   | expired | newtok
----+---------+---------+---------+--------
  1 | ftp     | ftp     | f       | f
  2 | ftp1    | ftp1    | t       | t
  4 | ftp3    | ftp3    | f       | f
  6 | go      | abcdef  | f       | f
  3 | ftp2    | ftp2    | f       | f
  5 | downftp | downftp | f       | f
[/code:1:f65ab15ce4]

3、创建一个pgsql用户叫做pamusr,密码也是pamusr。赋予pamusr对于ftp表的select权限,注意select就够了。pam_pgsql只是读数据表,而不是修改它。[color=red:f65ab15ce4]你也可以用其他用户,比如管理PgSQL的pgsql/postgres用户,但是从安全角度着想,建一个专门提供给pam_pgsql的弱权限的用户更好![/color:f65ab15ce4]

备注:
数据库,数据表,用户名都不必跟我一样,pam_pgsql没有规定,但是这些设定,必须跟pam_pgsql的配置文件/etc/pam_pgsql.conf的一致。

[size=18:f65ab15ce4][b:f65ab15ce4]四、设定pam_pgsql模块:编辑/etc/pam_pgsql.conf[/b:f65ab15ce4][/size:f65ab15ce4]
在/etc/pam.conf里头加上以上的几行,更多的资料参考/usr/local/share/doc/pam-pgsql/README
[code:1:f65ab15ce4]
#host = 127.0.0.1  这个不需要,默认是本地连接的。如果要连接远程服务器,请设置你的IP,并且去掉#
database = mydb
user = pamusr  #刚才添加的访问PgSQL的用户
password = pamusr #访问PgSQL的密码
table = ftp
user_column = usr   #用户名在数据表中的字段
pwd_column = pass   #用户密码在数据表中的字段
expired_column = expired  #用户是否已经过期的字段名
newtok_column = newtok    #用户是否需要修改密码的字段
[/code:1:f65ab15ce4]

[size=18:f65ab15ce4][b:f65ab15ce4]五、设置pam服务。[/b:f65ab15ce4][/size:f65ab15ce4]
[size=16:f65ab15ce4][color=blue:f65ab15ce4][b:f65ab15ce4]A、fbsd-4的配置[/b:f65ab15ce4][/color:f65ab15ce4][/size:f65ab15ce4]
在/etc/pam.conf,加入以下几项
[code:1:f65ab15ce4]
# service-name  module-type     control-flag    module-path  argument

vsftpd    auth          required        pam_pgsql.so  #
vsftpd   account        required        pam_pgsql.so #
vsftpd    password      required        pam_pgsql.so#
[/code:1:f65ab15ce4]
注意这里的service name为vsftpd,这不是必须的。前提是不要跟pam.conf已经有的service name冲突。vsftpd.conf中的pam_service_name一项要跟这里的service name对应。
[size=16:f65ab15ce4][color=blue:f65ab15ce4][b:f65ab15ce4]B、fbsd-5的配置[/b:f65ab15ce4][/color:f65ab15ce4][/size:f65ab15ce4]
在freebsd-5中的pam配置机制,跟freebsd-4有不同。你应该在/etc/pam.d或者/usr/local/etc/pam.d里头建立一个名位vsftpd的文件,内容跟上面的内容一样。
[color=red:f65ab15ce4]本人在fbsd 5-current上尝试过配置,但总不成功,无论是pam_pgsql还是pam_mysql,总是提示说找不到这些pam。google了一下,发现这个错误好像是fbsd 5-current的bug
http://unix.derkeiler.com/Mailing-Lists/FreeBSD/current/2003-07/0278.html
[/color:f65ab15ce4]

不过还是给出5-current的pam服务的配置方法,作为参考。
建立一个文件:/etc/pam.d/vsftpd。注意,该文件就是pam服务的名称
[code:1:f65ab15ce4]
auth          required        pam_pgsql.so  #
account        required        pam_pgsql.so #
password      required        pam_pgsql.so#
[/code:1:f65ab15ce4]

[size=18:f65ab15ce4][b:f65ab15ce4]六、配置vsftpd。这个是参考vsftpd虚拟用户设置1的官方文档进行配置的[/b:f65ab15ce4][/size:f65ab15ce4]
1、用adduser增加一个用户,名为virtual。

2、配置/usr/local/etc/vsftpd.conf
[code:1:f65ab15ce4]
anonymous_enable=NO
local_enable=YES
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
dual_log_enable=YES
guest_username=virtual   #我们刚才增加的本地用户,虚拟用户将会享有这个名为virtual本地用户的权限。
pam_service_name=[color=red]vsftpd[/color]  # 这个就是我在pam.conf里头设置的pam服务的名称,没有这一项,vsftpd是用名为ftp的pam服务。
listen=YES
secure_chroot_dir=/usr/local/share/vsftpd/empty   #请加上这一项,vsftpd默认的secure_chroot_dir是/usr/share/empty,用port安装的话,不会自动创建这个目录,而是放在/usr/local/share/vsftpd/empty。当然你也可以自己创建一个目录。
[/code:1:f65ab15ce4]  

[size=18:f65ab15ce4][b:f65ab15ce4]七、调试[/b:f65ab15ce4][/size:f65ab15ce4]
用standalone的方法来启动vsftpd,不要用inetd。
[code:1:f65ab15ce4]
/usr/local/libexec/vsftpd 
或者
/usr/local/libexec/vsftpd 配置文件名(如vsftpd.conf.1, vsftpd.conf.2)
一般他是搜索/usr/local/etc目录,如果你放在其他地方就要写上完整的路径。
[/code:1:f65ab15ce4]
如果没有没有出什么提示证明vsftpd启动成功。实践中,我常常出现的错误是没有用root来启动vsftpd,或者chroot路径不对。
下面ftp试试
[code:1:f65ab15ce4]
> ftp 192.168.1.10
Connected to 192.168.1.10.
220 (vsFTPd 1.2.0)
Name (192.168.1.10:powerplane): downftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
[/code:1:f65ab15ce4]
yeah,成功了。     

[size=18:f65ab15ce4][b:f65ab15ce4]总结[/b:f65ab15ce4][/size:f65ab15ce4]
想要配置vsftpd + 其他的PAM认证方法,本文都可做参考。当然,你可能会修改有关pam.conf的设置了。
freebsd的port里头除了有pam_pgsql的模块以外,还有pam_mysql,pam_ldap的。
一般都是放在/usr/ports/security

 powerplane 回复于:2003-08-16 00:58:53
相关资料:
1、freebsd的PAM的官方文档
http://www.freebsd.org/doc/en_US.ISO8859-1/articles/pam/index.html

2、freebsddiary上的一篇配置pgsql文章,适合新手。
http://www.freebsddiary.org/postgresql.php

3、pam-pgsql和vsftpd的README(用port装会在下面的目录,否则请在源码包里头找)
/usr/local/share/doc/pam-pgsql/README
/usr/local/share/doc/vsftpd/EXAMPLE/VIRTUAL_USERS/README
/usr/local/share/doc/vsftpd/EXAMPLE/VIRTUAL_USERS_2/README

 tahaomei 回复于:2003-08-16 09:18:18
好,顶一下,精华啊

 bb8848 回复于:2003-08-16 11:29:06
收藏

 lhyylf 回复于:2003-08-16 11:58:56
very 好!

 ★可乐∮ 回复于:2003-08-16 13:13:15
的确是蛮不错的一篇文章!
测试中……

 ★可乐∮ 回复于:2003-08-16 13:38:47
我现在的环境是FreeBSD4.8 Stable +mysql
我想现在可以通过pam_mysql来实现吗?

 babodx 回复于:2003-08-16 15:00:04
应该可以

 powerplane 回复于:2003-08-16 15:10:40
[quote:78af9c398e="★可乐∮"]我现在的环境是FreeBSD4.8 Stable +mysql
我想现在可以通过pam_mysql来实现吗?[/quote:78af9c398e]     
应该可以。
pam_mysql在freebsd的port里头有。
需要配置/etc/pam_mysql.conf
修改/etc/pam.conf

 tahaomei 回复于:2003-08-16 16:02:16
[quote:38226fb725="★可乐∮"]我现在的环境是FreeBSD4.8 Stable +mysql
我想现在可以通过pam_mysql来实现吗?[/quote:38226fb725]     


我也想这么做啊,不过在5.1下连个pam_mysql都编译不了,真麻烦

 idc 回复于:2003-08-16 16:49:14
我现在试一下

 黑夜编码人 回复于:2003-08-17 04:52:45
好文,收藏!
:D

 tahaomei 回复于:2003-08-19 23:44:40
[quote:33a372d37d="powerplane"]    
应该可以。
pam_mysql在freebsd的port里头有。
需要配置/etc/pam_mysql.conf
修改/etc/pam.conf[/quote:33a372d37d]     


我又试了,无论是在freebsd5.1上还是在freebsd4.8上,都无法验证用户密码。

似乎不可行,哪个高手指点一下

 phantasm 回复于:2003-12-05 14:40:40
我根据你的方法使用ports安装了
/usr/ports/ftp/vsftpd
/usr/ports/databases/postgresql7
/usr/ports/security/pam-pgsql
但是找不到/etc/pam_pgsql.conf 安装时也没有错误提示。

原文转自:http://www.ltesting.net