<a href="http://linux.vbird.org/linux_server/0410vsftpd.php#ftp_recommand">http://linux.vbird.org/linux_server/0410vsftpd.php#ftp_recommand</a>
前些天用vsftpd+mysql實作虛拟使用者登入,把偶的菜鳥筆記和大家分享一下,有什麼問題請指正
特别申明:本文不适合Linux老鳥們
HTML版本:http://guitarbug.googlepages.com/vsftpdmysql.html
-----------------------------
Debian+vsftpd+MySQL實作虛拟使用者
(posted by guitarbug @ 2006.6.12)
一,需求
1,虛拟使用者登入
由于之前配置成功了postfix+MySQL虛拟使用者登入,體會到了使用虛拟使用者的好處和靈活性,是以這次也考慮采用虛拟使用者,并且将FTP虛拟使用者的資訊也存儲在MySQL中,這樣以後用PHP等寫一些WEB GUI的管理程式,統一管理使用者,還是蠻友善的.
2,限制IP的匿名登入
開放匿名登入,但是隻允許特定的IP可以匿名登入
3,不同使用者,不同目錄,不同權限
聽起來有點像繞密碼吧,舉例來說,有2個使用者,分别是普通使用者(normal)和管理者(admin),FTP有2個目錄,分别是incoming和pub,要實作如下權限設定:
代碼:
incoming pub
normal 讀/寫 隻讀
admin 讀/寫 讀/寫
4,通過FTP管理Web站點
伺服器上還架設了Apache,而網站管理者對Linux又不是很熟悉,而且也不想開放一個帳号給網站管理者,以免他登入到系統上去,把系統搞的亂78糟,是以參考Internet上提供虛拟主機的流行做法,就是通過FTP來管理網站,是以需要提供一個可供網站管理者登入FTP進行網站管理的帳号.
5,擴充功能
待定..
二,選擇FTP伺服器軟體
Linux下架設FTP站點,有很多優秀的FTP伺服器軟體可供選擇,例如Wu-FTPD,Pure-FTPD,ProFTPD以及vsFTPD等等,要想選擇一個适合自己需求的FTP伺服器軟體,也需要費點腦筋才行,對于我來說,選擇 vsftpd(very secure FTP daemon),主要有以下兩點原因:
1,選擇原則一
有人說,哪個FTPD是你最熟悉的就用哪個,不過由于我之前沒有在Linux下架設FTP站點的經驗,是以,對我來說,一切都是新的起點.在vsftpd的官方首頁上看到了Debian官方FTP,RH官方FTP等都使用了vsftpd,于是"随波逐流"吧,這樣看起來會有面子些~
2,選擇原則二
第二點很大程度取決于vsftpd(very secure FTP daemon)的名字,因為它是很安全的FTP軟體嘛,哈哈,再說Debian官方等FTP都使用了vsftpd,選擇它應該沒錯的~
三,實作
基于Debian GNU/Linux 3.1 Sarge 和 vsftpd-2.0.3
1,需要的軟體包
1),vsftpd
very secure FTP daemon
2),mysql-server,mysql-client
前者是MySQL資料庫伺服器,用于存儲虛拟使用者資訊,後者提供一個指令行的MySQL Client. 由于我之前配置postfix時,已經安裝過了MySQL,是以我不必安裝這個包了^_^
3),libpam-mysql
vsftpd是通過PAM驗證使用者資訊的,這個包可以讓PAM去讀取MySQL完成驗證.
2,安裝
以root登入Debian,輸入以下指令,搞定~
#apt-get install vsftpd,libpam-mysql
3,建立一個必要的本地使用者
雖說是虛拟使用者,不過,由于虛拟使用者的資訊存儲在MySQL資料庫中,是以還是需要一個能夠讀取MySQL資料庫的本地使用者.
1),建立本地使用者的家目錄,此目錄也是FTP的家目錄
#mkdir /home/ftp
2),建立名為ftpguest的本地使用者
#useradd ftpguest -d /home/ftp
3),修改FTP家目錄的所有者群組
#chown ftpguest.nogroup /home/ftp
4,配置MySQL資料庫
1),建立用于存儲虛拟使用者資訊的資料庫ftpvuser
#mysqladmin -u root -p create ftpvuser
2),連接配接資料庫
#mysql -u root -p
3)建立用于存儲虛拟使用者資訊的表users
mysql>use ftpvuser;
mysql>CREATE TABLE users (username varchar(20) NOT NULL,password varchar(40) NOT NULL,PRIMARY KEY (username)) TYPE=MyISAM;
4)讓本地使用者ftpguest能讀取ftpvuser資料庫的users表的内容
注:YourPassword用于設定ftpguest通路資料庫的密碼.
mysql>grant select on ftpvuser.users to ftpguest@localhost identified by 'YourPassword';
mysql>flush privileges;
5),建立虛拟使用者
mysql>insert into users (username,password) values ('normal','555555');
mysql>insert into users (username,password) values ('admin','666666');
mysql>insert into users (username,password) values ('webmaster','777777');
6),完成MySQL的配置
mysql>quit;
5,配置vsftpd的PAM驗證
1),打開PAM配置檔案
#nano /etc/pam.d/vsftpd
2),将以前的内容注釋掉,然後添加下面2行内容
auth required pam_mysql.so user=ftpguest passwd=YourPassword host=localhost db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=0
account required pam_mysql.so user=ftpguest passwd=YourPassword host=localhost db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=0
6,配置vsftpd
1),打開vsftpd的配置檔案
#nano /etc/vsftpd.conf
注意:一旦修改了/etc/vsftpd.conf檔案的内容,必須重新開機vsftpd才能使新的設定生效,方法是:
#/etc/init.d/vsftpd stop
#/etc/init.d/vsftpd start
直接#/etc/init.d/vsftpd restart,好像不起作用?
2),修改vsftpd.conf檔案如下
#關閉匿名使用者通路
#anonymous_enable=YES
#開啟本地使用者通路
local_enable=YES
#開啟虛拟使用者通路
guest_enable=YES
guest_username=ftpguest
#将本地使用者限制在自己的家目錄,這樣可避免FTP使用者通路到其他的系統目錄
chroot_local_user=YES
3),500 OOPS: cap_set_proc
趕快登入FTP試一下吧,不過為什麼無法登入呢?伺服器傳回錯誤:500 OOPS: cap_set_proc
Google之,這個錯誤似乎與SELinux有關,解決辦法是加載capability子產品:
#modprobe capability
為了讓Linux在啟動時自動加載此子產品,把這個子產品放到/etc/modules中即可.
4),限制IP的匿名登入
要想限制登入vsftpd的用戶端的IP位址,要用到一個叫TCP Wrappers的東東,對于TCP Wrappers,我的了解是,如果在vsftpd中啟用了TCP Wrappers的話,每次用戶端向vsftpd發起一個連接配接請求的時候,vsftpd首先會把這個連接配接請求交給TCP Wrappers處理,如果用戶端的IP被TCP Wrappers放行的話,才能繼續與vsftpd繼續會話,否則,直接就被拒絕服務了,不知道對不對?
a,修改/etc/vsftpd.conf
#啟用TCP Wrappers
tcp_wrappers=YES
b,修改/etc/hosts.deny
拒絕所有向vsftpd發起連接配接請求的IP,不過,如果hosts.deny與hosts.allow沖突的話,以hosts.allow優先處理,這好像就是,先deny所有,然後在hosts.allow開放特權,呵呵
#拒絕所有連入vsftpd的IP先.
vsftpd: ALL
c,修改/etc/hosts.allow
在這裡開放允許登入vsftpd的IP位址關于VSFTPD_LOAD_CONF環境變量,vsftpd的man是這麼說的:
"If tcp_wrappers sets the VSFTPD_LOAD_CONF environment variable, then the vsftpd session will try and load the vsftpd configuration file specified in this variable. "
#限制可以匿名登入vsftpd的IP位址
vsftpd: 192.168.0.,210.83.200.200 : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpd.anonymous
#允許vsftpd的虛拟使用者以任何IP連接配接FTP
vsftpd: ALL : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpd.virtual
d,修改/etc/vsftpd/vsftpd.anonymous
#mkdir /etc/vsftpd/
#nano /etc/vsftpd/vsftpd.anonymous
#允許匿名登入
anonymous_enable=YES
e,修改/etc/vsftpd/vsftpd.virtual
#nano /etc/vsftpd/vsftpd.virtual
#不允許匿名登入
anonymous_enable=NO
5),為不同的使用者設定不同的通路權限
a,激活單個使用者配置功能,增加以下配置行到vsftpd的配置檔案:
#指定不同使用者配置檔案的存放路徑
user_config_dir=/etc/vsftpd/vsftpd_user_conf
b,普通使用者:下載下傳/上傳
編輯/etc/vsftpd/vsftpd_user_conf/normal
注意:使用者的配置檔案名與使用者名一緻,不過匿名使用者的配置檔案名為ftp,而不是anonymous
#mkdir /etc/vsftpd/vsftpd_user_conf
#nano /etc/vsftpd/vsftpd_user_conf/normal
加入以下内容:
#允許下載下傳
anon_world_readable_only=NO
#允許寫入,上傳以及建立目錄
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
c,管理者使用者:下載下傳/上傳/删除等.
#cp /etc/vsftpd/vsftpd_user_conf/normal /etc/vsftpd/vsftpd_user_conf/admin
編輯admin的配置檔案:
#nano /etc/vsftpd/vsftpd_user_conf/admin
管理者除了擁有普通使用者的權限以外,還擁有删除/重命名/改變檔案屬性的權限
#允許重命名和删除檔案
anon_other_write_enable=YES
#虛拟使用者擁有與本地使用者相同的權限(由于chmod僅僅對本地使用者有效,是以如果想要虛拟使用者擁有chmod的權限,這一項必須激活)
virtual_use_local_privs=YES
#允許修改檔案屬性
chmod_enable=YES
d,網站管理者
#cp /etc/vsftpd/vsftpd_user_conf/admin /etc/vsftpd/vsftpd_user_conf/webmaster
編輯webmaster的配置檔案:
#nano /etc/vsftpd/vsftpd_user_conf/webmaster
#将FTP家目錄指向網站的家目錄(我的www目錄使用Apache預設的目錄)
local_root=/var/www
#預設情況下,上傳到FTP站點的檔案的擁有者都是ftpguest,其他使用者是沒有通路權限的
#是以,當通路網站的時候,會出現"沒有權限通路該檔案的錯誤",這是由于Apache的使用者
#www-data無法通路/var/www下的檔案造成的,把umask設定成033甚至000即可解決這個問題.
local_umask=033
e,為normal,admin使用者設定對incoming,pub目錄不同的權限
閱讀了一遍vsftpd man中關于權限的相關設定,似乎沒有單獨設定每個目錄權限的地方?後來想到是不是可以利用Linux檔案系統的檔案權限設定來達到此目的,以前在Windows下利用IIS來架設站點時,我就是利用NTFS權限設定來達到控制不同使用者對目錄的通路權限.不過試了一下,還是無法完美的實作以下的權限控制:
舉例來說,可以通過把pub設定成隻讀來控制normal使用者隻讀pub的權限,不過admin對pub也是隻讀了不過,還好,因為admin擁有修改目錄屬性的權限,如果admin使用者想要通過FTP來完成管理pub目錄的話,可以臨時把pub目錄修改成讀/寫屬性.
四,小結
1,vsftpd的目标是完成一個簡易而且安全性不低的FTPD,功能嘛,似乎還是有點不足,特别是目錄權限這方面的設定如果是對目錄權限有比較複雜的需求的話,可以考慮一下Proftpd .
2,在測試的時候,除了使用FTP Client工具以外,最好再使用Sniffer類的軟體作為輔助,因為有時候FTP Client并不會完全把FTPD傳回資訊呈現在你面前,而有時候,這些資訊對排除FTPD故障會有很大幫助的,而一旦使用Sniffer類的軟體,所有的用戶端與伺服器端互動的資訊都不會漏掉的.
五,參考
1,Manpage of VSFTPD.CONF:
<a href="http://vsftpd.beasts.org/vsftpd_conf.html">http://vsftpd.beasts.org/vsftpd_conf.html</a>
2,vsftp配置大全:
<a href="http://bbs.chinaunix.net/viewthread.php?tid=561183">http://bbs.chinaunix.net/viewthread.php?tid=561183</a>