本博文分爲兩部分:
<一>:FTP服務理論篇
<二>:FTP服務架構篇
<一>:理論篇:
注:筆者還是在這裏嘮叨一句:理論很枯燥、很無趣,對以後要從事運維管理工作的人員來說,理論知識是必須掌握的,所以筆者希望博友能夠認真閱讀FTP的相關理論,這樣在後續的服務構建篇當中,纔會更容易理解並掌握每步操作的真實意義!
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客戶端和服務器之間要建立連接,這個連接也就是我們熟悉的“三次握手”,之所以建立三次連接,是爲了證明客戶端
- 和服務端之間的連接是可靠的、安全的、面向連接的,爲數據的傳輸提供了可靠、安全的保障。
FTP服務器的功能:
- FTP服務主要提供下載數據、上傳數據,並且可以將遠程的文件複製到本地計算機,以達到資源共享和傳遞信息的目的,FTP在傳輸文件時還支持斷點續傳功能。
- FTP服務歸根基地提供兩個功能:
- ①可以在兩臺完全不同的計算機之間進行文件數據傳輸。(支持傳送二進制文件,如:文件、程序、數據、視頻、圖片等各種類型的文件傳輸)
- ②可以提供許多文件數據同時共享。
FTP服務器的工作原理:
- FTP標準在RFC959文檔中說明,此協議定義了一個在遠程計算機系統和本地計算機之間傳輸文件的標準。一般的講,要進行文件的傳輸,
- 我們必須使用有效的用戶名和密碼來訪問FTP服務器上的資源(默認匿名用戶不要提供密碼),在Internet互聯網上FTP服務器提供了“guest user”來訪問FTP服務。
- 1.控制連接
- 當客戶端希望和FTP服務器通訊時,建立上傳/下載文件數據傳輸時,服務器的TCP 21端口發送一個建立連接的請求:FTP服務器接受來自客戶端的請求,
- 並通過TCP/IP完成連接請求,這樣的連接稱之爲FTP控制連接
- 2.數據連接
- 當FTP控制連接建立完成後,客戶端便可使用FTP服務進行傳輸文件(get、put...);
FTP服務器的登陸方式:
- FTP服務登錄模式:
- 匿名用戶登錄模式:只需要輸入用戶anonymous/ftp,並將自己的E-mail作爲口令即可登錄FTP服務器,又稱爲(anonymousFTP服務器)
- 本地賬戶登錄模式:當進入FTP登錄窗口是,需要輸入正確的用戶名(user)和密碼(passwd)即可登錄FTP服務器。
- 虛擬用戶登錄模式:將登錄用戶映射到指定的系統賬號(/sbin/nologin)來訪問FTP資源,這樣就起到安全的效果。
FTP服務傳輸數據分爲三種傳輸模式:
主動模式(PORT)、被動模式(PASSIVE)、單端口模式
- 主動模式:
- 主動傳輸模式,有FTP服務器向客戶端發送一個用於數據傳輸的連接,客戶端的連接端口由服務器和客戶端通過協商確定,
- 即FTP服務器用端口20與客戶端的臨時端口進行連接並傳輸數據,客戶端用於接收狀態。
- 被動模式:
- 被動傳輸模式,由客戶端發送PASV命令使服務器處於被動模式,FTP的數據連接和控制連接方向一致,由客戶端向服務器端發送一個用於數據傳輸的連接,
- 客戶端的連接端口是發起該數據請求時使用的端口。
- 單端口模式:
- 單端口模式,由服務器端發起,使用該模式時,客戶端的控制連接端口和數據連接端口一致,這種模式無法在短時間內連續輸入數據並傳送命令,
- 因此筆者不建議大家使用此模式。
FTP服務配置文件的結構:
- 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的日誌文件
介紹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
補充:(未出現在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的定義並修改相應選項(如圖)
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
1、創建虛擬用戶賬號和密碼(奇數行爲用戶名,偶數行爲用戶密碼)
- # touch /etc/vsftpd/virtual.users
- # vim /etc/vsftpd/virtual.users
- user1 ##奇數爲用戶名
- redhat ##偶數爲用戶的密碼
- user2
- 123456
2、使用db_load命令生成用戶賬戶的數據庫文件並設置相應的數據庫文件權限。
- # db_load -T -t hash -f /etc/vsftpd/virtual.users /etc/vsftpd/vsftpd.login.db
- # chmod 600 /etc/vsftpd/vsftpd.login.db
3、配置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
4、配置vsftpd.conf,我們也可以自己專爲虛擬用戶所使用的配置文件,這裏我們使用系統默認的配置文檔:
# vim /etc/vsftpd/vsftpd.conf 添加如下內容
5、創建相應的虛擬用戶目錄,用於虛擬用戶訪問FTP服務所用到的默認目錄
- # mkdir -p /var/ftp/virtual/{user1,user2}
- # chown ftp.ftp /var/ftp/virtual/{user1,user2}
- # touch /var/ftp/virtual/user2/user2.txt (測試)
6、我們使用user2虛擬賬號登陸FTP服務器,看是否可以正常登陸,並且訪問相應資源
總結:我們通過使用PAM認證來實現虛擬賬戶的登陸,而且每個虛擬賬戶對應的是一個普通系統用戶,而且不能正常登陸FTP服務器,所以即被中間人***截取用戶和密碼,也沒有任何意義的,因爲獲取的是一個虛擬賬戶,這樣我們的服務器就相對安全了許多。