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