<一>.理論篇
注:筆者還是在這里嘮叨一句:理論很枯燥、很無(wú)趣,對(duì)以后要從事運(yùn)維管理工作的人員來(lái)說(shuō),理論知識(shí)是必須掌握的,所以筆者希望博友能夠認(rèn)真閱讀FTP的相關(guān)理論,這樣在后續(xù)的服務(wù)構(gòu)建篇當(dāng)中,才會(huì)更容易理解并掌握每步操作的真實(shí)意義!
1. FTP服務(wù)器的相關(guān)概念:
FTP簡(jiǎn)稱文件傳輸協(xié)議,全稱(File Transfer Protocol),FTP服務(wù)在互聯(lián)網(wǎng)上任意兩臺(tái)計(jì)算機(jī)之間提供文件傳輸服務(wù)。無(wú)論是客戶端(Client)、服務(wù)器(Server)還是Linux、Windows等操作系統(tǒng),只要支持FTP協(xié)議,就可以使用FTP服務(wù)來(lái)提供文件傳輸?shù)裙δ堋H缃馞TP已被Ineternet 3/1 廣大用戶所使用的重要互聯(lián)網(wǎng)服務(wù)之一。
FTP(文件傳輸協(xié)議)是TCP/IP協(xié)議的一種具體應(yīng)用,它工作在OSI(Open System Interconnection)七層模型的第七層(應(yīng)用層),TCP/IP模型的第四層。
FTP服務(wù)使用TCP傳輸,所以在使用FTP服務(wù)時(shí),F(xiàn)TP客戶端和服務(wù)器之間要建立連接,這個(gè)連接也就是我們熟悉的“三次握手”,之所以建立三次連接,是為了證明客戶端和服務(wù)端之間的連接是可靠的、安全的、面向連接的,為數(shù)據(jù)的傳輸提供了可靠、安全的保障。
2. FTP服務(wù)器的功能:
FTP服務(wù)主要提供下載數(shù)據(jù)、上傳數(shù)據(jù),并且可以將遠(yuǎn)程的文件復(fù)制到本地計(jì)算機(jī),以達(dá)到資源共享和傳遞信息的目的,F(xiàn)TP在傳輸文件時(shí)還支持?jǐn)帱c(diǎn)續(xù)傳功能。
FTP服務(wù)歸根基地提供兩個(gè)功能:
①可以在兩臺(tái)完全不同的計(jì)算機(jī)之間進(jìn)行文件數(shù)據(jù)傳輸。(支持傳送二進(jìn)制文件,如:文件、程序、數(shù)據(jù)、視頻、圖片等各種類型的文件傳輸)
②可以提供許多文件數(shù)據(jù)同時(shí)共享。
3. FTP服務(wù)器的工作原理:
FTP標(biāo)準(zhǔn)在RFC959文檔中說(shuō)明,此協(xié)議定義了一個(gè)在遠(yuǎn)程計(jì)算機(jī)系統(tǒng)和本地計(jì)算機(jī)之間傳輸文件的標(biāo)準(zhǔn)。一般的講,要進(jìn)行文件的傳輸,我們必須使用有效的用戶名和密碼來(lái)訪問(wèn)FTP服務(wù)器上的資源(默認(rèn)匿名用戶不要提供密碼),在Internet互聯(lián)網(wǎng)上FTP服務(wù)器提供了“guest user”來(lái)訪問(wèn)FTP服務(wù)。
- 控制連接
當(dāng)客戶端希望和FTP服務(wù)器通訊時(shí),建立上傳/下載文件數(shù)據(jù)傳輸時(shí),服務(wù)器的TCP 21端口發(fā)送一個(gè)建立連接的請(qǐng)求:FTP服務(wù)器接受來(lái)自客戶端的請(qǐng)求,
并通過(guò)TCP/IP完成連接請(qǐng)求,這樣的連接稱之為FTP控制連接
- 數(shù)據(jù)連接
當(dāng)FTP控制連接建立完成后,客戶端便可使用FTP服務(wù)進(jìn)行傳輸文件(get、put...);
4. FTP服務(wù)器的登陸方式:
FTP服務(wù)登錄模式:
- 匿名用戶登錄模式:
只需要輸入用戶anonymous/ftp,并將自己的E-mail作為口令即可登錄FTP服務(wù)器,又稱為(anonymousFTP服務(wù)器)- 本地賬戶登錄模式:當(dāng)進(jìn)入FTP登錄窗口是,需要輸入正確的用戶名(user)和密碼(passwd)即可登錄FTP服務(wù)器。
- 虛擬用戶登錄模式:將登錄用戶映射到指定的系統(tǒng)賬號(hào)(/sbin/nologin)來(lái)訪問(wèn)FTP資源,這樣就起到安全的效果。
FTP服務(wù)傳輸數(shù)據(jù)分為三種傳輸模式:
主動(dòng)模式(PORT)、被動(dòng)模式(PASSIVE)、單端口模式
- 主動(dòng)模式:
主動(dòng)傳輸模式,有FTP服務(wù)器向客戶端發(fā)送一個(gè)用于數(shù)據(jù)傳輸?shù)倪B接,客戶端的連接端口由服務(wù)器和客戶端通過(guò)協(xié)商確定,
即FTP服務(wù)器用端口20與客戶端的臨時(shí)端口進(jìn)行連接并傳輸數(shù)據(jù),客戶端用于接收狀態(tài)。- 被動(dòng)模式:
被動(dòng)傳輸模式,由客戶端發(fā)送PASV命令使服務(wù)器處于被動(dòng)模式,F(xiàn)TP的數(shù)據(jù)連接和控制連接方向一致,由客戶端向服務(wù)器端發(fā)送一個(gè)用于數(shù)據(jù)傳輸?shù)倪B接,
客戶端的連接端口是發(fā)起該數(shù)據(jù)請(qǐng)求時(shí)使用的端口。
單端口模式:- 單端口模式,由服務(wù)器端發(fā)起,使用該模式時(shí),客戶端的控制連接端口和數(shù)據(jù)連接端口一致,這種模式無(wú)法在短時(shí)間內(nèi)連續(xù)輸入數(shù)據(jù)并傳送命令,
因此筆者不建議大家使用此模式。
5. FTP服務(wù)配置文件的結(jié)構(gòu):
1 . Vsftpd服務(wù)器的文件結(jié)構(gòu)如下:
# rpm -ql vsftpd ##查看在安裝vftpd軟件包時(shí),所產(chǎn)生的配置文件。(這里只做常用的文件)
/usr/sbin/vsftpd ##Vsftpd主程序
/etc/rc.d/init.d/vsftpd ##用于啟動(dòng)終止腳本
/etc/vsftpd/vsftpd.conf ##Vsftpd主配置文件
/etc/pam.d/vsftpd ##PAM認(rèn)證文件
/etc/vsftpd.ftpusers ##禁止使用Vsftpd的用戶列表
/etc/vsftpd.user_list ##禁止或允許使用Vsftpd的用戶列表
/var/ftp ##匿名用戶的下載目錄
/var/ftp/pub ##匿名用戶默認(rèn)訪問(wèn)目錄
/etc/logrotate.d/vsftpd.log ##vsftpd的日志文件
2 . 介紹vsftpd配置文件參數(shù)的設(shè)置信息
注:在構(gòu)建FTP服務(wù)器,我們會(huì)經(jīng)常更改vsftpd.conf中各個(gè)參數(shù)來(lái)完成需求,所以我們要完全了解每個(gè)參數(shù)后面的真實(shí)意義,這樣在配置器服務(wù)時(shí),才會(huì)運(yùn)用自如。
當(dāng)vsftpd軟件包安裝完成后,默認(rèn)的主配置文件/etc/vsftpd/vsftpd.conf
# vim /etc/vsftpd/vsftpd.conf
#anonymous_enable=YES ##允許匿名訪問(wèn),即anonymous賬號(hào)訪問(wèn)FTP服務(wù)
#local_enable=YES ##允許本地用戶登錄FTP服務(wù)器
#write_enable=YES ##本地用戶可以讀寫
#local_umask=022 ##默認(rèn)掩碼為022,默認(rèn)創(chuàng)建的文件權(quán)限為755
#anon_upload_enable=YES ##允許匿名用戶上傳文件,基于安全因素考慮,默認(rèn)vsftpd是注釋此項(xiàng)
#anon_mkdir_write_enable=YES ##是否允許匿名用戶創(chuàng)建目錄,基于安全因素考慮,默認(rèn)vsftpd是注釋此項(xiàng)
dirmessage_enable=YES ##如果目錄存在.message隱藏文件時(shí),當(dāng)進(jìn)入此目錄時(shí),會(huì)顯示.message里面的內(nèi)容
xferlog_enable=YES ##默認(rèn)記錄上傳、下載的日志文件,是否開(kāi)啟此功能
#xferlog_file=/var/log/xferlog ##Vsftpd的日志存放位置
connect_from_port_20=YES ##從端口20連接,默認(rèn)狀態(tài)下,20端口為數(shù)據(jù)傳輸端口
#chown_uploads=YES
#chown_username=whoever ##此兩選項(xiàng)必須同時(shí)出現(xiàn),含義為,允許新上傳文件的擁有者為whoever,默認(rèn)這兩行被注釋到得。
xferlog_std_format=YES ##使用標(biāo)準(zhǔn)格式上傳/下載
#data_connection_timeout=120 ##傳輸延時(shí)時(shí)間,當(dāng)時(shí)間超過(guò)120秒后,會(huì)自動(dòng)斷開(kāi),默認(rèn)是注釋掉的。
#nopriv_user=ftpsecure ##使用特殊用戶ftpsecure,這里可以把ftpsecure賬戶作為一般訪問(wèn)用戶,所有連接FTP服務(wù)器的用戶都具有ftpsecure用戶名。
基于安全因素考慮,可以在/etc/passwd中將ftpsecure的用戶shell設(shè)置為/sbin/nologin(禁止登陸操作系統(tǒng))
#async_abor_enable=YES ##取消下載后客戶端不掛起,一般不需要設(shè)置。
#ascii_upload_enable=YES
#ascii_download_enable=YES ##是否啟用ASCII方式傳送文件,一般我們不需要這個(gè)格式。
#ftpd_banner=Welcome to blah FTP service. ##登陸FTP服務(wù)器,所提示的信息,默認(rèn)注釋掉的。
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd/banned_emails ##若是啟用以上兩個(gè)選項(xiàng),則可以在/etc/vsftpd/banned_emails中建立黑名單啦。
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list ##當(dāng)?shù)顷慒TP服務(wù)器時(shí),被列在chroot_list文件中的用戶,不可以訪問(wèn)FTP根目錄以外的目錄。
#ls_recurse_enable=YES ##是否可以使用ls -R 命令,默認(rèn)是注釋掉的。
listen=YES ##當(dāng)此項(xiàng)為YES時(shí),vsftpd運(yùn)行于stand-alone模式下,默認(rèn)是開(kāi)啟的。
#listen_ipv6=YES ##是用IPv6,默認(rèn)是注釋掉的。
pam_service_name=vsftpd ##列出與vsftpd相關(guān)的pam文件。
userlist_enable=YES ##當(dāng)此項(xiàng)設(shè)置為YES時(shí),啟用配置文件/etc/vsftpd.user_list.此時(shí)有兩種情況:
①若沒(méi)有userlist_deny=NO,則/etc/vsftpd.user_list中的用戶不可以訪問(wèn)FTP服務(wù)器
②若有userlist_deny=NO,則僅接受/etc/vsftpd.user_list中的用戶登陸請(qǐng)求,同時(shí)此用戶也不可以存在/etc/vsftpd.ftpusers文件中。
tcp_wrappers=YES ##支持TCP Wrappers
3 . 補(bǔ)充:(未出現(xiàn)在vsftpd.conf配置文件中的常用參數(shù))
guest_enable=YES
guest_username=ftp
guest用戶名,即登陸不是匿名用戶的用戶,具有g(shù)uest用戶身份
local_root=/var/ftp
anon_root=/var/ftp
以上兩個(gè)選項(xiàng)為本地用戶和匿名用戶默認(rèn)訪問(wèn)的目錄
#pasv_enable=YES
#port_enable=YES
以上兩個(gè)選項(xiàng)是FTP服務(wù)器的工作模式,兩者只能出現(xiàn)一個(gè),而且另一個(gè)必須注釋掉。
use_localtime=YES
是否使用本機(jī)時(shí)間,若設(shè)置NO時(shí),僅使用格林尼治時(shí)間。由于北京時(shí)間和格林尼治時(shí)間有8小時(shí)時(shí)差,所以建議設(shè)置為YES
Idle_session_timeout=300
客戶端若在300秒之內(nèi)沒(méi)有任何操作,則服務(wù)器自動(dòng)斷開(kāi)。
max_clinet=0
最大連接數(shù)量(stand-alone模式下)
max_per_ip=0
每個(gè)客戶端最大連接ftp服務(wù)器的連接數(shù)
local_max_rate=0
本地用戶登陸FTP服務(wù)器最大傳輸速率,單位為字節(jié)/秒
anon_max_rate=0
匿名用戶登陸FTP服務(wù)器最大傳輸速率,單位為字節(jié)/秒
<二>:FTP服務(wù)器架構(gòu)篇
經(jīng)過(guò)前面的介紹我們應(yīng)該基本了解FTP的相關(guān)知識(shí),比如FTP的功能及作用、工作原理、工作模式及登錄方式,那下面就來(lái)如何實(shí)現(xiàn)構(gòu)建FTP服務(wù)器,為內(nèi)部網(wǎng)絡(luò)提供文件共享服務(wù)呢。
配置思路:
實(shí)現(xiàn)匿名用戶上傳下載(SELinux、iptables)、定義上傳文件的屬主、禁錮本地用戶、實(shí)現(xiàn)虛擬賬戶登錄(基于PAM認(rèn)證模式)
環(huán)境:VMware Workstation
版本:Redhat Enterprise 5.8
FTP服務(wù)器的IP地址為172.16.88.1/16
Linux測(cè)試機(jī):172.16.88.2/16
XP測(cè)試機(jī)IP地址:192.168.0.203/24
說(shuō)明環(huán)境:172.16.0.0/16和192.168.0.203/24之間可以互相訪問(wèn):
本地用戶訪問(wèn)
- Seq1:檢查當(dāng)前系統(tǒng)是否安裝vsftpd二進(jìn)制軟件包,如果沒(méi)有安裝,使用yum來(lái)進(jìn)行安裝vsftpd即可
# rpm -q vsftpd
# yum install vsftpd -y #對(duì)yum生疏的朋友們,可以查看筆者關(guān)于YUM和RPM的相關(guān)文章進(jìn)行了解。
- Seq2:?jiǎn)?dòng)vsftpd進(jìn)程并開(kāi)啟開(kāi)機(jī)自動(dòng)啟動(dòng)vsftpd服務(wù)
# service vsftpd restart
# chkconfig vsftpd on
# chkconfig --list vsftpd ##查看在那個(gè)級(jí)別上啟動(dòng)(默認(rèn)為235級(jí)別)
# cd /var/ftp/pub
# echo "text file" > text.txt
下面用windows客戶端來(lái)測(cè)試下,是否可以正常訪問(wèn)FTP服務(wù)器資源呢?
此處輸入圖片的描述
哎,奇怪了,為啥不能正常訪問(wèn)服務(wù)器呢?
說(shuō)明:如果在這測(cè)試的話,只能在本機(jī)訪問(wèn)FTP服務(wù),在其它客戶端就不能正常訪問(wèn)FTP服務(wù)了,因?yàn)槲覀兊姆阑饓δJ(rèn)拒絕所有端口訪問(wèn)滴。那來(lái)修改下iptables看看是否可以正常訪問(wèn)。
- Seq3:設(shè)置防火墻(iptables)開(kāi)啟20:21端口
#iptables -I INPUT 1 -p tcp --dport 20:21 -j ACCEPT
#service iptables save ##保存iptables設(shè)置
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
再測(cè)試看看結(jié)果:
此處輸入圖片的描述
- Seq4:如何實(shí)現(xiàn)匿名用戶具有上傳的權(quán)限呢?
我們創(chuàng)建一個(gè)由匿名用戶上傳的目錄,并將屬主、屬組更改為FTP
# mkdir -p /var/ftp/upload
# chown ftp:ftp /var/ftp/upload
我們修改配置文件/etc/vsftpd/vsftpd.conf,確保有下列幾行。
write_enable=YES
anon_upload_enable=YES ##開(kāi)啟匿名用戶上傳功能
anon_mkdir_write_enable=YES ##允許匿名用戶創(chuàng)建目錄
然后重新啟動(dòng)vsftpd服務(wù)
#service vsftpd restart
然后再進(jìn)行測(cè)試,查看是否可以上傳文件?(效果圖)
此處輸入圖片的描述
貌似還不能上傳,那我們查看下SELINUX關(guān)于ftp的定義并修改相應(yīng)選項(xiàng)(如圖)
此處輸入圖片的描述
OK,修改好了,在測(cè)試下吧
此處輸入圖片的描述
- Seq5:定義上傳文件的屬主
我們到服務(wù)器器上看看剛才上傳windows.txt的屬性信息:
此處輸入圖片的描述
編輯配置文件
# vim /etc/vsftpd/vsftpd.conf
修改如下內(nèi)容
#chown_upload=YES
#chown_username=hadoop
改為如下內(nèi)容(如圖)
此處輸入圖片的描述
注:當(dāng)配置文件發(fā)生變化,一定不要忘記重啟檢測(cè)配置文件
# service vsftpd condrestart
在到windows客戶機(jī)上(文件均是windows客戶機(jī)文件)進(jìn)行測(cè)試(測(cè)試結(jié)果圖)
此處輸入圖片的描述
然后到服務(wù)器端,查看上傳文件的屬性信息:
此處輸入圖片的描述
- Seq6:使用本地用戶登錄FTP服務(wù)器及禁錮本地用戶訪問(wèn)目錄
此處輸入圖片的描述
編輯主配置文件
# vim /etc/vsftpd/vsftpd.conf ##可以再末行模式下輸入:set nu可以顯示行號(hào)。
將96行和98行的#去掉,并在/etc/vsftpd/目錄下創(chuàng)建chroot_list(凡是在此文件的用戶,都禁錮在自己的家目錄中)
chroot_list_enable=YES
97# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
# touch /etc/vsftpd/chroot_list
# echo "hadoop" > /etc/vsftpd/chroot_list ##將hadoop用戶添加到chroot_list文件中。
然后再進(jìn)行測(cè)試,看hadoop用戶是否可以更換目錄
此處輸入圖片的描述
總結(jié):本地用戶可以登錄FTP服務(wù)器,并且登錄后的默認(rèn)目錄為用戶的家目錄,而且還可以更改其默認(rèn)目錄,我們又知道ftp是明文傳輸?shù)模绻霈F(xiàn)中間人攻擊的話,這將對(duì)于我們的服務(wù)器造成很大威脅,所以我們要禁止本地用戶更改其默認(rèn)目錄。
如果禁錮所有本地用戶,只需要在主配置文件中添加一行即可:
chroot_local_user = YES
基于PAM認(rèn)證實(shí)現(xiàn)虛擬賬號(hào)登陸FTP服務(wù)器
虛擬用戶和系統(tǒng)本地用戶的區(qū)別是:本地用戶在系統(tǒng)的/etc/passwd文件中有相應(yīng)的記錄,而虛擬用戶時(shí)針對(duì)vsftpd本身產(chǎn)生的,所以與/etc/passwd沒(méi)有關(guān)系。
FTP服務(wù)器除了支持本地用戶和匿名用戶登錄服務(wù)器,如果我們有許多用戶來(lái)訪問(wèn)服務(wù)器的話,也支持虛擬用戶的訪問(wèn)。那么我們?yōu)槭裁匆褂锰摂M賬號(hào)呢,
因?yàn)槟涿脩舨荒茚槍?duì)每個(gè)用戶設(shè)置不同的權(quán)限,而且本地用戶又存在安全問(wèn)題,在這種情形下,虛擬用戶就產(chǎn)生啦。
在配置之前我們需要安裝db4和db4-utils組件,如果系統(tǒng)沒(méi)有安裝db4相關(guān)軟件包的話,可以使用yum來(lái)安裝
# yum install db4* -y
- 創(chuàng)建虛擬用戶賬號(hào)和密碼(奇數(shù)行為用戶名,偶數(shù)行為用戶密碼)
# touch /etc/vsftpd/virtual.users
# vim /etc/vsftpd/virtual.users
user1 ##奇數(shù)為用戶名
redhat ##偶數(shù)為用戶的密碼
user2
123456
- 使用db_load命令生成用戶賬戶的數(shù)據(jù)庫(kù)文件并設(shè)置相應(yīng)的數(shù)據(jù)庫(kù)文件權(quán)限。
# db_load -T -t hash -f /etc/vsftpd/virtual.users /etc/vsftpd/vsftpd.login.db
# chmod 600 /etc/vsftpd/vsftpd.login.db
- 配置PAM信息,在/etc/pam.d/創(chuàng)建一個(gè)文件,命名為vsftpd.pam(可自定義)
# vim /etc/pam.d/vsftpd.pam
auth required pam_userdb.so db=/etc/vsftpd/vsftpd.login
account required pam_userdb.so db=/etc/vsftpd/vsftpd.login
- 配置vsftpd.conf,我們也可以自己專為虛擬用戶所使用的配置文件,這里我們使用系統(tǒng)默認(rèn)的配置文檔:
# vim /etc/vsftpd/vsftpd.conf 添加如下內(nèi)容
- 創(chuàng)建相應(yīng)的虛擬用戶目錄,用于虛擬用戶訪問(wèn)FTP服務(wù)所用到的默認(rèn)目錄
# mkdir -p /var/ftp/virtual/{user1,user2}
# chown ftp.ftp /var/ftp/virtual/{user1,user2}
# touch /var/ftp/virtual/user2/user2.txt (測(cè)試)
-
我們使用user2虛擬賬號(hào)登陸FTP服務(wù)器,看是否可以正常登陸,并且訪問(wèn)相應(yīng)資源
此處輸入圖片的描述
總結(jié):我們通過(guò)使用PAM認(rèn)證來(lái)實(shí)現(xiàn)虛擬賬戶的登陸,而且每個(gè)虛擬賬戶對(duì)應(yīng)的是一個(gè)普通系統(tǒng)用戶,而且不能正常登陸FTP服務(wù)器,所以即被中間人攻擊截取用戶和密碼,也沒(méi)有任何意義的,因?yàn)楂@取的是一個(gè)虛擬賬戶,這樣我們的服務(wù)器就相對(duì)安全了許多。