当前位置:操作系统 > Unix/Linux >>

vsftpd的虚拟用户配置:PAM+PgSQL+FreeBSD-4

(1.01beta,欢迎debug,本人也会随时更新)

  vsftpd可能是世界上最好的ftpd。它在linux世界非常流行,安全,性能高。

  本文的目的是让PgSQL存储你的vsftp的虚拟用户和密码,通过一个叫做pam的东东来认证。

  零、简述PAM原理。

  如果你已经对pam有所了解,请跳过,我知道的可能还不如你多。你不感兴趣也请跳过,因为不看这个也可配置。

  代码:

  用户 <-> vsftpd <-> PAM模块 <-> 用户和密码数据库

  vsftpd用了一种很聪明同时也是unix/linux规范的方法来认证用户,就是PAM。大家对于PAM,也许有些陌生,但是一直在用。所谓PAM,英文是:Pluggable Authentication Modules,可拔插认证模块(不知道这样翻译对不对)。看见plug这个关键字,就知道是很灵活的。

  现在几乎所有daemon程序一般都是用PAM来进行认证的,包括telnet/sshd/imapd,甚至你的login,都是用PAM。在 fbsd 4上的朋友,你可以打ps -ax|grep pam,你会发现login了多少个控制台,就会有多少个写着pam的进程。

  PAM的最大好处是灵活。它不管你的用户和密码用什么数据格式存储(数据库也好,通常用的密码文件也好),只要有相应的PAM模块就可以存储。比如说,大家不仅可以用vsftpd + PgSQL做用户登陆验证,只要你喜欢你还可以用MySQL,Oracle,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的东东?

  准备开始:提要

  简单讲讲要用到的配置文件的作用。

  引用:

  /etc/pam.conf #pam服务的配置

  /etc/pam_pgsql.conf #pam_pgsql.so的配置

  /usr/local/etc/vsftpd.conf #vsftpd的配置

  一、安装vsftpd,PostgreSQL,pam_pgsql。

  我都是使用port来安装的,请大家用port/package来安装,不要自己下载源码来编译,否则可能根据本文的方法可能无法正常使用。其中vsftpd和pam-pgsql一定要用port/package来安装。

  以下是他们的port目录:

  引用:

  /usr/ports/ftp/vsftpd

  /usr/ports/databases/postgresql7

  /usr/ports/security/pam-pgsql

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

  二、PostgreSQL安装(如果你已经有了PostgreSQL,不需要看这一节)

  简单提提用port来装PostgreSQL的过程,因为BSD版上的装PgSQL的方法都是自己下载源码编译的。我是用port来编译安装,因为这是fbsd推荐的安装方法,而且安装的软件会根据bsd的hier(目录结构)来安装,比较便于管理。

  当用port来安装好PostgreSQL,默认的数据库管理用户是pgsql(port里头的安装程序自动添加的),其他系统默认的是postgres。初始化PostgreSQL的程序如下:

  1、初始数据库。请先用root登陆或者su到root。然后,打命令:

  代码:

  # su pgsql

  # initdb

  正常初始化的应该有以下提示:

  引用:

  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

  2、启动PostgreSQL

  代码:

  # /usr/local/etc/rc.d/010.pgsql.sh start

  更多详细的帮助,请看freebsddiary上面的一篇用port来安装PostgreSQL的文章,全英文。

  http://www.freebsddiary.org/postgresql.php

  三、设定用户数据库。

  我是PgSQL的初学者,命令行用得不熟,因而要借助phpPgAdmin来管理数据库。

  1、先创建一个数据库,叫做mydb。

  2、建立一个数据表叫做ftp,用来存储用户名和帐号。这个数据表的结构是pam_pgsql模块规定的最简单的表了,每一个字段都是必须的,你可以扩展这个表的结构,但是不要删除这些字段。我导出了一个SQL脚本,方便大家创建。

  代码:

  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

  );

  请创建一些用户,方便调试:

  这是我的ftp表,这些记录名字都是随便起的。但请注意只有expired为f(假)的可以成功登陆。

  代码:

  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

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

  备注:

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

  四、设定pam_pgsql模块:编辑/etc/pam_pgsql.conf

  在/etc/pam.conf里头加上以上的几行,更多的资料参考/usr/local/share/doc/pam-pgsql/README

  代码:

  #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 #用户是否需要修改密码的字段

  五、设置pam服务。

  A、fbsd-4的配置

  在/etc/pam.conf,加入以下几项

  代码:

  # 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#

  注意这里的service name为vsftpd,这不是必须的。前提是不要跟pam.conf已经有的service name冲突。vsftpd.conf中的pam_service_name一项要跟这里的service name对应。

  B、fbsd-5的配置

  在freebsd-5中的pam配置机制,跟freebsd-4有不同。你应该在/etc/pam.d或者/usr/local/etc/pam.d里头建立一个名位vsftpd的文件,内容跟上面的内容一样。

  本人在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

  不过还是给出5-current的pam服务的配置方法,作为参考。

  建立一个文件:/etc/pam.d/vsftpd。注意,该文件就是pam服务的名称

  代码:

  auth required pam_pgsql.so #

  account
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,