Boison
百日轉職前端工程師:第十四週 FTP 資料傳輸《DAY 23》

大家好,這是百日轉職前端工程師的 Day23,也是 11/22(日),這週的主題會談FTP ,它是一種網際網路世界普遍採用的通訊協定之一,這算是額外補充的番外篇,希望透過這篇文章補足網路世界知識的一角,也是要瞭解網路運作重要的基礎, FTP 的使用情境(尤其在早期)也是相當多的。


一、FTP 是什麼?

FTP 就是 File Transfer Protocol(client and server),它是一種獲得網際網路世界普遍採用的通訊協定之一,說什麼 FTP 協定恐怕對一般人來說太深奧了點,其實講白話一點,就是有一組非商業組織的學者們,在 1985 年的時候提出了一種開放的協定,提供給想要製作檔案傳輸相關應用的電腦軟體設計者們參考,讓大家可以依照這個標準,獨立製作出支持 FTP 協定的檔案傳輸軟體,卻又可以確保互相能夠相容。

FTP是一種主從式的架構,也就是 Client and Server 架構,主從式的意思是,這個協定要運行一定就要有人開 FTP Server,也要有人用 FTP Client,唯有這兩組軟體搭配,才能達成 FTP 檔案傳輸的功效。


二、FTP 功能簡介

FTP (File transfer protocol) 是相當古老的傳輸協定之一,他最主要的功能是在伺服器與用戶端之間進行檔案的傳輸。 這個古老的協定使用的是明碼傳輸方式,且過去有相當多的安全危機歷史。後面會介紹更安全的使用 FTP 協定的方式。

想要提供一個讓別人與自己的電腦透過網路作檔案上下傳服務的人,他就要安裝FTP Server 的軟體,也就是所謂的 FTP 伺服器,想要到別人的 FTP Server 去抓檔案或是傳檔案給別人的人,就需要安裝 FTP Client 的軟體。


不同等級的使用者身份

FTP 伺服器在預設的情況下,依據使用者登入的情況而分為三種不同的身份,分別是: (1). 實體帳號(real user)(2). 訪客(guest)(3). 匿名登入者(anonymous) 這三種。這三種身份的使用者在系統上面的使用權限差異很大!實體用戶取得系統的權限比較完整, 所以可以進行比較多的動作;至於匿名登入者,大概就僅提供下載資源的能力而已,而這三種使用者能使用的線上指令也不同。


三、FTP 的運作架構

FTP 的傳輸使用的是 TCP 封包協定, TCP 在建立連線前會先進行三向交握。不過 FTP 伺服器是比較麻煩一些,因為 FTP 伺服器使用了兩個連線,分別是命令通道與資料流通道(ftp-data) 。


1. FTP 傳輸用到的 Port

使用 FTP 傳輸時,至少會使用到兩個 Port 來建立連線通道:

  • 一個為命令通道(Command Channel),預設使用 Port 21 建立連線,用來傳輸 FTP 指令,例如:列出檔案清單(LIST)、變更目錄(CWD)、取得目前的目錄(PWD)、……等。 
  • 另一個為資料流通道(DATA Channel),預設使用 Port 20,但是會因 FTP Client 選擇使用的「連線模式」不同而有所不同。

一般來說,指令通道的連線與下指令都沒有什麼問題,有問題的通常是在資料通道的建立,而資料通道的建立方式是由 FTP Client 所下的指令決定的,以 FileZilla 設定為例(如下圖):

資料來源:解說 FTP Protocol 的運作原理

FTP Client (e.g. FileZilla) 每次建立連線時都會下 PORT 或 PASV 指令,如下範例:

指令: PASV
回應: 227 Entering Passive Mode (59,37,124,43,158,251)

而每次下指令傳輸資料時,都會建立一次 data connection,包括取得遠端的檔案清單(LIST)時回傳的檔案列表、下載檔案、或上傳檔案。


2. FTP Port 連線用到的三向交握

回到正題三向交握,命令通道與資料流通道(ftp-data) 這兩個連線都需要經過三向交握, 因為是 TCP 封包嘛!那麼這兩個連線通道的關係是如何呢?底下我們先以FTP 預設的主動式 (active) 連線來作個簡略的說明囉:

  1. 建立命令通道的連線
    如上圖所示,用戶端會隨機取一個大於 1024 以上的埠口(port AA) 來與 FTP 伺服器端的 port 21 達成連線, 這個過程當然需要三向交握了!達成連線後用戶端便可以透過這個連線來對 FTP 伺服器下達指令, 包括查詢檔名、下載、上傳等等指令都是利用這個通道來下達的。
  2. 通知 FTP 伺服器端使用 active 且告知連接的埠號
    FTP 伺服器的 21 埠號主要用在命令的下達,但是當牽涉到資料流時,就不是使用這個連線了。 用戶端在需要資料的情況下,會告知伺服器端要用什麼方式來連線,如果是主動式(active)連線時, 用戶端會先隨機啟用一個埠口(圖中的 port BB),且透過命令通道告知 FTP 伺服器這兩個資訊,並等待 FTP 伺服器的連線;
  3. FTP 伺服器『主動』向用戶端連線
    FTP 伺服器由命令通道瞭解用戶端的需求後,會主動的由 20 這個埠號向用戶端的 port BB 連線, 這個連線當然也會經過三向交握啦!此時 FTP 的用戶端與伺服器端共會建立兩條連線,分別用在命令的下達與資料的傳遞。 而預設 FTP 伺服器端使用的主動連線埠號就是 port 20 囉!

四、FTP 連線的主動 v.s 被動模式

FTP 的連線模式分兩種:主動模式(Active mode) 與 被動模式(Passive mode)。

1. 主動模式 ( Active mode )

FTP Client 跟 FTP Server 連線後,會主動利用 PORT 指令提出 DATA Channel 連線的要求,如下:

指令: PORT 10,18,53,171,17,114
回應: 200 Port command successful.

這裡的 PORT 指令是由 FTP Client 送出的,當需要建立 DATA Channel 時,FTP Server 會主動利用 Server 主機的 Port 20 發出連線到 FTP Client 的主機,而 PORT 指令後的參數說明如下:

  • 前四個數字是 FTP Client 的 IP 位址:10.18.53.171 
  • 後兩個數字是 FTP Client 接受連線的 Port 埠號,埠號的計算方式是 (第五個數字 * 256 + 第六個數字),以此範例來說,FTP Client 接受的連線埠號是 17 * 256 + 114 = 4,466

由此可知,如果 FTP Client 處於 NAT 的環境下的話,FTP Server 幾乎無法正常的連線到 FTP Client 的主機,所以現在大部分的連線模式幾乎都建議使用者使用被動模式(Passive mode)。

2. 被動模式 ( Passive mode )

FTP Client 跟 FTP Server 連線後,會主動利用 PASV 指令提出 DATA Channel 連線的要求,如下:

指令: PASV
回應: 227 Entering Passive Mode (59,37,124,43,158,251)

你可以看到由 FTP Client 送出的 PASV 指令並沒有送出其他的參數,而是在 FTP Server 回應的時候出現了(59,37,124,43,158,251)字串,當需要建立 DATA Channel 時,這時就會由 FTP Client 主動連接至 FTP Server 動態開放的 Port 供 FTP Client 連接,其中(59,37,124,43,158,251)的說明如下:

  • 前四個數字是 FTP Server 的 IP 位址:59.37.124.43 
  • 後兩個數字是 FTP Server 接受連線的 Port 埠號,埠號的計算方式是 (第五個數字 * 256 + 第六個數字),以此範例來說,FTP Server 可接受的連線埠號是 158 * 256 + 251 = 40,699

由此可知,使用被動模式(Passive mode)對 FTP Server 的系統管理員來說,可掌控的部分是比較多的,因為 FTP Server 無法決定使用者是否可使用主動模式連線,但若改使用被動模式連線的話,就幾乎能讓所有人正常的使用 FTP 服務。


五、FTP 的安全性問題與替代方案

其實,在 FTP 上面傳送的資料很可能被竊取,因為 FTP 是明碼傳輸的嘛!而且某些 FTP 伺服器軟體的資安歷史問題也是很嚴重的。 因此,一般來說,除非是學校或者是一些社團單位要開放沒有機密或授權問題的資料之外,FTP 是少用為妙的。

拜 SSH 所賜,目前我們已經有較為安全的 FTP 了,那就是 ssh 提供的 sftp 這個 server 啊!這個 sftp-server 最大的優點就是:『在上面傳輸的資料是經過加密的』!


六、開放什麼身份的使用者登入

既然 FTP 是以明碼傳輸,並且某些早期的 FTP 伺服器軟體也有不少的安全性漏洞,那又為何需要架設 FTP 伺服器啊? 沒辦法啊,總是有人有需要這個玩意兒的,譬如說各大專院校不就有提供 FTP 網站的服務嗎? 這樣可以讓校內的同學共同分享校內的網路資源嘛!不過,由於 FTP 登入者的身份可以分為三種, 你到底要開放哪一種身份登入呢?


1. 開放實體用戶的情況 (Real user)

很多的 FTP 伺服器預設就已經允許實體用戶的登入了。不過,需要瞭解的是,以實體用戶做為 FTP 登入者身份時, 系統預設並沒有針對實體用戶來進行『限制』的,所以他可以針對整個檔案系統進行任何他所具有權限的工作。 因此,如果你的 FTP 使用者沒能好好的保護自己的密碼而導致被入侵,那麼你的整個 Linux 系統資料將很有可能被竊取啊! 開放實體用戶時的建議如下:

  • 使用替代的 FTP 方案較佳: 由於實體用戶本來就可以透過網路連接到主機來進行工作 (例如 SSH),因此實在沒有需要特別的開放 FTP 的服務啊!因為例如 sftp 本來就能達到傳輸檔案的功能囉!
  • 限制用戶能力,如 chroot 與 /sbin/nologin 等: 如果確定要讓實體用戶利用 FTP 伺服器的話,那麼你可能需要讓某些系統帳號無法登入 FTP 才行,例如 bin, apache 等等。 最簡單常用的作法是透過 PAM 模組來處理,譬如 vsftpd 這個軟體預設可以透過 /etc/vsftpd/ftpusers 這個檔案來設定不想讓他具有登入 FTP 的帳號。另外,將使用者身份 chroot 是相當需要的!

2. 訪客身份 (Guest)

通常會建立 guest 身份的案例當中,多半是由於伺服器提供了類似『個人 Web 首頁』的功能給一般身份使用者, 那麼這些使用者總是需要管理自己的網頁空間吧?這個時候將使用者的身份壓縮成為 guest ,並且將他的可用目錄設定好,即可提供使用者一個方便的使用環境了!且不需要提供他 real user 的權限喔! 常見的建議如下:

  • 僅提供需要登入的帳號即可,不需要提供系統上面所有人均可登入的環境啊!
  • 當然,我們在伺服器的設定當中,需要針對不同的訪客給他們不一樣的『家目錄』, 而這個家目錄與使用者的權限設定需要相符合喔!例如要提供 dmtsai 這個人管理他的網頁空間,而他的網頁空間放置在 /home/dmtsai/www 底下,那我就將 dmtsai 在 FTP 提供的目錄僅有 /home/dmtsai/www 而已,比較安全啦!而且也方便使用者啊!
  • 針對這樣的身份者,需要設定較多的限制,包括:上下傳檔案數目與硬碟容量的限制、 連線登入的時間限制、許可使用的指令要減少很多很多,例如 chmod 就不要允許他使用等等!

3. 匿名登入使用者 (anonymous)

雖然提供匿名登入給網際網路的使用者進入實在不是個好主意,因為每個人都可以去下載你的資料, 萬一頻寬被吃光光怎麼辦?但如同前面講過的,學校單位需要分享全校同學一些軟體資源時, FTP 伺服器也是一個很不錯的解決方案啊!你說是吧。如果要開放匿名使用者的話,要注意:

  • 無論如何,提供匿名登入都是一件相當危險的事情,因為只要你一不小心, 將重要的資料放置到匿名者可以讀取的目錄中時,那麼就很有可能會洩密!與其戰戰兢兢,不如就不要設定。
  • 果真要開放匿名登入時,很多限制都要進行的,這包括:(1). 允許的工作指令要減低很多, 幾乎就不許匿名者使用指令啦、(2). 限制檔案傳輸的數量,盡量不要允許『上傳』資料的設定、 (3). 限制匿名者同時登入的最大連線數量,可以控制盜連喔!

一般來說,如果你是要放置一些公開的、沒有版權糾紛的資料在網路上供人下載的話, 那麼一個僅提供匿名登入的 FTP 伺服器,並且對整個網際網路開放是 OK 的啦! 不過,如果你預計要提供的的軟體或資料是具有版權的,但是該版權允許你在貴單位內傳輸的情況下, 那麼架設一個『僅針對內部開放的匿名 FTP 伺服器 (利用防火牆處理) 』是可容許的選項!

如果你還想要讓使用者反饋的話,那是否要架設一個匿名者可上傳的區域呢?答案是建議不要。如果要讓使用者反饋的話,除非該使用者是你信任的,否則不要允許對方上傳! 所以此時一個檔案系統權限管理嚴格的 FTP 伺服器,並提供實體用戶的登入就有點需求啦!

註:本章內容幾乎全部是引用 鳥哥的 Linux 私房菜-檔案伺服器之三: FTP 伺服器


七、結論

老實說 FTP 這篇文章中有很多專有名詞,我也很多部分沒有完全弄懂,所以大部分的內容都來自參考資料,甚至是複製貼上,因為我還沒有能力用自己的話說一遍,只能先將整個架構整理起來,慢慢消化,本文章純為個人筆記之用,若原文作者希望下架請來信。

主要參考引用資料 1:鳥哥的 Linux 私房菜-檔案伺服器之三: FTP 伺服器
主要參考引用資料 2:解說 FTP Protocol 的運作原理
主要參考引用資料 3:FTP 是什麼


作者介紹 - Boison

Boison

台大 MBA 畢業的筆記術達人,在臉書上經營近 5,000 人的閱讀社群「書旅」,平日熱愛將職場所學做筆記分享商業精華,因此又有「筆記狂 Boison」之稱, 歡迎你追蹤我的臉書發落第一手消息:「 Boison 臉書」;出版社正式合作可透過 dragoncres@gmail.com 聯絡。

發表迴響