Debian+vsftpd+MySQL實(shí)現(xiàn)虛擬用戶zz詳解
Debian+vsftpd+MySQL實(shí)現(xiàn)虛擬用戶zz的實(shí)現(xiàn)方法是本文我們主要要介紹的內(nèi)容,接下來(lái)我們就開(kāi)始一一介紹這一過(guò)程。
一、需求
1.虛擬用戶登錄
由于之前配置成功了postfix+MySQL虛擬用戶登錄,體會(huì)到了使用虛擬用戶的好處和靈活性,所以這次也考慮采用虛擬用戶,并且將FTP虛擬用戶的信息也存儲(chǔ)在MySQL中,這樣以后用PHP等寫(xiě)一些WEB GUI的管理程序,統(tǒng)一管理用戶,還是蠻方便的.
2.限制IP的匿名登錄
開(kāi)放匿名登錄,但是只允許特定的IP可以匿名登錄
3.不同用戶,不同目錄,不同權(quán)限
聽(tīng)起來(lái)有點(diǎn)像繞口令吧,舉例來(lái)說(shuō),有2個(gè)用戶,分別是普通用戶 (normal)和管理員(admin),FTP有2個(gè)目錄,分別是incoming和pub,要實(shí)現(xiàn)如下權(quán)限設(shè)置:
代碼: incoming pub
normal 讀/寫(xiě) 只讀
admin 讀/寫(xiě) 讀/寫(xiě)
4.通過(guò)FTP管理Web站點(diǎn)
服務(wù)器上還架設(shè)了Apache,而網(wǎng)站管理員對(duì)Linux又不是很熟悉,而且也不想開(kāi)放一個(gè)帳號(hào)給網(wǎng)站管理員,以免他登錄到系統(tǒng)上去,把系統(tǒng)搞的亂78糟,所以參考Internet上提供虛擬主機(jī)的流行做法,就是通過(guò)FTP來(lái)管理網(wǎng)站,所以需要提供一個(gè)可供網(wǎng)站管理員登錄FTP進(jìn)行網(wǎng)站管理的帳號(hào).
二、選擇FTP服務(wù)器軟件
Linux下架設(shè)FTP站點(diǎn),有很多優(yōu)秀的FTP服務(wù)器軟件可供選擇,例如Wu-FTPD,Pure-FTPD,ProFTPD以及vsFTPD等等, 要想選擇一個(gè)適合自己需求的FTP服務(wù)器軟件,也需要費(fèi)點(diǎn)腦筋才行,對(duì)于我來(lái)說(shuō),選擇 vsftpd(very secure FTP daemon),主要有以下兩點(diǎn)原因:
1.選擇原則一
有人說(shuō),哪個(gè)FTPD是你最熟悉的就用哪個(gè),不過(guò)由于我之前沒(méi)有在Linux下架設(shè)FTP站點(diǎn)的經(jīng)驗(yàn),所以,對(duì)我來(lái)說(shuō),一切都是新的起點(diǎn).在vsftpd的官方主頁(yè)上看到了Debian官方FTP,RH官方FTP等都使用了vsftpd。
2.選擇原則二
第二點(diǎn)很大程度取決于vsftpd(very secure FTP daemon)的名字,因?yàn)樗呛馨踩腇TP軟件嘛,哈哈,再說(shuō)Debian官方等FTP都使用了vsftpd,選擇它應(yīng)該沒(méi)錯(cuò)的。
PS:FTP服務(wù)器軟件的選擇可以參考"鳥(niǎo)哥的Linux私房菜中的簡(jiǎn)易vsftpd服務(wù)器架設(shè)"一文.
三、實(shí)現(xiàn)方法
基于Debian GNU/Linux 3.1 Sarge 和 vsftpd-2.0.3
1.需要的軟件包
1).vsftpd:very secure FTP daemon
2).mysql-server,mysql-client
前者是MySQL數(shù)據(jù)庫(kù)服務(wù)器,用于存儲(chǔ)虛擬用戶信息,后者提供一個(gè)命令行的MySQL Client. 由于我之前配置postfix時(shí),已經(jīng)安裝過(guò)了MySQL,所以我不必安裝這個(gè)包了^_^
3).libpam-mysql:vsftpd是通過(guò)PAM驗(yàn)證用戶信息的,這個(gè)包可以讓PAM去讀取MySQL完成驗(yàn)證.
2.安裝
以root登錄Debian,輸入以下命令:代碼:#apt-get install vsftpd,libpam-mysql。
3.創(chuàng)建一個(gè)必要的本地用戶
雖說(shuō)是虛擬用戶,不過(guò),由于虛擬用戶的信息存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)中,所以還是需要一個(gè)能夠讀取MySQL數(shù)據(jù)庫(kù)的本地用戶.
1),創(chuàng)建本地用戶的家目錄,此目錄也是FTP的家目錄:代碼:#mkdir /home/ftp
2),創(chuàng)建名為 ftpguest的本地用戶:代碼:#useradd ftpguest -d /home/ftp
3),修改FTP家目錄的所有者和組:代碼:#chown ftpguest.nogroup /home/ftp
4,配置MySQL數(shù)據(jù)庫(kù)
1),創(chuàng)建用于存儲(chǔ)虛擬用戶信息的數(shù)據(jù)庫(kù)ftpvuser:代碼:#mysqladmin -u root -p create ftpvuser
2),連接數(shù)據(jù)庫(kù):代碼:#mysql -u root -p
3)創(chuàng)建用于存儲(chǔ)虛擬用戶信息的表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數(shù)據(jù)庫(kù)的users表的內(nèi)容。注:YourPassword用于設(shè)定ftpguest訪問(wèn)數(shù)據(jù)庫(kù)的密碼.
代碼:
- 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驗(yàn)證
1),打開(kāi)PAM配置文件:代碼:#nano /etc/pam.d/vsftpd
2),將以前的內(nèi)容注釋掉,然后添加下面2行內(nèi)容。
注:YourPassword就是剛才在前面設(shè)定的ftpguest訪問(wèn)數(shù)據(jù)庫(kù)的密碼.
代碼:
- 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),打開(kāi)vsftpd的配置文件
代碼:#nano /etc/vsftpd.conf注意:一旦修改了/etc/vsftpd.conf文件的內(nèi)容,必須重啟vsftpd才能使新的設(shè)置生效,方法是:代碼:#/etc/init.d/vsftpd stop
#/etc/init.d/vsftpd start直接#/etc/init.d/vsftpd restart,好像不起作用?
2),修改vsftpd.conf文件如下:
代碼:#關(guān)閉匿名用戶訪問(wèn)
#anonymous_enable=YES
# 開(kāi)啟本地用戶訪問(wèn)
local_enable=YES
#開(kāi)啟虛擬用戶訪問(wèn)
guest_enable=YES
guest_username=ftpguest
#將本地用戶限制在自己的家目錄,這樣可避免FTP用戶訪問(wèn)到其他的系統(tǒng)目錄
chroot_local_user=YES
3),500 OOPS: cap_set_proc
趕快登錄FTP試一下吧,不過(guò)為什么無(wú)法登錄呢?服務(wù)器返回錯(cuò)誤:500 OOPS: cap_set_proc
Google之,這個(gè)錯(cuò)誤似乎與SELinux有關(guān),解決辦法是加載capability模塊:
代碼:#modprobe capability為了讓Linux在啟動(dòng)時(shí)自動(dòng)加載此模塊,把這個(gè)模塊放到/etc /modules中即可.
4),限制IP的匿名登錄
要想限制登錄vsftpd的客戶端的IP地址,要用到一個(gè)叫 TCP Wrappers的東東,對(duì)于TCP Wrappers,我的理解是,如果在vsftpd中啟用了TCP Wrappers的話,每次客戶端向vsftpd發(fā)起一個(gè)連接請(qǐng)求的時(shí)候,vsftpd首先會(huì)把這個(gè)連接請(qǐng)求交給TCP Wrappers處理,如果客戶端的IP被TCP Wrappers放行的話,才能繼續(xù)與vsftpd繼續(xù)會(huì)話,否則,直接就被拒絕服務(wù)了,不知道對(duì)不對(duì)?
a,修改/etc /vsftpd.conf
代碼:#啟用TCP Wrappers
tcp_wrappers=YES
b,修改/etc/hosts.deny
拒絕所有向vsftpd發(fā)起連接請(qǐng)求的IP,不過(guò),如果hosts.deny與 hosts.allow沖突的話,以hosts.allow優(yōu)先處理,這好像就是,先deny所有,然后在hosts.allow開(kāi)放特權(quán),呵呵
代碼:#拒絕所有連入vsftpd的IP先.
vsftpd: ALL
c,修改 /etc/hosts.allow
在這里開(kāi)放允許登錄vsftpd的IP地址關(guān)于VSFTPD_LOAD_CONF環(huán)境變量,vsftpd的man是這么說(shuō)的:
"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),為不同的用戶設(shè)置不同的訪問(wèn)權(quán)限
a,激活單個(gè)用戶配置功能,增加以下配置行到vsftpd的配置文件:
代碼:#nano /etc/vsftpd.conf
#指定不同用戶配置文件的存放路徑
user_config_dir=/etc/vsftpd/vsftpd_user_conf
b,普通用戶:下載/上傳
編輯/etc/vsftpd/vsftpd_user_conf/normal
注意:用戶的配置文件名與用戶名一致,不過(guò)匿名用戶的配置文件名為ftp,而不是anonymous
代碼:#mkdir /etc/vsftpd/vsftpd_user_conf
#nano /etc/vsftpd/vsftpd_user_conf/normal加入以下內(nèi)容:
#允許下載
代碼:anon_world_readable_only=NO
#允許寫(xiě)入,上傳以及建立目錄
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管理員除了擁有普通用戶的權(quán)限以外,還擁有刪除/重命名/改變文件屬性的權(quán)限
加入以下內(nèi)容:
代碼:#允許重命名和刪除文件
anon_other_write_enable=YES
#虛擬用戶擁有與本地用戶相同的權(quán)限(由于chmod僅僅對(duì)本地用戶有效,所以如果想要虛擬用戶擁有chmod的權(quán)限,這一項(xiàng)必須激活)
virtual_use_local_privs=YES
#允許修改文件屬性
chmod_enable=YES
d,網(wǎng)站管理員
代碼:#cp /etc/vsftpd/vsftpd_user_conf/admin /etc/vsftpd/vsftpd_user_conf/webmaster編輯webmaster的配置文件:
代碼:#nano /etc/vsftpd/vsftpd_user_conf/webmaster
加入以下內(nèi)容:
代碼:#將FTP家目錄指向網(wǎng)站的家目錄(我的www目錄使用Apache默認(rèn)的目錄)
local_root=/var/www
# 默認(rèn)情況下,上傳到FTP站點(diǎn)的文件的擁有者都是ftpguest,其他用戶是沒(méi)有訪問(wèn)權(quán)限的
#所以,當(dāng)訪問(wèn)網(wǎng)站的時(shí)候,會(huì)出現(xiàn)"沒(méi)有權(quán)限訪問(wèn)該文件的錯(cuò)誤",這是由于Apache的用戶
#www-data無(wú)法訪問(wèn)/var/www下的文件造成的,把umask設(shè)置成033甚至000即可解決這個(gè)問(wèn)題.
local_umask=033
e,為normal,admin用戶設(shè)置對(duì) incoming,pub目錄不同的權(quán)限
閱讀了一遍vsftpd man中關(guān)于權(quán)限的相關(guān)設(shè)置,似乎沒(méi)有單獨(dú)設(shè)置每個(gè)目錄權(quán)限的地方?后來(lái)想到是不是可以利用Linux文件系統(tǒng)的文件權(quán)限設(shè)置來(lái)達(dá)到此目的,以前在 Windows下利用IIS來(lái)架設(shè)站點(diǎn)時(shí),我就是利用NTFS權(quán)限設(shè)置來(lái)達(dá)到控制不同用戶對(duì)目錄的訪問(wèn)權(quán)限.不過(guò)試了一下,還是無(wú)法完美的實(shí)現(xiàn)以下的權(quán)限控制:
代碼: incoming pub
normal 讀/寫(xiě) 只讀
admin 讀/寫(xiě) 讀/寫(xiě)舉例來(lái)說(shuō),可以通過(guò)把pub設(shè)置成只讀來(lái)控制normal用戶只讀pub的權(quán)限,不過(guò)admin對(duì)pub也是只讀了不過(guò),還好,因?yàn)閍dmin擁有修改目錄屬性的權(quán)限,如果admin用戶想要通過(guò)FTP來(lái)完成管理pub目錄的話,可以臨時(shí)把pub目錄修改成讀/寫(xiě)屬性.
四、小結(jié)
1.vsftpd的目標(biāo)是完成一個(gè)簡(jiǎn)易而且安全性不低的FTPD,功能嘛,似乎還是有點(diǎn)不足,特別是目錄權(quán)限這方面的設(shè)置如果是對(duì)目錄權(quán)限有比較復(fù)雜的需求的話,可以考慮一下Proftpd .
2.在測(cè)試的時(shí)候,除了使用FTP Client工具以外,最好再使用Sniffer類(lèi)的軟件作為輔助,因?yàn)橛袝r(shí)候FTP Client并不會(huì)完全把FTPD返回信息呈現(xiàn)在你面前,而有時(shí)候,這些信息對(duì)排除FTPD故障會(huì)有很大幫助的,而一旦使用Sniffer類(lèi)的軟件,所有的客戶端與服務(wù)器端交互的信息都不會(huì)漏掉的。
關(guān)于Debian+vsftpd+MySQL實(shí)現(xiàn)虛擬用戶zz的實(shí)現(xiàn)方法就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】


2011-03-04 15:18:47




