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

vsftpd的虚拟用户配置:PAM + PgSQL + FreeBSD-4 
(1.0beta,欢迎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的配置 


1、安装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了。 

2、PostgreSQL安装(若是你已经有了PostgreSQL,不须要看这一节) 
简单提提用port来装PostgreSQL的过程,由于BSD版上的装PgSQL的方法都是本身下载源码编译的。我是用port来编译安装,由于这是fbsd推荐的安装方法,并且安装的软件会根据bsd的hier(目录结构)来安装,比较便于管理。 
当用port来安装好PostgreSQL,默认的数据库管理用户是pgsql(port里头的安装程序自动添加的),其余系统默认的是postgres。初始化PostgreSQL的程序以下: 
一、初始数据库。请先用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 


二、启动PostgreSQL 
代码:

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

更多详细的帮助,请看freebsddiary上面的一篇用port来安装PostgreSQL的文章,全英文。 
http://www.freebsddiary.org/postgresql.php 

3、设定用户数据库。 
我是PgSQL的初学者,命令行用得不熟,于是要借助phpPgAdmin来管理数据库。 
一、先建立一个数据库,叫作mydb。 
二、创建一个数据表叫作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 


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

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

4、设定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    #用户是否须要修改密码的字段 


5、设置pam服务。在/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对应。 
关于freebsd-5的PAM的配置 
在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 


6、配置vsftpd。这个是参考vsftpd虚拟用户设置1的官方文档进行配置的 
一、用adduser增长一个用户,名为virtual。 

二、配置/usr/local/etc/vsftpd.conf 
代码:

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。固然你也能够本身建立一个目录。 


7、调试 
用standalone的方法来启动vsftpd,不要用inetd。 
代码:

/usr/local/libexec/vsftpd 
或者 
/usr/local/libexec/vsftpd 配置文件名(如vsftpd.conf.1, vsftpd.conf.2) 
通常他是搜索/usr/local/etc目录,若是你放在其余地方就要写上完整的路径。 

若是没有没有出什么提示证实vsftpd启动成功。实践中,我经常出现的错误是没有用root来启动vsftpd,或者chroot路径不对。 
下面ftp试试 
代码:

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

yeah,成功了。 

总结 
想要配置vsftpd + 其余的PAM认证方法,本文均可作参考。固然,你可能会修改有关pam.conf的设置了。  freebsd的port里头除了有pam_pgsql的模块之外,还有pam_mysql,pam_ldap的。  通常都是放在/usr/ports/security
相关文章
相关标签/搜索