vsftpd如何配置虛擬用戶:PAM + PgSQL + FreeBSD-4

vsftpd的虛擬用戶配置:PAM + PgSQL + FreeBSD-4
(1.0beta,歡迎debug,本人也會隨時更新)
vsftpd可能是世界上最好的ftpd。它在linux世界非常流行,安全,性能高。
本文的目的是讓PgSQL存儲你的vsftp的虛擬用戶和密碼,通過一個叫做pam的東東來認證。
零、簡述PAM原理。
如果你已經(jīng)對pam有所了解,請?zhí)^,我知道的可能還不如你多。你不感興趣也請?zhí)^,因為不看這個也可配置。
代碼:
用戶 <-> vsftpd <-> PAM模塊 <-> 用戶和密碼數(shù)據(jù)庫
vsftpd用了一種很聰明同時也是unix/linux規(guī)范的方法來認證用戶,就是PAM。大家對于PAM,也許有些陌生,但是一直在用。所謂PAM,英文是:Pluggable Authentication Modules,可拔插認證模塊(不知道這樣翻譯對不對)??匆妏lug這個關(guān)鍵字,就知道是很靈活的。
現(xiàn)在幾乎所有daemon程序一般都是用PAM來進行認證的,包括telnet/sshd/imapd,甚至你的login,都是用PAM。在 fbsd 4上的朋友,你可以打ps -ax|grep pam,你會發(fā)現(xiàn)login了多少個控制臺,就會有多少個寫著pam的進程。
PAM的最大好處是靈活。它不管你的用戶和密碼用什么數(shù)據(jù)格式存儲(數(shù)據(jù)庫也好,通常用的密碼文件也好),只要有相應(yīng)的PAM模塊就可以存儲。比如說,大家不僅可以用vsftpd + PgSQL做用戶登陸驗證,只要你喜歡你還可以用MySQL,Oracle,LDAP數(shù)據(jù)庫存儲用戶數(shù)據(jù),只要有相應(yīng)的PAM就可以。所有的daemon 都可以用一個后臺數(shù)據(jù)庫來做用戶驗證登陸,包括telnet/sshd等等。
pam的配置機制在不同版本的freebsd上有差異。
freebsd-4放在/etc/pam.conf,一個文件記錄所有pam服務(wù)。
freebsd-5放在/etc/pam.d,/usr/local/etc/pam.d。每個pam服務(wù)由一個的文件記錄。
本文不打算詳細敘述PAM的配置。PAM的配置不是很難,畢竟,只是要你配置一些參數(shù),不是叫你開發(fā)一個pam模塊出來。而且本文的篇幅所限,偶剛剛知道的一點東西希望能夠起到拋磚引玉的作用。等偶對pam再玩得深入和熟一點的時候,再寫一篇關(guān)于深入一點關(guān)于pam的東東?
準備開始:提要
簡單講講要用到的配置文件的作用。
引用:
/etc/pam.conf #pam服務(wù)的配置
/etc/pam_pgsql.conf #pam_pgsql.so的配置
/usr/local/etc/vsftpd.conf #vsftpd的配置
一、安裝vsftpd,PostgreSQL,pam_pgsql。
我都是使用port來安裝的,請大家用port/package來安裝,不要自己下載源碼來編譯,否則可能根據(jù)本文的方法可能無法正常使用。其中vsftpd和pam-pgsql一定要用port/package來安裝。
以下是他們的port目錄:
引用:
/usr/ports/ftp/vsftpd
/usr/ports/databases/postgresql7
/usr/ports/security/pam-pgsql
安裝:只要cd進去,然后make install就OK了。
二、PostgreSQL安裝(如果你已經(jīng)有了PostgreSQL,不需要看這一節(jié))
簡單提提用port來裝PostgreSQL的過程,因為BSD版上的裝PgSQL的方法都是自己下載源碼編譯的。我是用port來編譯安裝,因為這是fbsd推薦的安裝方法,而且安裝的軟件會根據(jù)bsd的hier(目錄結(jié)構(gòu))來安裝,比較便于管理。
當用port來安裝好PostgreSQL,默認的數(shù)據(jù)庫管理用戶是pgsql(port里頭的安裝程序自動添加的),其他系統(tǒng)默認的是postgres。初始化PostgreSQL的程序如下:
1、初始數(shù)據(jù)庫。請先用root登陸或者su到root。然后,打命令:
代碼:
# su pgsql
# initdb
正常初始化的應(yīng)該有以下提示:
引用:
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
三、設(shè)定用戶數(shù)據(jù)庫。
我是PgSQL的初學(xué)者,命令行用得不熟,因而要借助phpPgAdmin來管理數(shù)據(jù)庫。
1、先創(chuàng)建一個數(shù)據(jù)庫,叫做mydb。
2、建立一個數(shù)據(jù)表叫做ftp,用來存儲用戶名和帳號。這個數(shù)據(jù)表的結(jié)構(gòu)是pam_pgsql模塊規(guī)定的最簡單的表了,每一個字段都是必須的,你可以擴展這個表的結(jié)構(gòu),但是不要刪除這些字段。我導(dǎo)出了一個SQL腳本,方便大家創(chuàng)建。
代碼:
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
);
請創(chuàng)建一些用戶,方便調(diào)試:
這是我的ftp表,這些記錄名字都是隨便起的。但請注意只有expired為f(假)的可以成功登陸。
代碼:
ID | usr | pass | expired | newtok #p#分頁標題#e#
----+---------+---------+---------+--------
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、創(chuàng)建一個pgsql用戶叫做pamusr,密碼也是pamusr。賦予pamusr對于ftp表的select權(quán)限,注意select就夠了。pam_pgsql只是讀數(shù)據(jù)表,而不是修改它。你也可以用其他用戶,比如管理PgSQL的pgsql/postgres用戶,但是從安全角度著想,建一個專門提供給pam_pgsql的弱權(quán)限的用戶更好!
備注:
數(shù)據(jù)庫,數(shù)據(jù)表,用戶名都不必跟我一樣,pam_pgsql沒有規(guī)定,但是這些設(shè)定,必須跟pam_pgsql的配置文件/etc/pam_pgsql.conf的一致。
四、設(shè)定pam_pgsql模塊:編輯/etc/pam_pgsql.conf
在/etc/pam.conf里頭加上以上的幾行,更多的資料參考/usr/local/share/doc/pam-pgsql/README
代碼:
#host = 127.0.0.1 這個不需要,默認是本地連接的。如果要連接遠程服務(wù)器,請設(shè)置你的IP,并且去掉#
database = mydb
user = pamusr #剛才添加的訪問PgSQL的用戶
password = pamusr #訪問PgSQL的密碼
table = ftp
user_column = usr #用戶名在數(shù)據(jù)表中的字段
pwd_column = pass #用戶密碼在數(shù)據(jù)表中的字段
expired_column = expired #用戶是否已經(jīng)過期的字段名
newtok_column = newtok #用戶是否需要修改密碼的字段
五、設(shè)置pam服務(wù)。在/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已經(jīng)有的service name沖突。vsftpd.conf中的pam_service_name一項要跟這里的service name對應(yīng)。
關(guān)于freebsd-5的PAM的配置
在freebsd-5中的pam配置機制,跟freebsd-4有不同。你應(yīng)該在/etc/pam.d或者/usr/local/etc/pam.d里頭建立一個名位vsftpd的文件,內(nèi)容跟上面的內(nèi)容一樣。本人在fbsd 5-current上嘗試過配置,但總不成功,無論是pam_pgsql還是pam_mysql,總是提示說找不到這些pam。google了一下,發(fā)現(xiàn)這個錯誤好像是fbsd 5-current的bug
http://unix.derkeiler.com/Mailing-Lists/FreeBSD/current/2003-07/0278.html
六、配置vsftpd。這個是參考vsftpd虛擬用戶設(shè)置1的官方文檔進行配置的
1、用adduser增加一個用戶,名為virtual。
2、配置/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本地用戶的權(quán)限。
pam_service_name=[color=red]vsftpd[/color] # 這個就是我在pam.conf里頭設(shè)置的pam服務(wù)的名稱,沒有這一項,vsftpd是用名為ftp的pam服務(wù)。
listen=YES
secure_chroot_dir=/usr/local/share/vsftpd/empty #請加上這一項,vsftpd默認的secure_chroot_dir是/usr/share/empty,用port安裝的話,不會自動創(chuàng)建這個目錄,而是放在/usr/local/share/vsftpd/empty。當然你也可以自己創(chuàng)建一個目錄。
七、調(diào)試
用standalone的方法來啟動vsftpd,不要用inetd。
代碼:
/usr/local/libexec/vsftpd
或者
/usr/local/libexec/vsftpd 配置文件名(如vsftpd.conf.1, vsftpd.conf.2)
一般他是搜索/usr/local/etc目錄,如果你放在其他地方就要寫上完整的路徑。
如果沒有沒有出什么提示證明vsftpd啟動成功。實踐中,我常常出現(xiàn)的錯誤是沒有用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,成功了。
總結(jié)
想要配置vsftpd + 其他的PAM認證方法,本文都可做參考。當然,你可能會修改有關(guān)pam.conf的設(shè)置了。
freebsd的port里頭除了有pam_pgsql的模塊以外,還有pam_mysql,pam_ldap的。
一般都是放在/usr/ports/security
相關(guān)文章
Fedora Linux 42 穩(wěn)定版發(fā)布: 帶來大量新功能和軟件更新
Fedora 42昨日發(fā)布,這是 Red Hat 贊助開發(fā)的杰出前沿 Linux 發(fā)行版的最新版,包含大量新功能和軟件更新,使其成為 2025 年上半年發(fā)布的一款出色的 Linux 操作系統(tǒng)之一,內(nèi)2025-04-16如何在Linux查看硬盤信息? 查看Linux硬盤大小類型和硬件信息的5種方法
使用Linux系統(tǒng)的過程中,查看和了解硬盤信息是非常重要的工作,尤其是對于系統(tǒng)管理員而言,那么在Linux系統(tǒng)中如何查看硬盤信息?以下是具體內(nèi)容介紹2025-03-12如何在 Linux 中查看 CPU 詳細信息? 3招輕松查看CPU型號、核心數(shù)和溫度
在日常運維工作中,獲取 CPU 信息是系統(tǒng)運維管理員常見的工作內(nèi)容,無論是為了性能調(diào)優(yōu)、硬件升級還是僅僅滿足好奇心2025-03-11什么是 Arch Linux? 獨樹一幟的Arch Linux發(fā)行版分析
Arch Linux是為簡化,優(yōu)化,現(xiàn)代化,實用主義,用戶中心和多功能性而創(chuàng)建Linux發(fā)行版,究竟是什么讓 Arch 與眾不同?下面我們就來簡要解讀2025-02-19如何在Linux環(huán)境下制作 Win11裝機U盤?
一直用的linux辦公,想要將筆記本電腦從 Linux 系統(tǒng)切換回 Windows 11,我們可以制作一個win11裝機u盤,詳細如下2025-02-17Rsnapshot怎么用? 基于Rsync的強大Linux備份工具使用指南
Rsnapshot 不僅可以備份本地文件,還能通過 SSH 備份遠程文件,接下來詳細介紹如何安裝、配置和使用 Rsnapshot,包括創(chuàng)建每小時、每天、每周和每月的本地備份,以及如何進2025-02-06Linux Kernel 6.13發(fā)布:附更新內(nèi)容及新特性解讀
Linux 內(nèi)核 6.13 正式發(fā)布,新版本引入了惰性搶占支持,簡化內(nèi)核搶占邏輯,通過減少與調(diào)度器相關(guān)的調(diào)用次數(shù),讓內(nèi)核在運行時表現(xiàn)更優(yōu),從而提高效率2025-01-23五大特性引領(lǐng)創(chuàng)新! 深度操作系統(tǒng) deepin 25 Preview預(yù)覽版發(fā)布
今日,深度操作系統(tǒng)正式推出deepin 25 Preview版本,該版本集成了五大核心特性:磐石系統(tǒng)、全新DDE、Treeland窗口合成器、AI For OS以及Distrobox子系統(tǒng)2025-01-18Linux Mint Xia 22.1重磅發(fā)布: 重要更新一覽
Beta 版 Linux Mint“Xia” 22.1 發(fā)布,新版本基于 Ubuntu 24.04,內(nèi)核版本為 Linux 6.8,這次更新帶來了諸多優(yōu)化和改進,進一步鞏固了 Mint 在 Linux 桌面操作系統(tǒng)領(lǐng)域的2025-01-16LinuxMint怎么安裝? Linux Mint22下載安裝圖文教程
Linux Mint22發(fā)布以后,有很多新功能,很多朋友想要下載并安裝,該怎么操作呢?下面我們就來看看詳細安裝指南2025-01-16