Debian+vsftpd+MySQL實現虛擬用戶zz的實現方法是本文我們主要要介紹的內容,接下來我們就開始一一介紹這一過程。
一、需求
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進行網站管理的帳號.
二、選擇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,選擇它應該沒錯的。
PS:FTP服務器軟件的選擇可以參考"鳥哥的Linux私房菜中的簡易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行內容。
注:YourPassword就是剛才在前面設定的ftpguest訪問數據庫的密碼.
代碼:
- 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的配置文件:
代碼:#nano /etc/vsftpd.conf
#指定不同用戶配置文件的存放路徑
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權限設置來達到控制不同用戶對目錄的訪問權限.不過試了一下,還是無法完美的實現以下的權限控制:
代碼: incoming pub
normal 讀/寫 只讀
admin 讀/寫 讀/寫舉例來說,可以通過把pub設置成只讀來控制normal用戶只讀pub的權限,不過admin對pub也是只讀了不過,還好,因為admin擁有修改目錄屬性的權限,如果admin用戶想要通過FTP來完成管理pub目錄的話,可以臨時把pub目錄修改成讀/寫屬性.
四、小結
1.vsftpd的目標是完成一個簡易而且安全性不低的FTPD,功能嘛,似乎還是有點不足,特別是目錄權限這方面的設置如果是對目錄權限有比較復雜的需求的話,可以考慮一下Proftpd .
2.在測試的時候,除了使用FTP Client工具以外,最好再使用Sniffer類的軟件作為輔助,因為有時候FTP Client並不會完全把FTPD返回信息呈現在你面前,而有時候,這些信息對排除FTPD故障會有很大幫助的,而一旦使用Sniffer類的軟件,所有的客戶端與服務器端交互的信息都不會漏掉的。
關於Debian+vsftpd+MySQL實現虛擬用戶zz的實現方法就介紹到這裡了,希望本次的介紹能夠對您有所收獲!