author: | Yung-Yu Chen (yungyuc) http://blog.seety.org/everydaywork/ <yyc@seety.org> |
---|---|
copyright: | © 2006, all rights reserved |
FTP (File Transfer Protocol) 也是一種很長壽的網際網路服務。最初要在 Unix 系統間跨主機傳檔,通常是依靠一個叫作 uucp (Unix-to-Unix copy) 的程式;不過 uucp 只能作單檔傳輸,而且只有 Unix 能用。所以在網際網路的早期發展階段,FTP 就已經被設計了出來,並且成為檔案主要傳輸方式。
FTP 這種應用採取主從式的架構。通常是有一個 FTP 伺服器,其中存放了要伺服的檔案,而使用者以 FTP 客戶端軟體連接上 FTP 伺服器來要求檔案,進行傳送。FTP 本身的設計就以「傳輸」檔案為主,所以基本上它與後來的 NFS 或 Samba 等檔案伺服系統不同,並不允許使用者對伺服器上的檔案進行隨機存取1。
[1] | 但某些軟體仍然提供編輯 FTP 上檔案的功能,這些軟體通常是文字編輯器。 |
今日全球資訊網的風行,多少影響了 FTP 的使用率;有些以前用 FTP 提供下載的檔案,為了方便和網頁作整合,都改成了 HTTP。不過 FTP 仍然是一套適合網際網路檔案傳輸的協定,遇到有大量檔案要提供的時候,常常還是得使用 FTP 伺服器。
本章我們要探討如何使用 ProFTPd 這一套 FTP 伺服器軟體。過去 FTP 伺服器一直是網路服務主機的一大安全性漏洞,原因在於舊式的 FTP 伺服軟體使用作業系統內的系統工具來實作 FTP 的功能;譬如直接用主機系統內的 /bin/ls 列出檔案系統的內容。等到 ProFTPd 和 vsFTPd 此類強調安全性的 FTP 伺服軟體出現後,情況才較為改觀。
ProFTPd 的 "Pro" 代表 "Professional"。這套軟體系統的組態設定師法 Apache,所有的設定指令都標籤化,也設計有與 .htaccess 對等的目錄設定檔 .ftpaccess。另外,ProFTPd 支援匿名 FTP、虛擬主機,以及多種認證方式。ProFTPd 也和 Apache 一樣有許多額外的模組,提供了多樣化的延伸功能。
首先我們要在 Debian 上安裝 ProFTPd:
$ apt-get install proftpd
安裝時 dpkg 會詢問要以 Inetd 或 Standalone 方式啟動;Inetd 是比較耗費系統資源,反應也比較慢的方式,所以一般會選用 Standalone 模式,讓 ProFTPd 自行管理連線。
預設的 proftpd.conf 如下 (被註解掉的部分未列出)2:
[2] | 和 Apache 一樣,ProFTPd 組態檔的註解符號是 #;所有在 # 這個符號之後的設定均不作用。 |
ServerName "Debian" ServerType standalone DeferWelcome off MultilineRFC2228 on DefaultServer on ShowSymlinks on TimeoutNoTransfer 600 TimeoutStalled 600 TimeoutIdle 1200 DisplayLogin welcome.msg DisplayFirstChdir .message ListOptions "-l" DenyFilter \*.*/ Port 21 MaxInstances 30 User nobody Group nogroup Umask 022 022 AllowOverwrite on
這樣子的組態只允許在系統上有帳號的使用者登入,也就是說,將 ProFTPd 當作提供使用者的檔案窗口來使用。當使用者以自己的帳號登入後,一般會被直接送進家目錄。
讓我們來看看其中的一些基本設定 (一般來說設為 on 表示開啟設定;設為 off 表示關閉設定):
其它沒有提到的指令此時並不是那麼重要,若有必要,我們之後會再討論。
為了測試剛剛建立的 ProFTPd 伺服器,先來安裝 Debian 下的命令列客戶端程式。
我們使用 ncftp (niceftp):
$ apt-get install ncftp
以 ncftp 用自己的帳號登入伺服器,要加上 -u 參數:
$ ncftp -u username localhost
我們登入本機伺服器,故拿 localhost 當主機名稱即可。輸入指令後,伺服器會詢問我們密碼:
NcFTP 3.1.8 (Jul 27, 2004) by Mike Gleason (http://www.NcFTP.com/contact/). Connecting to 127.0.0.1... ProFTPD 1.2.10 Server (Debian) [127.0.0.1] Logging in... Password requested by 127.0.0.1 for user "username". Password required for username. Password:
密碼的輸入會以 * 回應在螢幕上;如果密碼輸入正確,即可登入系統:
User username logged in. Logged in to localhost. ncftp /home/username >
在瀏覽 FTP 伺服器的時候,最常用的就是 ls 指令:
ncftp /home/username > ls collect/ etc/ Mail/ OpenFOAM/ var/ work/ Desktop/ GNUstep/ mbox tmp/ windows/ ncftp /home/username >
我們可以看到自己的家目錄。
除了 ls 之外,還有一些指令是操作 FTP 的時候會用到的:
3, put <localfilename>:將本地的檔案上載至伺服器
ncftp 是比較複雜的 FTP 客戶端程式,有些極簡風格的 FTP 客戶端只允許你直接用 FTP 伺服器的指令來操作,但 ncftp 則提供了比較直覺、shell-like 的指令。``ncftp`` 的指令與 bash 很類似,使用起來相當方便。
要上傳檔案的時候,我們可能會遇到一個問題:如何找到要上傳的檔案?在 ls, cd 等指令前加上 "l" 即可針對本地目錄進行操作,所以我們可以切換到檔案所在的位置,檢視檔名,再用 put 上傳。
如果我們想連線到另外的匿名 FTP 伺服器,把 ncftp 後的 -u 參數拿掉即可。
除了為主機上的使用者提供檔案傳輸服務之外,FTP 也常用於為廣大的外部使用者提供檔案。因為要服務的外部使用者並不會擁有主機上的帳號 (如果是完全公開的伺服器,通常我們也不想要為他們管理額外的帳號),所以會以「匿名 (anonymous)」來登入伺服器。故此,公開的 FTP 服務通常都是匿名的,而匿名伺服器多半就會公開提供檔案。
在 ProFTPd 中是以 <Anonymous> 區塊來設定匿名服務,這個區塊指令的格式為:
<Anonymous rootdir> ... </Anonymous>
起始標籤中的 rootdir 為匿名服務所使用的根目錄位置;一般系統使用者登入時會進入該使用者的家目錄,而匿名登入時則會進入這裡所指定的目錄,並且textbf{只能}存取在這個目錄之下的檔案系統結構。我們通常會把 rootdir 設為主機系統中,一個代表著匿名帳號的使用者的家目錄;在 Debian 上預設為 ftp 這個使用者,而進行
<Anonymous ~ftp>
這樣的設定,指定以 ftp 的家目錄作為匿名 FTP 的根目錄。
Debian 預設的組態檔並沒有把匿名伺服器打開,但相關的指令都寫成註解了。我們可以把這些註解打開,或是把以下我整理出來的這些設定加回去3:
[3] | 我整理的這些設定完全是從 Debian 的預設組態檔抄出來的,只是經過編排。 |
<Anonymous ~ftp> User ftp Group nogroup UserAlias anonymous ftp DirFakeUser on ftp DirFakeGroup on ftp RequireValidShell off MaxClients 10 DisplayLogin welcome.msg DisplayFirstChdir .message <Directory *> <Limit WRITE> DenyAll </Limit> </Directory> # <Directory incoming> # Umask 022 022 # <Limit READ WRITE> # DenyAll # </Limit> # <Limit STOR> # AllowAll # </Limit> # </Directory> </Anonymous>
這裡面有兩個設定指令已經在前面看過了:``DisplayLogin``, DisplayFirstChdir,故不再贅述。
這些指令可以分成兩組,第一組用於設定匿名伺服器本身的組態:
User, Group:指定匿名伺服器執行時的帳號與群組身份。使用者在存取時,會套用成這裡指定的帳號與群組所具備的權限。
UserAlias <login> <id>:這個指令把 <login> 這個名稱對應到 <id> 去,亦即當匿名用戶以 <login> 登入的時候,會被當成 <id>。
DirFakeUser, DirFakeGroup:這兩個指令用來隱藏開放目錄內檔案的真正擁有者與群組。如範例第 5, 6 行的設定,會把匿名伺服器內的擁有者與群組指定為 ftp:ftp,避免被外人得知系統上的使用者名稱,增加入侵者猜測系統帳號與密碼的難度。若是不想要使用這個功能,可以改下
DirFakeUser off DirFakeGroup off
來關閉它們。
另外還有一個 DirFakeMode 指令,可以連檔案的權限都隱藏起來。
RequireValidShell:如果設為 on,則 User 所指定的帳號就必需擁有 shell,才能進入系統。因為在底層系統中代表匿名伺服器的使用者,基於安全的原因,通常都特別不設定有效的 shell (這樣就無法登入底層系統了),所以我們在這邊要把 RequireValidShell 設為 off。
MaxClients:設定可以同時對匿名伺服器連線的數目。作用類似的指令還有 MaxClientsPerHost, MaxClientsPerUser,分別指定一個來源主機與一個使用者可以同時連線的數目footnote{當然,對匿名伺服器來說,設定 MaxClientsPerUser 和 MaxClients 是一樣的;因為伺服器只允許 anonymous 這一個使用者的登入。}。
第二組則設定公開目錄的存取權限:
<Directory> 區塊:為一個或符合條件的目錄進行設定,設定的內容就放在區塊內部。第 11 到第 15 行的 <Directory *> 指定了匿名伺服器裡的所有目錄。
<Limit> 區塊:限制可以使用的指令。
DenyALL:禁止所有的連線。
這個指令通常是與 <Limit> 區塊並用;以第 12 到 14 行的指令來說,會將 <Directory *> 下的所有 WRITE (寫入) 權限都關閉。
我把第 16 到 24 行的組態指令註解掉了,因為它是要用來開啟匿名上傳的設定,而且其中的指令已經都說明過了。關於這一段上傳設定,重點在於第 18 到 20 行的 READ, WRITE,和第 21 到 23 行的 STORE 關鍵字。這整段把 incoming 目錄裡匿名的 STORE (儲存,即上傳) 權限打開,而把 READ (讀取) 和 WRITE (寫入,包含覆寫) 都關起來;造成的結果是匿名使用者可以把新檔案 (及目錄) 上傳到伺服器裡的 /incoming 目錄內,但不能讀取,也不能覆寫其中的內容。
如果真的有需要,再把匿名上傳的設定打開即可;匿名上傳常常會造成管理上的問題。而僅作檔案提供之用的 FTP 伺服器,也不必讓匿名使用者上傳檔案。
ProFTPd 也可以提供虛擬的 FTP 伺服器功能,不過這部分並不像 Apache 那麼有彈性。通常有三種狀況可以用 ProFTPd 虛擬主機來完成:在同一個 IP 上用網域名稱來分隔不同的 FTP 伺服器、在同一台主機上以不同的 IP 配合不同的實體或虛擬網路介面來分隔伺服器4,以及在同一個主機上以相同的 IP 與網域名稱,用不同的通訊埠來分隔伺服器。
[4] | 可以使用多張網路硬體,或是對同一個網路硬體進行 aliasing。 |
ProFTPd 的虛擬主機設定指令也相當簡單:把單一虛擬主機相關的指令寫在該虛擬主機的 <VirtualHost> 設定區塊中即可。這三種虛擬主機的設定也可以組合運用。比較需要注意的是有一些全域的指令不能在 <VirtualHost> 區塊裡使用,詳細的資訊請參考 ProFTPd 的指令參考說明。
如果我們希望達到像 Apache 的 name-based 虛擬主機的效果,可以這樣設定:
<VirtualHost domain.name> ... </VirtualHost>
和以網域分隔的設法類似,但把 domain.name 換成 IP 位址即可:
<VirtualHost xxx.xxx.xxx.xxx> ... </VirtualHost>
使用者將能以可對應到這個 IP 位址的網域名稱來連上虛擬主機,除非所用的網域名稱另外對應到了其它的虛擬主機。
如果我們想在同一個 IP (或網域名稱) 的不同的通訊埠上進行 FTP 服務,可以這樣設定:
<VirtualHost xxx.xxx.xxx.xxx> Port 2221 ... </VirtualHost> <VirtualHost xxx.xxx.xxx.xxx> Port 2222 ... </VirtualHost>
這樣就會把服務分別開在 xxx.xxx.xxx.xxx 這個位址的 2221 與 2222 號埠上。
FTP 可以讓系統上的使用者從其它主機存取自己的資料,也可以當作一種公開檔案下載的服務;如果我們希望,還能利用 FTP 來讓匿名使用者貢獻檔案。
不過,雖然 ProFTPd 是一個很有彈性又高效率的伺服軟體,受限於 FTP 本身的設計,它並不適合工作環境下的檔案分享;如果我們希望在團隊中共用檔案,可能要視作業環境來選用 Samba 或 NFS (又或者是兩者的混合)。
我們另外也討論了 ProFTPd 的虛擬主機設定;它可以幫助我們更有彈性地組態我們的 FTP 伺服器。還有更多的應用與設定指令並沒有被討論到,而 ProFTPd 的指令參考手冊可以幫助你進一步了解這個伺服系統的能力與限制。