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
相關文章
相關標籤/搜索