1. 程式人生 > >FTP服務:使用 vsftpd 服務傳輸檔案

FTP服務:使用 vsftpd 服務傳輸檔案

1.檔案傳輸協議

  今天的網際網路是由幾千萬臺個人計算機、工作站、伺服器、小型機、大型 機、巨型機等具有不同型號、不同架構的物理裝置共同組成的,而且即便是個人計算機,也 可能會裝有 Windows、Linux、UNIX、Mac 等不同的作業系統。為了能夠在如此複雜多樣的 裝置之間解決問題解決檔案傳輸問題,檔案傳輸協議(FTP)應運而生。 

  FTP 是一種在網際網路中進行檔案傳輸的協議,基於客戶端/伺服器模式,預設使用 20、21 號埠,其中埠 20(資料埠)用於進行資料傳輸,埠 21(命令埠)用於接受客戶端 發出的相關 FTP 命令與引數。FTP 伺服器普遍部署於內網中,具有容易搭建、方便管理的特點。FTP 協議的傳輸拓撲如圖 11-1 所示:

  FTP 伺服器是按照 FTP 協議在網際網路上提供檔案儲存和訪問服務的主機,FTP 客戶 端則是向伺服器傳送連線請求,以建立資料傳輸鏈路的主機。FTP 協議有下面兩種工作模式:

  ➢主動模式:FTP 伺服器主動向客戶端發起連線請求。
  ➢被動模式:FTP 伺服器等待客戶端發起連線請求(FTP 的預設工作模式)。

防火牆一般是用於過濾從外網進入內網的流 量,因此有些時候需要將 FTP 的工作模式設定為主動模式,才可以傳輸資料。 vsftpd(very secure ftp daemon,非常安全的 FTP 守護程序)是一款執行在 Linux 操作系 統上的 FTP 服務程式。

1.1 FTP安裝及其主配置檔案引數

第一步:配置妥當 Yum 軟體倉庫之後,就可以安裝 vsftpd 服務程式

    yum  install  vsftpd

第二步:iptables 防火牆管理工具預設禁止了 FTP 傳輸協議的埠號,清空 iptables 防火牆的預設策 略,並把當前已經被清理的防火牆策略狀態儲存下來

    iptables -F

    service  iptables  save

第三步:檢視vsftpd 服務程式的主配置檔案(/etc/vsftpd/vsftpd.conf)

     grep 命令後面新增-v 引數,過濾並反選出沒有包含井號(#)的引數。既過濾所有包含(#)的引數。

第四步:vsftpd 服務程式主配置檔案中常用的引數以及作用

2.vsftpd 服務程式 

  vsftpd 作為更加安全的檔案傳輸的服務程式,允許使用者以三種認證模式登入到 FTP 伺服器上:

  ➢ 匿名開放模式:是一種最不安全的認證模式,任何人都可以無需密碼驗證而直接登入到 FTP 伺服器。 

  ➢ 本地使用者模式:是通過 Linux 系統本地的賬戶密碼資訊進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單。但是如果被黑客破解了賬戶的資訊,就可 以暢通無阻地登入 FTP 伺服器,從而完全控制整臺伺服器。   

  ➢ 虛擬使用者模式:是這三種模式中最安全的一種認證模式,它需要為 FTP 服務單獨建立使用者資料庫檔案,虛擬出用來進行口令驗證的賬戶資訊,而這些賬戶資訊在 伺服器系統中實際上是不存在的,僅供 FTP 服務程式進行認證使用。

ftp 是 Linux 系統中以命令列介面的方式來管理 FTP 傳輸服務的客戶端工具。我們首先手 動安裝這個 ftp 客戶端工具,以便在後續實驗中檢視結果。

 

2.1匿名開放模式 

    匿名開放模式是最不安全的一種認證模式。任何人都可以無需密碼驗證而直接登入到 FTP 伺服器。這種模式一般用來訪問不重要的公開檔案(在生產環境中儘量不要存放重要檔案)。

    vsftpd 服務程式預設開啟了匿名開放模式,我們需要做的就是開放匿名使用者的上傳、下 載檔案的許可權,以及讓匿名使用者建立、刪除、更名檔案的許可權。需要注意的是,針對匿名使用者 放開這些許可權會帶來潛在危險。不建議在生產環境中如此行事。表 11-2 羅列了可以向匿名使用者開放的許可權引數以及作用。

在 vsftpd 服務程式的主配置檔案中正確填寫引數,然後儲存並退出。還需要重啟 vsftpd 服務程式,讓新的配置引數生效。

現在就可以在客戶端執行 ftp 命令連線到遠端的 FTP 伺服器了。在 vsftpd 服務程式的匿 名開放認證模式下,其賬戶統一為 anonymous,密碼為空。而且在連線到 FTP 伺服器後,默 認訪問的是/var/ftp 目錄。我們可以切換到該目錄下的 pub 目錄中,然後嘗試建立一個新的目 錄檔案,以檢驗是否擁有寫入許可權: 

系統顯示拒絕建立目錄!我們明明在前面清空了 iptables 防火牆策略,而且也在 vsftpd 服 務程式的主配置檔案中添加了允許匿名使用者建立目錄和寫入檔案的許可權啊。在 vsftpd 服務程式的匿名開放認證模式下,預設訪問的是/var/ftp 目錄。檢視 該目錄的許可權得知,只有 root 管理員才有寫入許可權。怪不得系統會拒絕操作呢!下面將目錄 的所有者身份改成系統賬戶 ftp 即可(該賬戶在系統中已經存在),這樣應該可以了吧: 

再次報錯,由此我們猜測可能是SELinux在搞鬼,下面使用 getsebool 命令檢視與 FTP 相關的 SELinux 域策略都有哪些:

我們可以根據經驗(需要長期培養,別無它法)和策略的名稱判斷出是 ftpd_full_access--> off 策略規則導致了操作失敗。接下來修改該策略規則,並且在設定時使用-P 引數讓修改過的策略永 久生效,確保在伺服器重啟後依然能夠順利寫入檔案。 

現在便可以順利執行檔案建立、修改及刪除等操作了。 

2.2本地使用者模式 

  相較於匿名開放模式,本地使用者模式要更安全,而且配置起來也很簡單。如果大家之前用的是匿名開放模式,現在就可以將它關了,然後開啟本地使用者模式。針對本地使用者模式的 許可權引數以及作用如表 11-3 所示。 

在 vsftpd 服務程式的主配置檔案中正確填寫引數,然後儲存並退出。還需要重啟 vsftpd 服務程式,讓新的配置引數生效。在執行完上一個實驗後還原了虛擬機器的讀者,還需要將配 置好的服務新增到開機啟動項中,以便在系統重啟自後依然可以正常使用 vsftpd 服務。

按理來講,現在已經完全可以本地使用者的身份登入 FTP 伺服器了。但是在使用 root 管理 員登入後,系統提示如下的錯誤資訊:

vsftpd 服務程式為了保證伺服器的安全性而預設禁止了 root 管理員和大多數 系統使用者的登入行為,這樣可以有效地避免黑客通過 FTP 服務對 root 管理員密碼進行暴力破 解。可見,在我們輸入root管理員的密碼之前,就已經被系統拒絕訪問了。這是因為 vsftpd 服務 程式所在的目錄中預設存放著兩個名為“使用者名稱單”的檔案(ftpusers 和 user_list)。該名單為禁止訪問的名單。

在採用本地使用者模式登入 FTP 伺服器後,預設訪問的是該使用者的家目錄,也就是說,訪 問的是/home/wenhewen 目錄。而且該目錄的預設所有者、所屬組都是該使用者自己,因此不存 在寫入許可權不足的情況。但是當前的操作仍然被拒絕,是因為我們剛才將虛擬機器系統還原到 最初的狀態了。為此,需要再次開啟 SELinux 域中對 FTP 服務的允許策略:

在配置妥當後再使用本地使用者嘗試登入下 FTP 伺服器,分別執行檔案的建立、重新命名及 刪除等命令。操作均成功!如果想用root使用者登陸,需要在/etc/vsftp 中的ftpusers 和 user_list

總結:如果你想給某個使用者分配一個賬號供它去訪問FTP伺服器中的資源時,可以現在Linux中新建使用者和設定其密碼,並且注意在/etc/vsftpd/user_list或者/etc/vsftpd/ftpusers檔案中允許登陸的使用者名稱刪除,否則無法登陸FTP伺服器。(密碼都不給輸入,直接拒絕登陸)。

useradd  test_name

passwd  test_name    (假設密碼設定為123456)

vim  /etc/vsftp/user_list        #刪除使用者 test_name

客戶端登陸測試即可。

 

2.3  虛擬使用者模式 

    第一步:建立用於進行 FTP 認證的使用者資料庫檔案,其中奇數行為賬戶名,偶數行為密碼。例如,我們分別創建出 zhangsan 和 lisi 兩個使用者,密碼均為 redhat

    但是,明文資訊既不安全,也不符合讓 vsftpd 服務程式直接載入的格式,因此需要使 用 db_load 命令用雜湊(hash)演算法將原始的明文資訊檔案轉換成資料庫檔案,並且降低 資料庫檔案的許可權(避免其他人看到資料庫檔案的內容),然後再把原始的明文資訊檔案 刪除。

    第二步:建立 vsftpd 服務程式用於儲存檔案的根目錄以及虛擬使用者對映的系統本地使用者。FTP 服務用於儲存檔案的根目錄指的是,當虛擬使用者登入後所訪問的預設位置。

        由於 Linux 系統中的每一個檔案都有所有者、所屬組屬性,例如使用虛擬賬戶“張三” 新建了一個檔案,但是系統中找不到賬戶“張三”,就會導致這個檔案的許可權出現錯誤。為此, 需要再建立一個可以對映到虛擬使用者的系統本地使用者。簡單來說,就是讓虛擬使用者預設登入 到與之有對映關係的這個系統本地使用者的家目錄中,虛擬使用者建立的檔案的屬性也都歸屬於 這個系統本地使用者,從而避免 Linux 系統無法處理虛擬使用者所建立檔案的屬性許可權。 

        為了方便管理 FTP 伺服器上的資料,可以把這個系統本地使用者的家目錄設定為/var 目錄 (該目錄用來存放經常發生改變的資料)。並且為了安全起見,我們將這個系統本地使用者設定 為不允許登入 FTP 伺服器,這不會影響虛擬使用者登入,而且還可以避免黑客通過這個系統本 地使用者進行登入。

    第三步:建立用於支援虛擬使用者的 PAM 檔案.       

        PAM(可插拔認證模組)是一種認證機制,通過一些動態連結庫和統一的 API 把系統提 供的服務與認證方式分開,使得系統管理員可以根據需求靈活調整服務程式的不同認證方式。通俗來講,PAM 是一組安全機制的模組,系統管理員可以用來輕易地調整服務程式的認 證方式,而不必對應用程式進行任何修改。PAM 採取了分層設計(應用程式層、應用介面層、 鑑別模組層)的思想,其結構如圖 11-2 所示。 

新建一個用於虛擬使用者認證的 PAM 檔案 vsftpd.vu,其中 PAM 檔案內的“db=”引數為 使用 db_load 命令生成的賬戶密碼資料庫檔案的路徑,但不用寫資料庫檔案的字尾: 

    第四步:在 vsftpd 服務程式的主配置檔案中通過 pam_service_name 引數將 PAM 認證檔案的名稱修改為 vsftpd.vu,PAM 作為應用程式層與鑑別模組層的連線紐帶,可以讓應用程 序根據需求靈活地在自身插入所需的鑑別功能模組。當應用程式需要 PAM 認證時,則需要在 應用程式中定義負責認證的 PAM 配置檔案,實現所需的認證功能。

        例如,在 vsftpd 服務程式的主配置檔案中預設就帶有引數 pam_service_name=vsftpd,表 示登入 FTP 伺服器時是根據/etc/pam.d/vsftpd 檔案進行安全認證的。現在我們要做的就是把 vsftpd 主配置檔案中原有的 PAM 認證檔案 vsftpd 修改為新建的 vsftpd.vu 檔案即可。該操作中 用到的引數以及作用如表 11-4 所示。

    第五步:為虛擬使用者設定不同的許可權。雖然賬戶 zhangsan 和 lisi 都是用於 vsftpd 服務程式認證的虛擬賬戶,但是我們依然想對這兩人進行區別對待。比如,允許張三上傳、建立、修 改、檢視、刪除檔案,只允許李四檢視檔案。這可以通過 vsftpd 服務程式來實現。只需新建 一個目錄,在裡面分別建立兩個以 zhangsan 和 lisi 命名的檔案,其中在名為 zhangsan 的檔案 中寫入允許的相關許可權(使用匿名使用者的引數):

然後再次修改 vsftpd 主配置檔案,通過新增 user_config_dir 引數來定義這兩個虛擬使用者 不同許可權的配置檔案所存放的路徑。為了讓修改後的引數立即生效,需要重啟 vsftpd 服務程 序並將該服務新增到開機啟動項中: 

    第六步:設定 SELinux 域允許策略,然後使用虛擬使用者模式登入 FTP 伺服器。相信大家可以猜到,SELinux 會繼續來搗亂。所以,先按照前面實驗中的步驟開啟 SELinux 域的允許策略,以免再次出現操作失敗的情況:

此時,不但可以使用虛擬使用者模式成功登入到 FTP 伺服器,還可以分別使用賬戶 zhangsan 和 lisi 來檢驗他們的許可權。實驗測試結果如下:

【注意】使用者lisi建立資料夾test時被拒絕,但是zhangsan可以成功建立資料夾test。原因參考第五步!