伺服器架設篇 - RedHat 9

第二十二章、簡易 FTP Server 架設 -- Wu FTP

最古老的 Wu FTP 伺服器

最近更新時間: 2003/09/13

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
在 Internet 上面的傳輸協定當中, FTP ( File Transfer Protocol ) 算是一個最古老的協定之一了!早期還沒有這麼多好用的協定之前( 例如 SAMBA ),都是使用 FTP 來進行資料的傳遞的呢!另外,一般來說,資料的傳輸以 FTP 這個協定來傳送是相當的快速的,而且某些場合當中其實也相當的方便。不過,值得注意的是,使用 FTP 來傳輸時,其實是具有一定程度的『危險性』,因為資料在 Internet 上面是完全沒有受到保護的『明碼』機制!所以,其實鳥哥不太建議大家使用這個伺服器的啦!尤其當你建置好了 FTP 之後,如果經常進行資料的傳遞,對於您的網路頻寬『真的有很大的損害』啊!不過,無論如何, FTP 仍然有其存在的必要!例如中山大學的 FTP 站就作的相當的棒啊!所以,底下我們就來談一談用在這個古老的協定上面,最古老的伺服器之一: Wu FTP

原理:

    File Transfer Protocol ( FTP ) 是相當古老的網路協定之一,他最主要的功能就是進行 Server 端與 Client 端之間的檔案傳送的功能啦!FTP 其實是以 TCP 封包的模式進行 Server 與 Client 之間的連線,當連線建立之後,使用者可以在 Client 端連上 Server 端進行檔案的下載與上傳,此外,還可以直接管理用戶在 Server 上面的檔案呢,相當的方便!而這個最古老的 FTP 伺服器軟體,大概要算是 Wu FTP 了,所以,底下我們將針對 Wu FTP 進行設定的說明喔!
     

    FTP 的功能簡介
     
    FTP 主機除了單純的進行檔案的傳輸與管理之外,其實他還提供了幾個主要的功能,底下我們約略的來談一談:
     
    1. 不同等級的使用者身份:FTP 預設的情況下可以提供三種主要的身份,分別是(1)實體帳號,real user;(2)訪客, guest;(3)匿名登入者, anonymous 這三種。分成三種身份主要可以做為主機的控管上面的便利性,而且也可以將使用者作一個有效的管理呢!例如實體用戶可以進行的動作可能會比較多一些,至於匿名登入者,大概我們就僅提供他下載一下資源而已,並不許匿名者使用太多主機的資源啊!當然,這三種人物能夠使用的『線上指令』自然也就不相同囉! ^_^

    2.  
    3. 命令記錄與登錄檔記錄:FTP 可以利用系統的 syslogd 這個 daemon 來進行資料的紀錄,而記錄的資料包括了使用者曾經下達過的命令與使用者傳輸資料(傳輸時間、檔案大小等等)的紀錄呢!

    4.  
    5. 限制或解除使用者家目錄所在(change root, 簡稱 chroot):為了避免使用者在您的 Linux 系統當中隨意逛大街,意指離開使用者家目錄而進入到 Linux 系統的其他目錄去,所以將使用者的工作範圍『侷限』在使用者的家目錄底下,嗯!實在是個不錯的好主意!FTP 可以限制使用者僅能在自己的家目錄當中活動喔!如此一來,由於使用者無法離開自己的家目錄,而且登入 FTP 後,顯示的『根目錄』就是自己家目錄的內容,這種環境稱之為 change root ,簡稱 chroot ,改變根目錄的意思啦!這有什麼好處呢?當一個惡意的使用者以 FTP 登入您的系統當中,如果沒有 chroot 的環境下,他可以到 /etc, /usr/local, /home 等其他重要目錄底下去察看檔案資料,尤其是很重要的 /etc/ 底下的設定檔,如 /etc/passwd 等等。這樣他就有辦法取得系統的某些重要資訊,用來『入侵』您的系統呢!所以在 chroot 的環境下,當然就比較安全一些咯!
     

    FTP 的運作流程與使用到的 port
     
    FTP 正常情況下的連線方向:
    我們在網路基礎當中得知,TCP 這種封包由於需要經過 Server 端與 Client 端兩邊的『三向交握』之後,才能確定連線,因此,他可以說是一個比較『可靠』的連線模式,因為雙邊都已經經過確認(ACK)的動作,所以,當然會較為『可靠了』!那麼既然 FTP 主要的工作是讓 Client 與 Server 端可以進行檔案的傳輸,自然需要較為可靠的連線囉,不然檔案資料傳到一半竟然損毀時,怎麼辦?!因此,FTP 當然就是以 TCP 這種封包來進行連線的。在這裡,我們不厭其煩的,再次說明一下 FTP 在正常模式情況(或者稱為主動模式, active)下,主機與 client 端到底是如何建立連線的呢(在不考慮防火牆與其他不知名因素的情況下)?
     
    1. Client 端主動向 Server 端發送連線需求:由於是用戶端想要連上 FTP 主機,所以呢,當然連線的方向首先會由 Client 發起!此時,Client 端隨機選取一個大於 1024 以上的 port 來主動的連線到 FTP 主機提供的 FTP 埠口(通常為port 21),而由於是主動的連線封包,所以這個連線會帶有 SYN 的標誌在;

    2.  
    3. Server 端接受後,回應給 Client 端:當 Server 接收到 Client 的要求之後,會回應 Client 端的需求,此時 Server 端會建立等待連線的資源,並且將一帶有 SYN 與確認 (ACK) 的封包送回 Client 端;

    4.  
    5. Client 端回應確認封包:在 Client 端接收到來自 Server 端告知的封包後,會再次的發送一個確認封包給主機,此時,兩邊才會正式的建立起連線的通道,這個步驟 1 ~ 3 就是 Three-Way Handshake(三向交握的啦!)。需要注意的是,這個已經建立連線的通道(通常是 port 21)僅能進行 FTP 的『指令』而已,如果該指令涉及到資料的傳送(data transfer)時,例如上傳或下載等等,那麼就需要額外建立一條資料傳輸的通道才行 ( ftp-data )!而資料傳輸的通道建立則需要繼續底下的步驟

    6.  
    7. Client 端發送資料傳輸要求的命令給 Server:當需要進行資料的傳輸時,Client 端會啟用另一個高於 1024 的埠口來做為連線的準備(這個高於 1024 的埠口與步驟 1 那個埠口不是同一個!),並且 Client 端會主動的利用剛剛已經建立的指令通道(通常是 port 21)發送一個命令告訴 Server 說:『我已經準備好一個資料傳輸的埠口了,請準備進行傳輸吧』!特別留意喔,這個時候 Client 是透過『命令通道』來對 Server 下達命令的,而且已經通知 Server 我(client)要啟用的埠口了喔

    8.  
    9. Server 端以 ftp-data 埠口主動連線到 Client :收到命令之後的 Server 會『主動』的以 ftp-data 埠口(一般為 port 20)向 Client 端通知的那個高於 1024 的埠口進行連線,特別需要留意的是,此時是『Server 端主動向 Client 端的連線』喔,所以該連線的 TCP 封包會帶有一個 SYN 的標誌在

    10.  
    11. Client 端回應主機端,並繼續完成三向交握:在接到 Server 來的封包之後, Client 會回應一個帶有 ACK 確認的封包,並繼續來完成另一個三向交握的程序,此時,資料傳輸的通道才正式的建立。
     
    如此一來則成功的建立起『命令』與『資料傳輸』兩個通道!不過,要注意的是,『資料傳輸通道』是在有資料傳輸的行為時才會建立的通道喔!並不是一開始連接到 Server 就立刻建立的通道呢!留意一下囉!
     
    使用到的 port:
    由上面的連線資料來看,其實我們會用到的主機的兩個埠口分別是:
     
      (1)命令通道的 ftp (預設為 port 21 ) 與
      (2)資料傳輸的 ftp-data (預設為port 20)
     
    這兩個埠口的工作是不一樣的,首先,那個 port 21 主要是用在接收 Client 端下達的命令之用,例如顯示目錄內的檔案內容 dir 以及上傳下載 (put, get) 等等的指令的;至於 port 20 剛剛上頭約略提過了,就是用在資料傳輸的時候才會建立的一個連線呢!而且,重要的是,兩者的連線方向是不一樣的!首先, port 21 主要接受來自 Client 端的主動連線,至於 port 20 則為主動連線至 Client 端呢!這樣的情況在 Server 與 Client 兩者同時為公共 IP (Public IP) 的 Internet 上面,通常沒有太大的問題,不過,萬一你的 Client 端是在防火牆後端,或者是 NAT 主機後端呢?會有什麼問題發生呢?底下我們來談一談這個嚴重的問題!
     
    在 NAT 或者防火牆後端的 FTP Client 連線問題:
    萬一你的 FTP client 是在 NAT 主機的後端,那由於我們的 NAT 主機會自動的紀錄 client 端向外連線的資訊,所以在 Client 依上面步驟 1 送出要求封包後,步驟 2 的 FTP 回傳的封包可以透過 NAT 轉交給 client ,這沒有問題!所以, Client 連接到 Server 的命令通道 ( port 21 )可以正確的被建立起來的。不過,萬一 Client 端在建立起了命令通道之後,對 Server 下達資料傳輸的命令呢?連線會是如何?我們以底下的圖示來說明好了:
    1. 由於目前的 NAT 主機可以記錄由內部電腦連線出去的資訊,因此,藉由 port 21 的連線可以順利的被建立起來;
    2. 當 Client 端由 port 21 下達資料傳輸的命令時,此時『個人PC』會告訴 FTP Server 說:『我開了一個 >1024 的埠口等你來連線喔』!
    3. 這個時候要特別留意的是,『個人PC』經過NAT主機連線後,在 FTP Server 看到的『個人PC』的 IP 其實是 NAT 那部主機的!所以,這個時候 FTP Server 會主動的由 port 20 向 NAT 主機的 >1024 那個 port 要求建立連線!(請翻閱NAT主機一章)
     
    瞭解問題的所在了嗎?原本我們的 FTP 主機要連線的其實是『個人PC』這部電腦的 >1024 那個 port ,不過,由於 NAT 的關係,所以卻造成了連線是向 NAT 主機的 >1024 那個 port 進行主動連線的!如此一來,想當然爾,NAT 主機並沒有啟動 >1024 那個 port 等 FTP 主機來連線,所以自然無法成功的建立起連線,這個時候你就會看到『Can't build data connection: Connection refused, 無法進行資料傳輸』之類的訊息了!啊!真是慘啊! @_@
     
    那有沒有辦法可以克服這個問題呢?難道真的在 NAT 主機後面就一定無法使用 FTP 嗎?當然不是!目前有兩個簡易的方法可以克服這個問題:
     
    1. 使用 Linux NAT 主機的 iptables 預設模組,亦即 ip_conntrack_ftp 與 ip_nat_ftp 這兩個核心模組!應用 modprobe 這個指令就可以將這兩個模組載入了!我們剛剛說過,既然 iptables (NAT 主機)可以記錄 client 端向外連線的資訊,而 client 端向 server 端要求資料傳輸時,會主動告知 Server 我(client) 要等你來連線的 port ,因此,這兩個聰明的模組可以透過檢查 NAT 主機內的資訊而加以應用,那就可以讓 Server 與 Client 端建立 ftp-data 的連線啦!不過,這兩個模組並不是萬能的,因為這兩個模組目前僅能針對預設的 ftp-data(port 20) 進行檢驗的工作,萬一您連線的是一個使用非 port 20 為 ftp-data 傳輸的主機時,那這兩個模組就沒有辦法發揮其效能了!

    2.  
    3. 另一個方法就是使用被動式連線 (passive)!什麼是被動式連線呢?想一想,既然『主機主動』連線到我的 NAT 後面的 client 不能成功,那麼我反其道而行,如果以 client 來連到 server 呢?是否就變成如同 port 21 相似的連線方向,如此一來不就可以成功的建立連線了嗎?呵呵!沒錯,而且也不需要啟動上面兩個模組了,並且也不擔心 FTP Server 是否啟用非 port 20 的 ftp-data port 啦!這部份我們底下說明喔。
     

    什麼是『被動, passive』的連線
     
    既然在 NAT (或防火牆) 後端的 client 無法讓主機主動的來建立連線,那麼我就讓主機『被動的等我 client 去連線』啊!果真如此的話,那麼我的連線狀態變成如何了呢?
     
    1. Client 端主動向 Server 端發送連線需求

    2.  
    3. Server 端接受後,回應給 Client 端

    4.  
    5. Client 端回應確認封包:上面這三個步驟與主動式連線一樣,同樣的完成三向交握後,建立命令通道了!底下說明被動式資料傳輸通道的建立。

    6.  
    7. Client 端發送資料傳輸要求的命令給 Server:與主動式連線不一樣的是,在被動式連線時,Client 端在下達命令之後,並告訴 FTP Server 說『我要使用 PASV 模式(就是 passive 啦!)的方式來進行資料傳輸』;

    8.  
    9. Server 端挑選 > 1024 的埠口等待連線:在接受 client 的 PASV 要求之後,如果沒有特別的設定時 (目前的 FTP 伺服器版本已經可以指定 passive port 來規定被動式連接的埠口號碼 ) ,Server 會隨機選取一個大於 1024 的埠口,並經由命令通道告訴 client 端說:『我已經開了一個 ftp-data 的埠口等妳連線喔!』並開始等待 client 端的連線;

    10.  
    11. Client 端主動向 Server 端建立連線並繼續完成三向交握:經由命令通道得知 Server 的埠口之後, Client 端會隨機挑選另一個大於 1024 的埠口,並主動向 Server 端的等待連線的埠口進行連線動作,所以此連線封包是帶有 SYN 的標誌的喔!然後 Server 會回應一個帶有 ACK 確認的封包,並繼續來完成另一個三向交握的程序,此時,資料傳輸的通道就正式的建立。
     
    發現上面的不同點了嗎?呵呵!如此一來,在 NAT 主機內部的 Client 就可以順利的連接上 FTP Server 了!這就是在 FTP 連線裡面的所謂被動式連線囉!但是,萬一 FTP 主機是在 NAT 後端那怎麼辦.....呵呵!那可就糗了吧~ @_@這裡就牽涉到更深入的 DMZ 技巧了,我們這裡暫不介紹這些深入的技巧,先理解一下這些特殊的連線方向,這將有助於您未來伺服器架設時候的考慮因素喔!
     
    此外,不曉得您有無發現,呵呵!透過 PASV 模式,Server 在沒有特別設定的情況下,會隨機選取大於 1024 的 port 來提供 Client 端連接之用。那麼萬一主機啟用的 port 被搞鬼怎麼辦?而且,如此一來也很難追蹤來自入侵者攻擊的登錄資訊啊!所以,這個時候我們可以透過 passive ports 的功能來『限定』主機取用的 port number 喔!
     

    FTP 的安全性問題與替代方案
     
    事實上,FTP 是一個不太安全的協定呢!怎麼說呢?很簡單啊!因為 FTP 與 Telnet 相似的,他是以『明碼』的狀態在 Internet 上面流竄的,所以當然就容易被有心人士將你的資料給他抓下來,並且加以利用啦!因此,他當然不是很安全啊!所以,在網路上大家才會常常告誡說,不要隨意架設 FTP 網站啊!否則主機怎麼被破解的都不曉得哩!此外,由於 FTP 軟體常常會有漏洞的問題,因此也要常常更新套件喔!另外,其實拜 SSH 所賜,目前我們已經有較為安全的 FTP 了,那就是 ssh 提供的 sftp 這個 server 啊!這個 sftp-server 最大的優點就是:『他是經過加密的資料!』所以在 Internet 上面流竄的時候,嘿嘿!畢竟是比較安全一些啦!所以,建議您,除非必要,否則的話,使用 SSH 提供的 sftp-server 功能即可~然而這個功能對於一些習慣了圖形介面,或者是有中文檔名的使用者來說,實在是不怎麼方便,因為目前還沒有很棒的 sftp-server 的圖形介面軟體說~所以,有的時候,FTP 站還是有其存在的需要的。如果真的要架設 FTP 網站,那麼還是得需要注意幾個事項喔:
     
    1. 隨時更新到最新版本的 FTP 軟體,並隨時注意漏洞訊息;
    2. 善用 iptables 來規定可以使用 FTP 的網域;
    3. 善用 TCP_Wrappers 來規範可以登入的網域;
    4. 善用 FTP 軟體的設定來限制使用您 FTP 主機的使用者的不同權限啊;
    5. 使用 Super daemon 來進階管理您的 FTP 主機;
    6. 隨時注意使用者的家目錄、以及匿名使用者登入的目錄的『檔案權限』;
    7. 若不對外公開的話,或許也可以修改 FTP 的 port 。
     
    無論如何,在網路上聽過太多人都是由於開放 FTP 這個伺服器而導致整個主機被入侵的事件,所以,這裡真的要給他一直不斷的強調,要注意安全啊!
     

    什麼時候才要設定 FTP 啊!開放誰人連進來
     
    既然(1)FTP 不怎麼安全(2)FTP 的使用者身份至少有三種,那麼在設定 FTP 伺服器之前就需要針對這些不同身份者的登入限制來做規劃囉!以達成較為安全的管理啊!底下我們談一些大致的概念性問題,這些真的是蠻概念的~看看即可!
     
    開放的用戶身份與可能造成的危害
    建議事項
    實體用戶(Real user)
    • 在預設的條件下,開放 FTP 本來就提供了實體用戶登入之用。
    • 不過,需要瞭解的是,以實體用戶做為 FTP 登入者身份時,基本上,系統並沒有針對實體用戶來進行『限制』的,所以他可以針對整個檔案系統進行任何的工作。因此,如果您的 FTP 使用者沒能好好的保護自己的密碼,導致被入侵,那麼你的整個 Linux 系統將很有可能被毀滅啊!
    • 由於實體用戶本來就可以透過網路連接到主機來進行工作,因此實在沒有特別的需要開放 FTP 的服務啊!例如 sftp 本來就能達到傳輸檔案的功能囉!
    • 如果確定要讓實體用戶使用者利用 FTP 伺服器的話,那麼您就需要避免讓幾個系統用的帳號可以登入!這個時候可以將『不想讓他登入』的帳號寫入 /etc/ftpusrs 這個檔案當中啊!例如 root 就是個很好的例子!
    訪客(Guest)
    • 通常會建立 guest 身份的案例當中,多半是由於主機提供了類似『個人 Web 首頁』的功能給一般身份使用者,那麼這些使用者總是需要管理自己的網頁空間吧?這個時候將使用者的身份壓縮成為 guest ,並且將他的可用目錄設定好,即可提供使用者一個方便的使用環境了!且不需要提供他 real user 的權限喔!
    • 僅提供需要登入的帳號即可,不需要提供系統上面所有人均可登入的環境啊!
    • 當然,我們在主機的設定當中,需要針對不同的訪客給他們不一樣的『家目錄』,而這個家目錄與使用者的權限設定需要相符合喔!例如要提供 test 這個人管理他的網頁空間,而他的網頁空間放置在 /home/test/www 底下,那我就將 test 在 FTP 提供的目錄僅有 /home/test/www 而已,比較安全啦!而且也方便使用者啊!
    • 針對這樣的身份者,需要設定較多的限制,包括:上下傳檔案數目與硬碟容量的限制、連線登入的時間限制、許可使用的指令要減少很多很多,例如 chmod 就不要允許他使用等等!
    匿名者(anonymoust)
    • 提供匿名登入實在不是個好主意~因為畢竟你的系統為何要讓別人登入利用呢?
    • 不過,如果是提供整個學校單位來利用的話,那就另當別論了!
    • 無論如何,提供匿名登入都是一件相當危險的事情,因為,只要您一不小心,將重要的資料放置到匿名者可以讀取的目錄中時,那麼就很有可能會洩密!與其戰戰兢兢,不如就不要設定啊~
    • 果真要開放匿名登入時,很多限制都要進行的,這包括:(1)允許的工作指令要減低很多,幾乎就不許匿名者使用指令啦、(2)限制檔案傳輸的數量,盡量不要允許『上傳』資料的設定、(3)限制匿名者同時登入的最大連線數量,可以控制盜連喔!
     

套件安裝

事實上,使用 Wu ftp 來架設你的 FTP 伺服器時,還是以 RPM 的方式來安裝比較好啦!另外,如果您的 Linux distribution 提供其他版本的 FTP 伺服器,呵呵!那麼就不要使用 wu ftp 也沒有關係啊!這是因為 wu ftp 實在是太古老了,所以很多的駭客軟體都是針對他來設計的,也因為如此啊,所以才會產生『Wu FTP 伺服器比較不安全』的情況啊!好了,底下我們以 Red Hat 7.x 的版本來進行說明吧。基本上,一個 FTP 伺服器包含 Server 與 Client 用途的套件至少要有:
 
[root@test root]# rpm -qa | grep ftp
ncftp-3.0.3-6
ftp-0.17-12
wu-ftpd-2.6.1-20
 
其中:
  • wu-ftpd :這就是主要的 FTP 伺服器套件啦!
  • ftp :提供 ftp 指令,就是 client 端的工具啦!
  • ncftp :提供匿名登入的 FTP 網站的 client 端相當棒的另一套連線 FTP 軟體!
如果沒有安裝,請馬上安裝吧!如果不曉得怎麼安裝,那麼請拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』好好的將 mount CD 的指令、搜尋的指令,以及 RPM 的指令瞧一瞧先!

Server 端設定:

    其實 Server 端的設定最主要的就僅有 /etc/ftpaccess 這個主要設定檔啦!幾乎只要他搞定了,FTP 就不會有問題說~不過,由於 FTP 的高危險性,所以其他幾個跟安全較有相關的檔案我們也得來瞧一瞧才行啊!因此上,我們首先就需要來瞭解一下 wu ftp 到底有哪些設定檔案與執行檔呢?
     

    Wu FTP 的結構
     
    Wu FTP 的檔案結構先來瞭解一下,才好繼續進行說明啊!底下主要粗分為設定檔與執行檔進行說明喔!
     
    設定檔: Wu FTP 的設定檔主要有底下這幾個:
    • /etc/ftpaccess:這是最主要的設定檔了!所有跟 Wu FTP 有關的設定內容,都可以在這個檔案做修訂;
    • /etc/pam.d/ftp, 與 /etc/ftpusers:這兩個檔案與 PAM 模組關係較大!在預設的情況中,只要在 /etc/ftpusers 這個檔案內的使用者『都不能使用 FTP 的服務
    • /etc/ftphosts:用來允許或拒絕(allow/deny)某部主機或者某位使用者是否能夠登入 FTP 主機的設定檔案,基本上,這檔案裡面的設定也可以直接在 /etc/ftpaccess 當中設定喔!
    • /etc/xinetd.d/wu-ftpd:這個是用來啟動 FTP 的 daemon 設定檔案~當然啦,主要是掛在 xinetd 這個 daemon 下的,如果是掛在 inetd 這個 daemon 時,就有可能是 /etc/inet.d 底下的檔案囉!
     
    執行檔:除了上面提到的這些設定檔之外,還有一些執行檔也需要瞭解一下:
    • ftpcount :主要用來計算『目前連線的人數』,可以計算出各種身份的連線人數啊!
    • ftpwho:可以顯示出『目前連線的使用者是那個 User ?使用那個 PID?動作多久了?』等等的資訊呢!
    • ftprestart:重新啟動 ftp 啊!
    • ftpshut:指定時候關閉 FTP 的一個指令喔!
    • in.ftpd:這個就是主要的 Wu FTP 的 daemon 囉!我們啟動的 wu ftp 就是他的工作呢!
     
    用戶端的使用執行檔:這個部分的指令並不是 wu ftp 所提供的,但是粉重要,所以先提出說明喔!
    • ftp:就是最陽春的 client 端軟體囉!
    • ncftp:可以使用在匿名 FTP 網站喔!相當棒的軟體!可以支援整個目錄的下載呢!
     
    呵呵!接下來就是那個主要的 FTP 設定檔的設定部分啦!
     

    最簡單的 ftpaccess 設定檔
     
    事實上,與 Wu FTP 關係最大的就是 /etc/ftpaccess 這個檔案啦!只要他設定好,其他的地方相對都不成問題的!而其實 Wu FTP 一開始已經幫我們設定好一個最簡單的 ftpaccess 檔案,我們先來談一談這個檔案的幾個主要的設定項目,然後再來繼續其他的設定項目呢!
     
    [root@test root]# vi /etc/ftpaccess
    # 1. 設定人物群組名稱
    #   設定這個 FTP 伺服器的人物身份設定,使用 class 來設定的!他的語法是:
    #   class <人物群組名稱> <用戶身份1,用戶身份2,..> <允許連線的來源>
     
    class   all   real,guest,anonymous  *
     
    # 上面的意思是說,我設定一個類別群組為 all ,這個 all  裡面就包含了
    # 三種身份的使用者,就是 FTP 預設的 real, guest 與 anonymous 這三個,
    # 需要注意的是,這三個類別的使用者之間是以逗號『,』隔開的,並沒有空白字元
    # 而這個 class 允許的來源來自任何地方『*』。
    # 這個 class 可以多重設定,並且,萬一重複設定時,以第一個出現的 class 類別
    # 為準!舉個例子,假如我的 FTP 裡面的 real 僅允許學術網路登入,至於其他
    # 的 guest 與 anonymous 則雖然可以由任何地方登入,但是不可以由 chinait.com
    # 這個網域以及 61.141.0.0/16 這個網域登入時,那我可以這樣設定兩個 class 喔:
    # class allone real,guest,anonymous *.edu.tw
    # class alltwo guest,anonymous  !*.chinait.com !61.141.0.0/16 *
    # 請注意到,驚嘆號『!』有代表『否,不允許』的意思存在,而星號『*』則代表
    # 任何地方的意思,則如上面所設定時,如此一來,學術單位可以連到我的 FTP ,
    # 至於 guest 與 anonymous 則可以任何地方連進,當然,除了上面的兩個網域之外
    # 所以說,經由這個 class 的設定,就可以輕易的將三種身份是否可以登入主機的
    # 狀態搞定了! ^_^
     
    # 2. 設定系統的 FTP 管理員的 e-mail 信箱位址,與主機名稱!
    #   單純的就是顯示出系統當中 FTP 伺服器管理員的網址啦!預設的設定如下:
     
    email root@localhost
    hostname vbird.adsldns.org
     
    # 一般來說,我會將這個 e-mail 後面的位址寫上可以被使用者發信的信箱,例如:
    # email testing@test.adsldns.org
    # 這樣的格式!這個 email 可能會出現在進出網站時的歡迎畫面當中!
    # 最大的任務是:當使用者發現問題的時候,可以跟系統的管理員聯絡啊!
    # 所以當然要寫下『可以收信』的正常 email 囉!
    # 至於那個 hostname 則僅與歡迎畫面時的變數有關!
     
    # 3. 允許同一次連線當中,錯誤登入的次數
    #   為了避免被不明攻擊者的『暴力攻擊』法,所以在一次連線當中,
    #   僅允許對方最多有 5 次的登入機會,如果密碼或 ID 一直發生錯誤,
    #   則會將該連線『踢』掉的啦!
     
    loginfails 5
     
    # 當然囉!如果您想將登入的次數改小一點的話,也可以使用『loginfails 3』
     
    # 4. 向使用者顯示『README, 讀我』檔案的內容訊息!
    #  當使用者登入或者變換目錄時,若目的端目錄有 README 這個檔案時
    #  (可以附加檔名),則向使用者顯示該檔案的內容!語法為:
    #  <readme> <README*> <動作>
    #  一般來說,動作有『登入』與『變換目錄』,代號為 login 與 cwd=*
     
    readme  README*    login
    readme  README*    cwd=*
     
    # 舉個例子來說,我是 testing 這個身份的使用者,在我的家目錄內有個檔案:
    # /home/testing/data/README.important
    # 那麼當我使用 FTP 軟體連進我的家目錄 (/home/testing) 然後切換目錄到
    # /home/testing/data 後,我的螢幕就會出現『請讀取 README.important』
    # 的字樣囉!以提醒使用者之用!
     
    # 5. 與 readme 的意義蠻相同的!不過這個 message 卻會將後面所接的檔案的
    #  內容直接顯示在螢幕上面,而不僅是告知使用者去讀取而已~
     
    message /welcome.msg            login
    message .message                cwd=*
     
    # 上面的意思是說,當我 login 或者切換到任何有檔名為 .message 的目錄時,
    # 該檔案的內容就會顯示到螢幕上面!一般來說,那個 /welcome.msg 就是
    # 『進站歡迎畫面』囉!這個等一下我們在底下會獨立出一小節來介紹他!
     
    # 6. 是否提供使用者線上立即執行的指令!
    #  一般的格式為:
    #  <指令名稱> <是否允許/yes/no> <針對的對象是誰>
     
    compress        yes             all
    tar             yes             all
    chmod           no              guest,anonymous
    delete          no              anonymous
    overwrite       no              anonymous
    rename          no              anonymous
    umask           no              all
     
    # 以上面的例子來說,我允許任何成功登入我主機的使用者(all)使用我的
    # FTP 主機來執行壓縮這個指令的動作!但是我不許匿名者(anonymous)
    # 使用我的 FTP 主機進行刪除(delete)以及改名(rename)的動作!
    # 你當然還可以增加自己所想要提供,或者減少提供使用者使用的指令!
    # 當然啦,既然 FTP 主要是針對『檔案』,所以指令以檔案的刪除、移動、
    # 更改與壓縮為主!
     
    # 7. 將使用者執行的部分指令歷程記錄到 /var/log/xferlog 這個檔案
    #  FTP 進行上傳、下載或者其他使用者動作時,可以將過程訊息記錄下來,
    #  記錄的檔案就是 /var/log/xferlog 這個檔案囉!語法為:
    #  <log> <欲登錄的項目> <記錄的使用者身份> <何種動作>
     
    log transfers anonymous,guest,real inbound,outbound
     
    # 上面說明的是『針對檔案傳輸(transfers)進行記錄,而針對所有人均紀錄,
    # 分別記錄上傳與下載(inbound,outbound)』,請注意,身份如果有多種,要以
    # 逗號『,』隔開,不要加空白喔!所以,當你的 FTP 使用者連上主機,
    # 並且有任何檔案傳輸的動作時,則檔案大小以及檔案數等資訊,就會被紀錄
    # 到 /var/log/xferlog 裡面去啦!而除了檔案傳輸之外,還有什麼可以紀錄的呢?
    # 基本上,那個『欲登錄的項目』內容就包含了下面幾項資料:
    # a. log commands <身份> :例如『log commands real,anonymous』,表示
    #  real 與 anonymous 這兩種身份的人,在 FTP 上面所下達的任何指令君會
    #  被紀錄在 /var/log/xferlog 裡面
    # b. log security <typelist> :例如『log security guest,anonymous
    #  表示當 guest 與 anonymous 使用者『違反安全機制』時,則會將當時
    #  使用者所下達的指令或者其他動作紀錄下來!
     
    # 8. 關閉 FTP 的設定檔!
    #  我們可以設定關閉 FTP 這個服務的時間,就利用 shutdown 後面接的檔案!
     
    shutdown /etc/shutmsg
     
    # 如果 /etc/shutmsg 不存在,則 FTP 服務就不會被關閉!所以不存在沒關係!
    # 而如果 /etc/shutmsg 存在的話,他的內容包含有底下這些資料(注意:
    # 第一行為時間參數,共有七個時間參數,用空白鍵分隔,而提示文字可以隨便
    # 編寫內容喔!也可以使用變數啊!):
    # <年> <月> <日> <時> <分> <抵擋新連線> <刪除已連線> 
    # <提示文字>
    # 年:任何大於 1970 年的年份;月:0-11!請注意啊!是由 0-11 喔!
    # 0 代表 1 月、 1 代表 2 月!
    # 日:當然就是 1-31 囉!  ;時:由 0-23 ;分:0-59
    # 抵擋新連線與刪除已連線:格式是 HHMM 例如 90 分鐘則是 0130 ,在關機前的
    # 設定時內,會拒絕新連線與將以連線之通道切除喔!例如:
    # 『2003 5 30 12 0 0230 0030
    I will shutdown my FTP server !sorry!
    # 在 2003/6/30 的 12:00 要關閉 FTP ,而 12:00 之前的兩小時30分內(09:30)
    # 就不許新的嘗試登入的連線,而在 30 分鐘前(11:30)就切掉已經已經連線之
    # 使用者連線!事實上,這個 shutdown 蠻有趣的!因為實際上,您的 FTP
    # 服務並沒有關掉,僅只是讓他人無法使用 FTP 而已啊!那麼如何重新啟動呢?
    # 很簡單啊!將 /etc/shutmsg 殺掉,或者裡面的時間更動一下即可!
     
    # 9. 匿名者的密碼驗證:
    #  如果您的 FTP 允許 anonymous 的話,那麼還是需要讓匿名者輸入密碼的,
    #  不過就是密碼的設定比較鬆散就是了!目前的密碼格式為:
    #  <passwd-check> <no|trivial|rfc822> <動作>
     
    passwd-check rfc822 warn
     
    # 上面說的是,以匿名者登入的使用者也需要輸入密碼,而密碼的格式為 rfc822,
    # 如果使用者的密碼不合格,那麼就警告(warn)使用者,但仍允許使用者登入!
    # 密碼的格式方面目前有兩種(no是不需要密碼確認,所以不討論!)
    # trivial:密碼當中必須含有 @ 這個 e-mail 的字元;
    # rfc822 :密碼必須符合 frc822 的規範!
    # 通常我們使用的是 rfc822 即可!至於動作主要有兩種動作:
    # warn   :使用者輸入錯誤的密碼時,僅顯示警告訊息,仍允許其登入;
    # enforce:使用者若輸入錯誤密碼,儲顯示警告訊息,並中斷連線喔!
    # 注意:
    # 如果你不想讓某個 email 的型態通過認證時,可以使用 deny-email 這個
    # 項目來抵擋!舉個例子來說,你不想讓 IE 的預設郵件地址通過認證,可使用
    # deny-email IE?0User@
    # deny-email mozilla@
    # 上面這兩個項目可以同時存在,如果還有不想讓他通過的 email address 
    # 可以持續上面的設定多行!這有什麼用途呢?如果您不想讓 web browsers 
    # 通過密碼的確認,而僅想讓類似一般的 FTP client 來連線,那麼這個
    # 限制項目就有用的很了!因為他可以將 IE 之類的 browsers 擋下來啊!
     
    # 10. 設定允許與不許登入 FTP 伺服器的使用者與群組
     
    deny-uid %-99 %65534-
    deny-gid %-99 %65534-
    allow-uid ftp
    allow-gid ftp
     
    # 這個是在 Red Hat 系統上面新增出來的設定啦!在一般正常的系統當中,
    # UID 小於 100 通常是系統帳號,而 UID 大於 65534 可能有安全上的問題,
    # 所以,我們就直接將這兩段 UID 與 GID 切掉啊!讓他們無法登入,也就可以
    # 拒絕某些不當的入侵攻擊了!那就是 deny-uid 與 deny-gid 的功效!
    # 所以,上面的意義是,小於99與大於65534 的UID/GID都予以抵擋連線;
    # 而開放的 UID 與 GID 則僅有 ftp 這個群組與使用者喔!
    # deny-uid 後面除了接數字外,也可以直接接帳號名稱,例如要擋住 testing 
    # 與 testqq 這個用戶時,可以設定:
    # deny-uid testing testqq 
    # 後面可以接多個 UID 或帳號或者使用範圍,例如抵擋 100 到 1000 之間的 UID 
    # deny-uid 100-1000
    # 至於 allow-uid 則恰好相反啊!就是允許的意思~
     
    事實上,上面的設定並不麻煩,只有幾行而已,只是我們需要瞭解一下每個項目之間的相關性,所以鳥哥我加註了一些說明而已~您可以參考參考的啦!這樣就完成了一個最最簡單的 ftpaccess 這個設定檔囉!準備來去啟動 FTP 囉!
     

    使用 Super daemon 管理 FTP 的情況
     
    目前一般常見的 FTP 伺服器(除非是大型的 FTP 主機)大多是使用 super daemon 來進行統一管理的,而由於目前多半的 super daemon 都使用 xinetd 這個 super daemon ,所以底下我們僅針對這個 xinetd 來進行說明喔!事實上,由於 FTP 是掛在 super daemon 底下的一個服務,所以我們僅需要設定好 xinetd 裡面關於 wu-ftpd 的設定檔,然後『重新啟動 xinetd 』就可以啟動 FTP 囉!在一般的情況下,我們可以發現 /etc/xinetd.d/wu-ftpd 這個主要設定檔內容為:
     
    [root@test root]# vi /etc/xinetd.d/wu-ftpd
    service ftp
    {
            disable = yes  <==就是他,將他改為 no 即可!
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/sbin/in.ftpd
            server_args             = -l -a
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
    }
     
    在上面粗體的地方將 yes 改為 no 即可!因為 disable 是『取消』的意思,那 disable = no 當然就表示『不取消』的意思~這是一個相當簡單的 xinetd 的設定檔,如果要進行多重控制的話,例如:我的主機有兩塊介面卡,一塊對內一塊對外,對內與對外的『開放時間』與『開放網域』及『相關權限』都不相同時,就可以使用其他額外的設定來控制這些參數!由於相關的說明我們已經在『鳥哥的 Linux 私房菜 -- 基礎學習篇』裡面的『認識服務』談過多次,而且,在架站篇裡面的 Telnet 伺服器當中也提過一個簡單的範例,所以這裡就不再多作贅述,請自行前往查閱!
     
    好了,那麼最終終於要來啟動 FTP 囉!趕緊動手重新啟動 xinetd ,並且使用 netstat 來察看一下 port 喔!
     
    [root@test root]# /etc/rc.d/init.d/xinetd restart

    [root@test root]# netstat -tl 
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 *:ftp                   *:*                     LISTEN

    [root@test root]# ftp localhost 
    Connected to localhost (127.0.0.1).
    220 localhost.localdomain FTP server (Version wu-2.6.1-20) ready.
    Name (localhost:testing): testing  <==輸入登入者帳號
    331 Password required for testing.
    Password:  <==輸入你的密碼
    230 User testing logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> exit<==離開 FTP

     
    這樣就 OK 的啦!( 註:還是得注意一下你的防火牆機制與 /etc/hosts.deny 裡面是否將 in.ftpd 這個服務關掉了?!會造成無法連線的原因有很多都是因為沒有將防火牆的機制打開的緣故!請再回頭詳細看一下簡易防火牆設定一文)。如果要關閉 FTP 的話,那就將上面 disable = no 改成 disable = yes 然後再重新啟動 xinetd 即可!相當的簡單吧! ^_^
     

    歡迎畫面的建立、 Readme 檔案與關閉 FTP 訊息內容
     
    歡迎畫面的建立:
    呵呵!建立進站歡迎畫面可就快樂的很了!可以讓大家知道您這位 FTP 主機管理員所下達的『公告』事項喔!我們剛剛在前頭已經設定了進站歡迎畫面(login)的檔案是 /welcome.msg ,注意喔!是放在『根目錄, root』底下,那麼到底 / 是怎麼定義的?是與 Linux 的檔案系統相同還是有其他的規定!?是這樣的:
     
    • 如果您的使用者可以到達系統的根目錄,那麼他將取用 /welcome.msg 這個檔案;
    • 如果使用者只能在自己的家目錄內活動時,那麼此時他的『根目錄』會變成他的『家目錄』!因為這樣他才離不開自己目前所在的目錄啊!例如 test 這個使用者被限制在自己的家目錄內活動,那麼他的進站歡迎畫面則是取用 /home/test/welcome.msg 喔!
    • 至於如果是匿名者登入的話,由於匿名者一定都會被限制在匿名者登入的目錄,所以您也必需要將該檔案放置在他們的根目錄喔!
     
    那麼由於 welcome.msg 裡面其實包含有相當多的可用變數,包括目前的主機、遠端主機名稱、FTP 管理員的 email 以及目前時間等等的變數,我們先來談一談有哪些變數吧:
     
    %T  本地端的主機時間(格式為 Fri Mar 21 11:28:50 2003)
    %F  使用者目前所在目錄之 partition 所剩空間(不一定支援所有系統)
    %C  使用者目前所在的目錄
    %E  系統管理員的 email ,這個就是剛剛設定 ftpaccess 內的 email 值
    %R  遠端主機的 IP 或 hostname !
    %L  本地端主機的名稱或 IP
    %U  使用者的登入帳號名稱
    %M  FTP 主機所能允許的使用者最大連線數量
    %N  FTP 主機目前已經連線的使用者數量
    %B  關於硬碟容量的限額
    %Q  目前的 block 數量
    %I  最大的可用 inodes 
    %i  針對 inodes 的限額
    %H  當過度使用硬碟空間時的時間限制
    %h  當使用過度檔案時的時間限制
    %s  預計關閉 FTP 的時間(與 /etc/shutmsg 有關)
    %r  預計關閉 FTP 前禁止再連線的時間(與 /etc/shutmsg 有關)
    %d  預計關閉 FTP 前已連線的中斷時間(與 /etc/shutmsg 有關)
     
    上面的表格是用在顯示歡迎的訊息的,我們可以建立一個這樣的檔案喔!
     
    [root@test root]# vi /welcome.msg
    Welcome to my FTP site.
    Now is the time ==> %T
    The host name is %L
    You are %U and from %R
    There are %N person in my site, now.
    If you have any problem please call me
    %E
     
    是的!內容只要上面這樣即可!,馬上來測試一下設定的結果
     
    [root@test root]# ftp localhost
    Connected to localhost (127.0.0.1).
    220 vbird.adsldns.org FTP server (Version wu-2.6.1-20) ready.
    Name (192.168.1.100:test): test
    331 Password required for test.
    Password:  <==輸入密碼
    230-Welcome to my FTP site.
    230-Now is the time ==> Fri Mar 21 12:03:49 2003
    230-The host name is vbird.adsldns.org
    230-You are vbird and from 192.168.1.100
    230-There are 1 person in my site, now.
    230-If you have any problem please call me
    230-root@localhost
    230-
    230 User test logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> bye
     
    歡迎畫面已經進入囉! ^_^!就是這麼簡單即可建立一個漂漂亮亮的歡迎畫面呢!甚至您也可以自行設計中文訊息,以輔助中文閱讀啊!此外,您也可以在不同的目錄下編輯『.message』這個檔案,則也可以在使用者進入該目錄時,可以顯示出該目錄當中需要注意的事項喔!這些都是可以使您的 FTP 網站更佳的人性化的工具啦!
     
    關閉 FTP 喔!
    在某些特殊的情況下,可能您會要讓您的 FTP 服務關閉!例如:已經預先知道時間的停電通知、已經規劃好的硬體維護時間、已經設定好的系統停機時間等等,這些時候都需要關閉 FTP 。在這種情況下,通知使用者關機的時間就是一個相當好的設定啦!這個時候您就可以使用 /etc/shutmsg 這個檔案囉!( 註:某些情況當中,使用者可能會希望一天之中某些時候啟動 FTP 而某些時刻關閉 FTP ,例如 8-16 點啟動 FTP 而 16-隔天8點關閉 FTP ,這種情況下,您可以藉由 xinetd 這個 super daemon 的功能來達到這個目的!而不是使用這個 shutmsg 喔!切記 )
     
    我們假設這樣的情況:假設我在 2003/03/30 的 12:00 要關機,並且在關機前的 60 分鐘不許新的連線登入,至於已建立的連線則在關機的 30 分鐘前切斷連線,那麼我就可以這樣編輯 /etc/shutmsg 囉!(特別注意其格式!)
     
    [root@test root]# vi /etc/shutmsg
    2003 2 30 12 00 0100 0030
    我將要關閉連線、請不要再進行連線啦!
    即將關機的時間:%s
    新連線失敗的時間:%r
    已連線關閉的時間:%d

    註:上面的內容格式為兩段,第一段就是時間的參數,分別是:
    年 月 日 小時 分鐘 HHMM HHMM (最後兩個分別是新連線與已連線的斷線時間)
    第二行以後則是一些文字的敘述!可以參考 message 裡面的變數!

     
    如此一來,則當 2003/03/30 的 11:00 以後,新的 FTP 要求封包將不會被連線,至於已經連線的 FTP 則在 11:30 分時,會自動的被系統踢出去喔!此外,上面這一段文字會在你登入 FTP 時顯示在螢幕上面呢!可以讓您很清楚的知道什麼時候主機會終止 FTP 的連線啊! ^_^!特別留意:這個檔案並不會自動的消除,並且,如果設定錯誤,您可能無法連上 FTP ,因此,在過了那個關閉 FTP 的時間點之後,以上面的例子來說,就是 2003/03/30 ,您最好將該檔案刪除啊!不然可能會查不出來『到底是那個環節造成我的 FTP 無法連線』的窘境喔! ^_^
      

    限制最大線上人數
     
    如果由於自己本身的硬體設備問題或者是頻寬的問題,所以不想提供太多的同時連線使用者數量時,可以使用『最大線上人數限制』的項目來規範呢!規範的內容很簡單,同樣的僅要編寫 /etc/ftpaccess 即可!加入底下這一段:
     
    [root@test root]# vi /etc/ftpaccess
    # 規範的格式為:
    # <limit> <人物群組名稱> <最大連線數> <時間> <被拒絕時顯示的文件檔案>
     
    limit all       20 Any      /etc/ftpmaxnumber
    limit guest     10 Any      /etc/ftpmaxnumber
    limit anonymous 5  Any0800-2000 /etc/ftpmaxnumber
     
    由上面的限制當中,我們知道,在 all 這個人物群組當中,最大的同時上線
    人數為 20 人,並且,這個設定是任何時刻均有效(Any),如果你是第 21 個
    連線進來我的 FTP 的人,那麼您的螢幕將會出現 /etc/ftpmaxnumber 這個檔案
    的內容,並且『無法連線進入我的 FTP 』!請特別留意 Any 的大小寫,若
    寫錯時,這個設定將不會生效!
     
    [root@test root]# vi /etc/ftpmaxnumber
    這裡已經太多人啦!請您等一下再進入! ^_^

    [root@test root]# /etc/rc.d/init.d/xinetd restart

     
    這樣就設定完成啦!記得重新啟動 xinetd 喔!我們可以針對不同身份的使用者進行連線數目的限制呢!如同上面的設定,(請注意,那個 Any 大小寫不要搞錯了!另外, Any 後面沒接資料,表示『任何時間』的意思,否則需要以 HHMM 的格式來書寫時間的樣式!)所有的連線最多只能有 20 個,至於 guest 則最多有 10 個,但是 anonymous 則在每天的 8:00 到 20:00 時限制只能有 5 個連線而已~這樣就可以分別限制 OK 啦! ^_^
     

    限制與取消使用者的家目錄規範
     
    這個設定僅對 real users 有用啦!在早期的 Wu FTP 伺服器中,由於沒有考慮到一般用戶可能會胡搞的問題,所以預設所有 real users 登入 FTP 主機後,可以到達任何使用者權限範圍內的所有目錄!例如我是 /home/test 這個使用者,那我可以進入 /etc, /var, /tmp, ... 等等目錄來下載資料,無形之中對於系統的安全性有點『危險』囉!這個時候,如果我們能夠將使用者『侷限』在個別的家目錄當中,例如 /home/test 就成為我 test 這個人的根目錄 / ,由於已經被設定為根目錄啦,自然也就無法去到其他的目錄囉!我們可以這樣做:
     
    [root@test root]# vi /etc/ftpaccess
     
    restricted-uid *
    restricted-uid 200-400 test testing

    [root@test root]# /etc/rc.d/init.d/xinetd restart

     
    上面是兩個例子喔!不要搞錯了!可以分別設定,不要同時設定的啦!如果是星號『*』表示『任何身份 UID』都予以限制其家目錄!如果是底下的設定,則是限制 200-400 以及 test testing 這兩個使用者,讓他們的家目錄變成根目錄,這也就是所謂的 chroot 囉! ^_^!同時可以設定的就是限制 GID 囉!那就是 restricted-gid 啦!
     
    那如果反過來呢?目前較新的版本(例如 Red Hat 7.3 及以後的版本)預設情況下就是設定為 restricted-uid * 的!不過,我就是要讓某幾個使用者可以到處瀏覽啊!那就使用 unrestricted-uid 以及 restricted-gid 即可!例如
     
    [root@test root]# vi /etc/ftpaccess
    unrestricted-uid test testing
     
    可以理解嗎?加油喔! ^_^
     

    時間相關的設定項目
     
    或許有的時候你會發現一件事情,那就是『怎麼我幾分鐘沒有動作,我的 FTP 主機就將我踢出來咯?』就是說,當我們登入 FTP 主機後,如果隔了一段時間沒有動作 ( 這個沒有動作的時間我們叫做 idle ,也就是停頓的意思 ),那麼 FTP 主機會主動的認為 client 端可能使用者忘記登出了!因此會自動的將使用者踢出系統!不止如此喔!有的時候,如果您下載一個大型的檔案,例如 100 MB 的資料檔好了,偏偏您是使用撥接 (理論最大下載速度 8KBytes/second ),所以應該會下載粉久粉久!但是偏偏就是 20 分鐘後, FTP 主機卻主動的將這個持續下載的連線關閉!這又是為什麼?這是顧慮到可能有惡意者在『盜連』網站,所以才會有這樣的設定!
     
    這些時間的設定是蠻重要的啦!如果您不希望才離開一下子怎麼 FTP 就踢人~那麼就可以修改一下這些預設的數值囉!我們來看看底下的這些設定吧!您都可以自行修改這些設定喔!不過,請依您的需求來考量!
     
    [root@test root]# vi /etc/ftpaccess
    # 時間參數預設都是以 秒 為單位的!

    timeout accept 120
    # FTP 這個 daemon 會等待一個 PASV 的連線多久?由於 client 端的連線可能
    # 受限於一些網路頻寬或者其他的因素,導致無法立即連上時,我們的 daemon
    # 預設就會等待 120 秒來期待 client 端的連線成功!

    timeout connect 120
    # 與 accept 有點類似,不過 accept 是在等待 client 端的要求之回應,而 
    # connect 則是在等待確認的回應!亦即三向交握內的 client 端回應 ACK 的
    # 封包囉!

    timeout data 2400
    # 當我們下載檔案的時候,最多 FTP 可以讓我們下載或上傳一個檔案多久?
    # 一般來說,由於目前大家都使用 ADSL 來傳輸,所以資料傳送不算慢,
    # 不過,萬一您的檔案太大了,導致傳送速度很慢,那就比較麻煩啦!
    # 通常這個設定的預設值是 1200 ,不過,建議可以大一點,例如 2400 可達 40
    # 分鐘,對於傳輸速度較慢的使用者會比較好一點!

    timeout idle 1800
    # 就是我們上面提到的,多久沒有動作會被踢掉?預設是 900 ,你可以改大一點!

    timeout maxidle 1800
    # 與 idle 類似!不過由於 Client 端可以要求延長 idle 的時間,因此,
    # 還會有所謂的 maxidle 喔!您大可將這兩個咚咚都設定一樣即可!

    limit-time anonymous 30
    limit-time guest    100
    # 這個項目在設定『一次連線內,多久會被強制斷線?』以上面的例子來說,
    # anonymous 每次登入之後,可以取得 30 分鐘的工作時間,如果超過 30 分鐘,
    # 系統會主動的將他踢出去!(強制斷線!)這個項目對於 real user 沒有效果!

     
    這樣就算是設定完畢啦!記得重新啟動 xinetd 喔!這樣子您就比較不用擔心 idle 的問題啦! ^_^
      

    流量與上傳下載的限制項目
     
    關於流量上下傳的限制與總體流量的限制方面, wu ftp 也提供了許多的設定來規範! 我們分別來談一談幾個常見的流量控制方法:
     
    整體檔案數目與檔案容量的限額:
    如果你要限制整組人員每次登入時,在該次登入可以上下傳輸的檔案數量或容量的限額時,就需要使用到 file-limit 與 data-limit 了!可以這樣使用的啦:
     
    [root@test root]# vi /etc/ftpaccess
    # 給予的限制情況:
    # <file-limit> <in|out|total> <數目或 bytes 數> <身份群組>
     
    file-limit out 32   alltwo
    data-limit in  10240 alltwo
     
    # 上面的設定說明是這樣的, alltwo 是一個 class 群組,這個在最前頭
    # 規定出來的啦!而 in 代表上傳、out 代表下載, total 則代表總量!
    # 第一個範例是說, alltwo 這個群組當中的任何使用者,在一次登入當中,
    # 可以下載的檔案總數,這是以檔案數量來計算的!至於第二個範例,則是說
    # 在 alltwo 這個群組中的任何使用者,均僅可『上傳 10KB 的容量』!
    # 注意喔!那個數字代表的是 Bytes 的,要換算成 KBytes 則需要除以 1024 
     
    這個東西可以限制的有趣啦!不過他僅針對整個群組來進行限額的設定!這個群組是由 class 的項目來規範出來的!而且,這個規定是針對『一次登入』來規範的,也就是說,以第一個範例來說,你這次登入可以下載 32 個檔案,然後就無法下載了,沒關係,離線,再連線,又可以下載 32 個檔案,這樣應該可以理解吧?!這樣也可以優化你的頻寬喔!
     
    限制流量的方法 throughput:
    使用 throughput 可以限制使用者在不同的目錄底下的傳輸速率喔!查看一下方式:
     
    [root@test root]# vi /etc/ftpaccess
    # 給予的限制情況:
    # <throughput> <根目錄> <次目錄> <檔名> <bytes/s> <倍數> <位址>
     
    throughput /var/ftp   *       * 10240 - *
    throughput /home/test  /public_html  * 51200 - *
    throughput /home/test  /realdown   * oo   - *.vbird.org
     
    # 上面我設定了兩個有被限制的下載目錄,分別是 /var/ftp 這個目錄,以及
    # /home/test/public_html 這個目錄,需要注意的是, 10240 代表 10Kbytes 
    # 喔!設定錯誤會讓使用者下載到瘋掉啊!此外,那個 /home/test/realdown
    # 則是『全速』開放給使用者下載喔!
     
    這個指令對於想要優化自己主機網路頻寬的朋友真是太有用了!我們可以限制使用者(不論任何身份,均有效)在不同的目錄底下,具有不一樣的下載速度,如此一來,可以讓主機的頻寬花在該花的地方,而不至於被其他不明使用者佔用了太多的頻寬去呢!我就蠻喜歡的說~一般來說,如果您將您所提供的檔案放置在一個下載目錄,而這個目錄裡面又分為多個次目錄,那麼可以使用上面第二個範例的例子,將根目錄與次目錄分開來書寫,然後可以指定不同次目錄底下的傳輸速度,例如第二與第三個範例的樣式啊!另外,特別留意的是:
    • 如果想要開放全部的頻寬 (就是全速、不限制下載的速度) 那就需要使用 oo 才行!注意喔!不是數字的零,而是英文字母小寫的 o 喔!
    • 那麼什麼是倍數呢?倍數就是下載的速度乘上的一個倍數值,舉個例子好了,如果我的下載速度是 51200 (50KBytes),而我想要開放到 1000KBytes ,那麼那個倍數的地方就寫上 20 就對了!但是,如果是 1.0 倍呢?這個時候可以寫 1 也可以寫『 - 』這個減號!
    • 最後一個是 Client 端的主機名稱或位址 (IP)。
     
    上傳、下載的比例 ratio 設定:
    如果想要使用上傳、下載比例的用處時,那很有可能需要重新編譯你的 wu-ftp 喔!因為他需要額外的參數來加入這個功能!無論如何,我們先介紹如何使用這個設定,有興趣的朋友可以自行研究編譯的問題啊!
     
    [root@test root]# vi /etc/ftpaccess
    # 給予的限制情況:
    # ud-dl-rate <數字> <使用者身份群組>
     
    ul-dl-rate 2 all
     
    # 這表示 所有的人物 可以上傳 1M 下載 2M 的意思!
     
    請特別留意的是,這個設定項目要『Wu FTP 有支援才行』,所謂的有支援就是他必需要被編譯到執行程式當中!一般來說,預設的 distribution 是有支援這個項目的,所以您可以發現這個設定是可以生效的!不過,要注意的是,由於最後面接的是『使用者群組身份』而不是 real, guest 與 anonymous 的設定,這個與 class 的相關設定有關!因此,在設定之初,最好就已經將這三組人物分別歸類於三個群組當中,會比較妥當一點啦! ^_^!也就是說,這個設定項目不能使用 real, guest 與 anonymous 等!
     
    而如果想讓使用者知道『他的上下傳資料』,可以使用底下的變數功能喔!
     
    %xu  可上傳的 bytes 數
    %xd  可下載的 bytes 數
    %xR  上傳與下載的比例 (1:n)
    %xc  剩下的可用 bytes 數
    %xT  時間限制 (分鐘)
    %xE  由開始登入到目前的時間預估(分鐘)
    %xU  上傳限制 (與 file-limit 及 data-limit 的 in  有關)
    %xD  下載限制 (與 file-limit 及 data-limit 的 out 有關)
     
    例如編輯一個檔案名稱為 .message 在使用者常常下載的目錄底下,讓他一登入該目錄就會顯示該檔案內容啊!內容有點像這樣:
     
    [root@test root]# vi .message
    您可以上傳/下載的比例為 1:%xR
    您此次登入至目前剩下的時間:%xT
    由登入到目前為止使用的時間:%xE
    您可以上傳的最大容量(KBytes):%xU
    您可以下載的最大容量(KBytes):%xD
     
    是不是很方便呢?! ^_^
     

    創造 guest user 與 guest user 的家目錄問題
     
    什麼是 guest 呢?剛剛我們上面談了這麼多的資訊,還是沒能提到這個 guest 是什麼咚咚?事實上,在 Wu FTP 當中,這個 guest 也必須要存在 /etc/passwd 當中的!他的密碼也是經由比對 /etc/shadow 來達成的!那不就是『Real Users』嗎?怎麼會是訪客?是這樣的,由於擔心某些使用者會使用其他的系統資源,因此,僅讓這個 User 可以使用被限制住很多權限的帳號,也就是說,我們將他的權限『壓縮』成為訪客而已,而不是讓他以 real user 的身份登入我們的系統啦!
     
    那麼什麼時候會用到 guest 呢?舉個例子來說,如果我的主機是 WWW 伺服器,而且我有開放給外部電腦 (例如我的好朋友啊等等的) 來使用時,那麼我的朋友自然需要將網頁資料傳送上來對吧!然而我又不希望他會使用我主機裡面其他的功能,此時,我就可以將他的帳號裡面關於 shell 的部分設定成為怪怪的 shell !例如 /sbin/nologin!這樣他就無法登入主機,但是還是可以進行 FTP 的連線的啦!
     
    假如我有一個使用者帳號為 test ,雖然他的家目錄是 /home/test ,但是我僅想要讓他可以在 /home/test/public_html 這個目錄下活動,而且還可以在他進入主機給予一些訊息,此外,我也不許他可以登入系統,那該怎麼作呢?
     
    1. 修改一下該帳號的 shell 部分欄位,舉個例子來說,假如我的帳號是 test ,那麼在 /etc/passwd 裡面應該就會變成:
    2. [root@test root]# vi /etc/passwd
      .... 略 ....
      test:x:511:100:testacount:/home/test:/sbin/nologin
      .... 略 ....
      修改一下該使用者,讓他的 shell 成為 /sbin/nologin 吧!
       
    3. 再來將上面使用的怪怪 shell 加入到 /etc/shells 當中:
    4. [root@test root]# vi /etc/shells
      /bin/sh
      /bin/bash
      /bin/tcsh
      /bin/csh
      /bin/zsh
      /sbin/nologin
      最底下一行是我們加入的喔!為了讓 FTP 能被使用的啦!
       
    5. 修改一下 ftpaccess 裡面相關的設定囉:
    6. [root@test root]# vi /etc/ftpaccess
      # 幾乎就是新增兩行即可: guestuser 與 guest-root 
       
      guestuser test
      guest-root /home/test/public_html test
       
      # 第一行說的是要將 test 這個使用者變成 guest 啦!
      # 第二行則是說, test 這個使用者的家目錄是在 /home/test/public_html 
       
    7. 重新啟動 xinetd 即可!
     
    作一個簡易的 guest user 真的不難喔!此外,這個使用者的 FTP 家目錄就是 /home/test/public_html ,並且,無法離開這個目錄到其他的 Linux 下的目錄喔!比較安全的啦!^_^!與此同時,需要來強調的是,既然 guestuser 比較安全,那麼可以將我整個系統裡面的 User 都變成是 guest user ,而僅有一兩個帳號是 real user 嗎?當然可以囉!假設我的 test1, test2 這兩個是實體用戶,其他的都將成為訪客,那我就給他:
     
    [root@test root]# vi /etc/ftpaccess
     
    guestuser *
    realuser  test1 test2
     
    # test1 與 test2 中間用空格隔開!這樣就成功啦!
     
    很簡單不是嗎?!
     

    anonymous 的根目錄與建立可上傳目錄
     
    瞭解了 guest 的家目錄設定之後,那麼我們再來談到更為麻煩的,就是那個 anonymous 啦!我們曉得在 Red Hat 7.2 當中預設的 anonymous 家目錄是在 /var/ftp 當中,那麼是否可以使用其他的目錄來取代這個目錄呢?確實是可以的,假設我們以 /home/ftp/public 做為 FTP 預設的 anonymous 家目錄時,我可以加入一行設定使得這個家目錄生效:
     
    [root@test root]# vi /etc/ftpaccess
     
    anonymous-root /home/ftp/public
     
    不論您是否多麼不願意相信,這一行就可以讓您的 anonymous 家目錄的所在生效囉!不過,在預設的狀態中, anonymous 是『不許上傳資料』的!怎麼辦?沒關係,我們可以設定 upload 這個參數來允許使用者上傳資料到主機端呢!假設我的 anonymous 可以傳送資料(檔案與目錄)到 /home/ftp/public/upload ,而且傳送到主機的檔案所屬人為 ftp 所屬群組則是 sys ,不過,卻僅能傳送檔案到 /home/ftp/public/upfiles 但是不可以在這個目錄當中建立其他目錄!此時可以這麼做:
     
    [root@test root]# vi /etc/ftpaccess
    # 格式很簡單,就是:
    # upload <家目錄> <次目錄> <yes|no> <檔案所屬人> <群組> <權限> <目錄>
     
    anonymous-root /home/ftp/public
    upload /home/ftp/public /upload  yes ftp sys 0666
    upload /home/ftp/public /upfiles yes ftp sys 0666 nodirs

    # 第二行顯示的是,我的 /home/ftp/public/upload 可以允許匿名者上傳資料,
    # 並且上傳到主機的檔案所屬人與群組為 ftp/sys ,此外,檔案的權限為 0666 
    # 至於 /home/ftp/public/upfiles 這個目錄當中則僅能上傳檔案,不能建立目錄

     
    由於登入者為匿名者 ( anonymous ) ,所以預設是『沒有身份』的,這個時候我們就必須要讓上傳的檔案具有『身份』才行,所以才會要指定目錄之外,還需要指定檔案的身份啊!此外,要『真正可以讓 anonymous 上傳資料』還需要 Linux 檔案權限的配合,舉個例子來說,在 Linux 當中,我們就必須要讓 /home/ftp/public/upload 這個目錄可以讓 ftp 使用者與 sys 群組來進行寫入的工作才行!
     

    針對人物(real, guest, anonymous)的限制設定項目
     
    除了預設的一些設定值之外,我們還可以針對各個不同身份的使用者進行『檔案權限』的控制喔!那就是跟檔案權限有關的以及程序執行順序有關的 umask 以及 nice 值啦!在設定之前,請先瞭解一下什麼是 umask 與 nice 喔!請再次的拿出『基礎學習篇』讀一下裡面的內容吧!底下我們就實際來介紹一下囉!
     
    [root@test root]# vi /etc/ftpaccess
    # nice   <數值> <使用者群組或身份>
    # defumask <數值> <使用者群組或身份>
     
    nice 10 anonymous
    nice -5 real
    defumask 022 real
    defumask 002 anonymous
     
    # 請務必搞懂什麼是 nice 與 umask 喔!上面的 defumask 就是 default umask 
    # 的意思!不難理解吧?!
     
    需要注意的是, nice 值只有 root 可以設定為負值,而且 nice 值越小表示這個執行程序『越快』被執行!而 umask 則是預設取消的權限,相關的說明請務必瞭解!(這是很重要的觀念!)
     

    拒絕某些使用者與開放某些使用者的登入
     
    拒絕不良的 IP 或網域或 domain :
    如果您發現惡意的使用者來自於某些 IP 或者是主機名稱時,而想將他抵擋住的時候,當然最好的方法還是以 iptables 將他整個踢出系統之外。但是,如果您發現的情況是,某些使用者暫時的使用方式讓您的 FTP 產生了困擾,例如大量下載某些檔案,或者是不當的使用 FTP 所提供的資源時,所以想暫時讓他無法使用 FTP 。您想讓他瞭解一下『為何會被取消使用 FTP 的權力』的情況下,可以使用下列的參數來進行這樣的設定資訊:
     
    [root@test root]# vi /etc/ftpaccess
    # 準備抵擋囉!就以 <deny> <位址或主機名稱> <回覆給使用者訊息的文件>
     
    deny 192.168.0.100  /etc/ftpdeny.msg
    deny *.adsldns.org  /etc/ftpdeny.msg
     
    # 上面的設定當中,當 192.168.0.100 這個 IP 來的 FTP 要求封包時,
    # 不僅不提供其 FTP 的連線,並且會顯示 /etc/ftpdeny.msg 這個檔案的內容!
    # 同樣的,只要來自 .adsldns.org 的網域的電腦也都會被抵擋啊!

    [root@test root]# vi /etc/ftpdeny.msg
    您無法直接登入這部主機,請與您的 FTP 管理員聯絡!
    管理員 E-Mail 位址為: %E

     
    如此一來,則當 192.168.0.100 這個來源 IP 的任何使用者來連接 FTP 時,在他們的 FTP 軟體上面,就會顯示出問題的所在啦!至於聯絡人則是以 %E 這個 email 變數做為聯繫的!
     
    拒絕某些危險的帳號:
    在我們的 Linux 系統上面,由於主機套件上面的需求,所以都會預設有一些基本的帳號存在的!例如常見的 adm, bin, sys, 以及 mail 上面常見的 mail !同時,也有一些常見的群組存在的!要注意的是,這些帳號通常僅有系統工作的時候才會用到,其他一般身份使用者不太會使用這些帳號的啦!此外,由於系統帳號常常會侷限在 UID 1~499 以內,而大於 65000 以上的帳號應該不常見的!所以,我們可以拒絕使用這些 UID 與 GID 來登入 FTP 主機的!這就需要用到 deny-uid 與 deny-gid 的設定項目啦!此外,事實上,如果您也發現某些可疑的帳號時,也可以先以這個設定項目將他拒絕在您的系統之外喔!使用的方法如下:
     
    [root@test root]# vi /etc/ftpaccess
    # 就直接使用最初的設定 deny-uid <帳號、UID或範圍>
     
    deny-uid %-499 %65000-
    deny-gid %-499 %65000-
    allow-uid ftp
    allow-gid ftp
     
    這樣的方式也可以用來抵擋一些不合法的 UID 啊!
     
    使用額外檔案來抵擋:/etc/ftphosts
    我們也可以使用 /etc/ftphosts 來進行使用者僅可以用來連線的主機喔!這個檔案的設定方法有點像底下這樣:
     
    [root@test root]# vi /etc/ftphosts
    # 格式為 <deny> <使用者帳號> <不許連線的IP或主機名稱>
    # 格式為<allow> <使用者帳號> <不許連線的IP或主機名稱>
     
    deny test   192.168.0.0/24
    allow testing 192.168.1.0:255.255.255.0
    # 注意上面這兩種書寫方式的不同的!

    deny test2    192.168.5.10 allow test2 *

     
    上面說明的是,我不許 test 由 192.168.0.0/24 這個網域來!但是允許 testing 這個使用者來自 192.168.1.0/24 !請注意這兩種方式!當以 bit 書寫時,就直接加上 / ,至於如果是以 netmask 來書寫時,則是加上冒號『:』。需要特別注意的是,如果同時存在兩條同一個人的設定,例如:
      deny  test *
      allow test *
    這樣的情況下『最後出現的那一條規則為預設的規則!』所以結果就是 test 可以由任何地方進來 FTP 主機喔!這裡還請特別留意啊!此外,進行完上面的設定後,請記得重新啟動 xinetd 啊!
     
    使用 PAM 模組的機制來抵擋:
    上面的幾個案例都是在 FTP 的設定檔裡面規定的,也就是說,上面的設定都是您的 Client 端已經進入在 FTP 裡面之後再來進行抵擋的動作的!那麼有沒有還不需要動到 FTP 就抵擋的機制呢?除了我們後面才會提到的 iptables 以及 TCP_Wrappers 之外,我們還有個 PAM 密碼驗證模組可以利用呢!首先來看一下 PAM 模組裡面關於 FTP 的基本內容:
     
    [root@test root]# vi /etc/pam.d/ftp
    #%PAM-1.0
    auth       required     /lib/security/pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed <==此行與上行為同一行
    auth       required     /lib/security/pam_stack.so service=system-auth
    auth       required     /lib/security/pam_shells.so
    account    required     /lib/security/pam_stack.so service=system-auth
    session    required     /lib/security/pam_stack.so service=system-auth
     
    仔細的看一下上面的檔案喔!粗體的部分那一行裡面的 sense 是 deny 喔!這表示寫到 /etc/ftpusers 裡面的使用者名稱代表『無法登入 FTP 系統的使用者』!哈哈!所以說,只要是這個檔案裡面的任何使用者就無法通過密碼驗證 (由 PAM 模組管理的 ) 這一關,自然也就無法使用 FTP 了!因此,當您不想讓某個 User 進入你的 FTP 使用者,只要將他的名字寫入這個 /etc/ftpusers 當中,那該使用者就無法使用 FTP 了!但是不會影響到其他的 daemons 的服務喔!還不錯吧! ^_^
     
    讓 root 可以使用 FTP 功能:
    除了上面提到的之外, /etc/ftpusers 裡面的內容大部分的帳號都是來自於系統帳號,這包括每個 Linux 都會存在的 root 這個帳號!所以 root 自然也就無法登入系統的 FTP 服務了。如果我真的想要讓 root 可以使用 FTP 的功能,我需要怎麼作呢?
    1. 首先,請先將 /etc/ftpusers 裡面的 root 拿掉;
    2. 確認 /etc/ftphosts 沒有擋掉欲登入的主機的 IP 或者是 hostname;
    3. 確認 /etc/ftpaccess 裡頭關於 deny-uid 與 deny-gid 沒有 0 這個數字存在!
    4. 重新啟動 /etc/rc.d/init.d/xinetd 這個 daemon !
    這樣大概就可以讓 root 登入啦!不過『強烈建議不要這麼做!』
     

    目錄與連結檔的問題
     
    除了使用連結檔之外,我們可以直接讓使用者以『 cd {某目錄名稱} 』進入到該目錄下!而且是不論在任何目錄下均可進行這個動作喔!這樣一來有個好處啦,就是如果很多 real user 的檔案當是集中在某個目錄底下的,那麼直接使用這個功能就不需要到每個使用者的家目錄裡面建立連結檔囉!
     
    [root@test root]# vi /etc/ftpaccess
    # alias <你想要給這個目錄起的名字> <實際 Linux 系統的目錄>
     
    alias  anonymousdir  /var/ftp
     
    如同上面的設定,當使用者在任何地方只要下達『 cd anonymousdir 』就可以進入到 /var/ftp 這個目錄當中啦!請注意,這個 alias 『僅針對 cd 這個指令有用』!您可以將這個 anonymousdir 目錄定義寫在 /welcome.msg 當中,讓使用者可以知道有什麼功能呢!還不錯吧!但是有個問題必須要瞭解的,那就是我們知道了 restricted-uid 可以限制住某個使用者讓他僅能在『家目錄』當中活動,而無法移動到其他目錄去!現在想像一個案例,如果我的 test 這個使用者被限制在家目錄 /home/test 裡面,那麼如果我在 /home/test 裡面建立一個連結檔,連結到 /home/ftp 這個目錄,那麼是否 test 就可以利用這個連結檔移動到 /home/ftp 去呢?還有,這個 alias 所建立的目錄是否可以讓使用者離開自己的家目錄呢?『很抱歉』答案是否定的!也就是說,不論是建立連結檔或者使用 alias ,您都無法離開被限制住的目錄喔!
     
    此外,為了避免 anonymous 這些匿名者上傳的時候傳送一些奇怪的檔名,例如傳送 windows 裡面的檔案名稱,那就有可能包含了很多怪異的特殊字元,這些特殊字元可能會造成我們 Linux 系統的一些困擾。為了避免這些問題,我們可以『指定』anonymous 不能上傳某些怪異的檔案名稱的檔案,使用下面的過濾機制:
     
    [root@test root]# vi /etc/ftpaccess
    # path-filter <群組> <訊息檔案> <允許字元> <不許字元1> <不許字元2> ...
     
    paht-filter anonymous /etc/pathmsg ^[-A-Za-Z0-9._]*$ ^\. ^-
     
    [root@test root]# vi /etc/pathmsg
    請注意,您的檔案名稱不符合本站的限制,請檢查:
    1. 檔名起始字元需為英文或數字或底線;
    2. 檔名起始字元不可為 . 或者減號 - 
     
    在上面的設定當中,我們可以發現,在 /etc/pathmsg 後面除了第一個是『允許』的字元外,其他後續接的都是『不允許的字元!』至於這些字元的規格則與正規表示法『Regular Expression』有關喔!上面的意思是說,檔名開頭(^符號表示開頭)只能是英數字,而不能是小數點與減號!這裡請特別注意正規表示法喔!他是很重要的!請再次的勞駕到『基礎學習篇』察看正規表示法吧!而萬一使用者上傳的檔案檔名是『錯誤的,主機不允許的』情況時,則會將 /etc/pathmsg 這個檔案裡面的訊息告知使用者!當然,這個檔名是可以變動的!
     

    建立 passive port 提供 client 端登入
     
    建立 passive port 給 client 端使用是有其必要性的!這個我們在前言的部分已經提過了!但是,又由於可能會導致『難以追蹤入侵者』的問題,讓這個 passive 變的棘手~此時, passive ports 這個可以指定 port number 的設定就可以讓我們定義出少量的 port 來做為 passive 之用囉!那該怎麼作呢?更加的簡單!只要幾個設定就可以搞定啦!
     
    [root@test root]# vi /etc/ftpaccess
    # passive ports <CIDR 位址> <最小 port> <最大 port>
    # pasv-allow   <人員身份> <位址>
     
    passive ports 0.0.0.0/0 65501 65505
    pasv-allow all *
     
    # 這代表來自任何地方的 IP 在要求 passive 連線模式時,將以 65501 ~ 65505 
    # 之間的 port 來做為他們 PASV 連線的要求啦!如此一來,則 passive ports
    # 將僅會隨機選取 65501 ~ 65505 之間的 5 個 port 來做為 PASV 之用,
    # 其他的 port 將不會使用到 FTP 的 passive 模式!如此一來還可以建置
    # 防火牆上面的 port mapping 呢!很不錯吧! ^_^
     
    就這樣一個設定就可以讓您的 passive 模式的連線當中,限制他的相關的 ports 囉!此外,如果您的 FTP 是在 NAT 內部的話,那麼就可以就由 firewall 的 port mapping 的動作來進行 PASV 的轉 port 作用來達成內部 FTP 主機的被動連線喔! ^_^
     

    修改 FTP 預設的 port 21 的連線
     
    在約略瞭解了大部分常用的 Wu FTP 功能之後,咦!如果我不想使用 21 這個 port 做為我 FTP 預設的指令通道,那麼是否有辦法修改這個 port 號碼呢?舉個例子來說,我希望我的 FTP port 為 3366,有的!就是利用兩個檔案,分別是:
     
    • Xinetd 這個 Super daemon 的設定檔:/etc/xinetd.d/wu-ftpd
    • Port 對應 daemon 名稱的檔案:/etc/services
     
    修改的方法很簡單!我們先來看一下 wu-ftpd 這個檔案的內容之後,再來進行進一步的說明:
     
    [root@test root]# vi /etc/xinetd.d/wu-ftpd
    service ftp
    {
            disable = no
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/sbin/in.ftpd
            server_args             = -l -a
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
    }
     
    事實上,重要的地方就是那個 service ftp 的地方!這個 ftp 的 port 就是寫在 /etc/services 當中的啦!所以說,如果我將 /etc/services 裡面的 ftp port 修改一下,那就可以改 port number 啦!不過,這還不是個好主意~我還可以透過自行給予的 daemon name 來進行設定喔!舉個例子來說,如果我要建立一個名為 vbftp 的 daemon 名稱,那我可以這樣做:
     
    1. 修改 wu-ftpd 這個裡面關於 daemon 的名稱:
     
    [root@test root]# vi /etc/xinetd.d/wu-ftpd
    service vbftp <==修改這裡就對啦!
    {
            disable = no
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/sbin/in.ftpd
            server_args             = -l -a
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
    }
     
    2. 修改 /etc/services 的 daemon 相關設定內容
    [root@test root]# vi /etc/services
     
    vbftp    3366/tcp
     
    # 上面這一行可以加在這個 /etc/services 裡面的最後一行!自己設定的啦!

    3. 重新啟動 xinetd
     
    [root@test root]# /etc/rc.d/init.d/xinetd restart

     
    這樣就可以修改您的預設 FTP port 囉!加油是看看!
     

    一個多樣化的實例
     
    好了,大致上 Wu FTP 的設定您應該可以理解了吧!那麼現在出個例題給大家思考一下,假如我需要達成底下的規範,那麼應該如何設定 Wu FTP 相關的檔案呢?
     
    1. 將群組設定成為 real, guest, anonymous 這三個群組分別控制!(用 class 來區分喔!);
    2. 用戶身份有 real, guest, anonymous,其中, real 僅允許來自 140.116.0.0/16 這個 B class 的網域,其他兩者雖可來自於所有網域,但不允許來自 61.141.0.0/16 這個 B Class 的網域;
    3. 允許使用 passive ports ,port number 設定為 65501 - 65510 這 10 個 ports ;
    4. 系統裡面小於 499 以及大於 65000 的 UID 與 GID 都被拒絕登入;
    5. 任何時刻,最大線上人數限制為 30 人,其中, guest 最多 10 人,而 anonymous 最多為 5 人;
    6. 實體用戶 mysiteuser 被限制他僅能在他的家目錄當中工作,無法離開其家目錄,至於其他實體用戶則不在此限;
    7. 我有兩個 WWW 的個人用戶 wwwuser1 與 wwwuser2 ,我將這兩個用戶訂為 guest 身份,為使他的網頁資料傳輸方便,將他的 FTP 主機的家目錄設定為他的 WWW 家目錄,亦即為 /home/wwwuser1/public_html ,並且設定傳輸速度最大為 100 Kbytes/second。注意,我的 ftp 使用者預設的群組為自行建立的 myftpusers;
    8. 我有一個 FTP 交換連結用戶 ftpuser,我與他交換連結,連上下傳都需要注意!上下傳比例為 1.0 ,並且限制他傳輸的速度為 64 Kbytes/second ;
    9. 其他的匿名登入者的家目錄設定為 /var/ftp 這個目錄當中,並且限制 anonymous 一次連線最久 10 分鐘,而且最多僅能下載 20 個文件,以及 10MB 的資料量,此外,傳輸速度最快僅能到達 32 Kbytes/second。至於上傳的設定方面,僅允許上傳到 /var/ftp/upload 這個檔案,此外,預設檔案擁有者為 ftp 群組是 sys,上傳速度最快為 16 Kbytes/second;
     
    似乎很麻煩,那我們就來一個一個的設定吧!
     
    1. 先設定使用者的帳號:

    2. 上面的案例中,我們共有 wwwuser1, wwwuser2, ftpuser 與 mysiteuser 這四個人,由於 mysiteuser 為實體用戶,所以不要去改他的登入 shell ,至於 wwwuser1, wwwuser2 與 ftpuser 由於他的群組需建立成為 myftpusers ,所以需要設定一下啦!假設 myftpusers 尚未建立,所以得先建立群組才能建立使用者!並且這兩個使用者單純的想要使用 FTP 而已,所以直接加上 shell 為 /sbin/nologin:
      [root@test root]# groupadd myftpusers
      [root@test root]# useradd -m -g myftpusers -s /sbin/nologin wwwuser1
      [root@test root]# useradd -m -g myftpusers -s /sbin/nologin wwwuser2
      [root@test root]# useradd -m -g myftpusers -s /sbin/nologin ftpuser
      [root@test root]# passwd wwwuser1  <==不要忘記給三個人密碼!
       
    3. 開始設定我們的 /etc/ftpaccess 內容:

    4. 設定的項目我們將他分為(1)主機設定(2)實體用戶設定(3)訪客(4)匿名者等部分來設定囉:
      [root@test root]# vi /etc/ftpaccess
      # 底下的資料為 VBird 的 FTP 主機設定範例
      #
      ########################################################################
      # 1.  針對 Server 的設定項目:
      ########################################################################
      # 1.1 針對群組的設定項目
      class           all             real,guest,anonymous    140.116.0.0/16
      class           allreal         real                    140.116.0.0/16
      class           allguest        guest                   !61.141.0.0/16  *
      class           allanonymous    anonymous               !61.141.0.0/16  *

      # 1.2 其他主機相關的設定項目
      email           vbird@tsai.adsldns.org
      hostname        tsai.adsldns.org
      shutdown        /etc/shutmsg
      loginfails      3
      log             transfers       anonymous,guest,real    inbound,outbound
      passwd-check    rfc822          warn

      # 1.3 訊息管理
      readme          README*         login
      readme          README*         cwd=*
      message         /welcome.msg    login
      message         .message        cwd=*

      # 1.4 指令管理
      compress        yes             all
      tar             yes             all
      chmod           no              guest,anonymous
      delete          no              anonymous
      overwrite       no              anonymous
      rename          no              anonymous

      # 1.5 人物登入管理
      deny-uid        %-499           %65000-
      deny-gid        %-499           %65000-
      allow-gid       myftpusers

      # 1.6 時間相關的設定值
      timeout data    2400
      timeout idle    1800
      timeout maxidle 1800

      # 1.7 主機最大連線人數設定
      limit   all             30      Any     /etc/ftpmaxnumber

      # 1.8 被動的 port 設定
      passive ports   0.0.0.0/0       65501   65510
       

      ########################################################################
      # 2.  針對實體用戶的設定
      ########################################################################
      restricted-uid  mysiteuser
       

      ########################################################################
      # 3.  針對 guest 用戶的設定
      ########################################################################
      limit           allguest        10      Any     /etc/ftpmaxnumber
      guestuser       wwwuser1        wwwuser2        ftpuser

      # 3.1 www users
      guest-root      /home/wwwuser1/public_html      wwwuser1
      guest-root      /home/wwwuser2/public_html      wwwuser2
      throughput      /home/wwwuser1/public_html      *   *   102400  -       *
      throughput      /home/wwwuser2/public_html      *   *   102400  -       *

      # 3.2 FTP users
      guest-root      /home/ftpuser                   ftpuser
      ul-dl-rate      1       allguest
      throughput      /home/ftpuser   *       *       64000   -       *
       

      ########################################################################
      # 4.  針對 anonymous 用戶的設定
      ########################################################################
      limit           allanonymous    5       Any     /etc/ftpmaxnumber
      anonymous-root  /var/ftp
      limit-time      anonymous       10
      file-limit      out             20              allanonymous
      data-limit      out             10000000        allanonymous
      throughput      /var/ftp        *       *       32000   -       *
      throughput      /var/ftp        /upload *       16000   -       *
      upload          /var/ftp/upload yes ftp sys 0666 

       
    5. 建立可上傳目錄與使用者家目錄:

    6. 由於我們設定了 /var/ftp/upload 為可上傳的目錄,所以需要動手設定一下囉:
      [root@test root]# mkdir /var/ftp/upload
      [root@test root]# chown ftp:sys /var/ftp/upload
      [root@test root]# mkdir /home/wwwuser1/public_html
      [root@test root]# mkdir /home/wwwuser2/public_html
      [root@tset root]# chown wwwuser1:myftpusers /home/wwwuser1/public_html
      [root@tset root]# chown wwwuser2:myftpusers /home/wwwuser2/public_html
       
    7. 修訂一下 /etc/shells:

    8. 必須要確認 /sbin/nologin 在這個檔案內
      [root@test root]# vi /etc/shells
      /bin/bash
      ....(略)...
      /sbin/nologin
       
    9. 修改一下歡迎畫面檔案:

    10. 你可以建立一下歡迎畫面喔!檔案有這些:
        /welcome.msg
        /home/wwwuser1/public_html/.message
        /home/wwwuser2/public_html/.message
        /var/ftp/welcome.msg
      如果想要一勞永逸,那麼將 /welcome.msg 這個檔案複製到 /etc/skel/welcome.msg 以及 /etc/skel/public_html/.message 則是一個不錯的主意!
       
    11. 重新啟動 xinetd 囉!
     
    大致的流程就是這樣啦! ^_^

Client 端的使用 FTP 軟體

事實上,我們在網路常用指令那個章節當中已經介紹過了 ftp 與 ncftp 這兩個很好用的 client 端軟體了,在這裡我們再次的強調一下這兩個軟體,其中,比較重要的是強調傳輸的模式。在 Server 與 Client 傳輸的過程中,資料的流動主要分為 binary 與 ascii 兩種模式,需要注意的是:
  • Binary 的傳送方式當中,FTP Server 並不會去改變檔案的內容,所以資料得以完整的呈現;
  • 但在 ASCII 傳輸模式當中,主要將資料視為一般的純文字檔,例如:原始碼或者是設定檔等等,在這種傳輸模式當中,Server 會將檔案以一行一行來傳送,所以如果您以 ASCII 傳送經過編譯過的 binary program 時,將可能導致無法執行的問題(因為被轉成文字檔啦!)
底下我們就來介紹兩個軟體吧!
 

  • ftp

  • 遠端傳送資料當中,速度最快的協定之一
    語法
    [root @test /root]# ftp [-p] host [port]
    參數說明:
    -p :啟動 PASSIVE 模式!
    範例:
    [root @test /root]# ftp localhost     <==預設是以 port 21 來進行連線
    [root @test /root]# ftp localhost 1354   
    如果你設定的 ftp 的 port 非正規的 21 ,則可以這樣!

    [root @test /root]# ftp localhost  <==連接到遠端主機
    Connected to localhost (127.0.0.1).
    220 localhost FTP server (Version wu-2.6.1-20) ready.
    Name (127.0.0.1:test): test
    331 Password required for test.
    Password: <==輸入密碼
    230 User test logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> dir          <==顯示遠方主機的內容
    ftp> cd           <==變換遠端主機的目錄
    ftp> close or bye or exit <==離開遠端主機
    ftp> get file       <==取得遠端主機的檔案
    ftp> mget file       <==取得所有的檔案,例如 mget .bash* !
    ftp> put file       <==將本地端檔案 file 丟到遠端主機上
    ftp> mput file       <==與 mget 差不多意思啦!
    ftp> delete file      <==殺掉遠端主機的 file 檔案
    ftp> help         <==顯示求救指令!
    ftp> mkdir dir       <==在遠端主機上面建立目錄
    ftp> lcd          <==變換本地端路徑!
    ftp> ascii or binary    <==重要的很!上面提過的!

     

  • ncftp

  • 登入匿名主機最好用的文字介面 FTP 軟體!
    語法
    [root @test /root]# ncftp [host]
    [root @test /root]# ncftp [ftp://domain.name/path]
    參數說明:
    可以直接連接到 host 主機,也可以直接連接到主機的某個路徑之下,相當的方便
    範例:
    [root @test /root]# ncftp ftp.nsysu.edu.tw   <==連接到中山大學 FTP 站
    [root @test /root]# ncftp ftp://ftp.nsysu.edu.tw/Linux
    直接連接到 Linux 底下的 Linux 目錄下!

    遠端主機的一些服務指令:
    ncftp /pub/Linux > cd Redhat      <==變換目錄
    ncftp /pub/Linux > dir         <==顯示目前目錄下的檔案與目錄資訊
    ncftp /pub/Linux > get file1       <==將 file1 的資料存到本地端
    ncftp /pub/Linux > get -z file1 file2  <==將 file1 存到本地改檔名為 fill2
    ncftp /pub/Linux > get -A file1 file2  
    將 file1 以累積的方式(append)增加到 file2 這個檔案
    ncftp /pub/Linux > pub file       <==將檔案由本地端上傳至遠端!
    ncftp /pub/Linux > rename file1 file2  <==將遠端的主機之 file1 更名為 file2
    ncftp /pub/Linux > rm file       <==刪除檔案
    ncftp /pub/Linux > rmdir directory   <==刪除目錄
    ncftp /pub/Linux > mget directory  <==可以下載『整個目錄』的資料!很棒吧!

    本地端主機的一些指令功能:
    ncftp /pub/Linux > lcd      <==變更本地端目前所在的目錄
    ncftp /pub/Linux > lls      <==顯示目前本地端所在目錄的檔案與目錄資訊
    ncftp /pub/Linux > lmkdir    <==在本地端建立目錄
    ncftp /pub/Linux > lpwd     <==顯示目前本地端主機的所在目錄
    ncftp /pub/Linux > lrm     <==刪除本地端的檔案
    ncftp /pub/Linux > lrmdir    <==刪除本地端的『目錄』


    Server 端的安全設定項目:

      事實上,由近年來公佈的安全漏洞資訊來看,這個 Wu FTP 所造成的漏洞真的是不少,所以,在架設 Wu FTP 時,一定要注意到安全性的設定項目上面,這個真的很重要!因為由網路上朋友回報的資訊來看,目前最大宗的 Linux distribution (7.x 版本) 連上 Internet 之後,被入侵的最熱門 port 就是 Wu FTP 囉!所以,我們才會一再地強調『非必要,不要架設 FTP 』。一般來說,我們會這樣建議大家:
       
      1. 除非真的必要,否則盡量將 FTP 的 port 21 關掉;
      2. 如果真的要架設 Wu FTP ,請『一定要』將 Wu FTP 更新到最新的版本;
      3. 更新完畢之後,在架設之前,一定要考慮清楚,是否要開放 anonymous 的連線?除非必要,否則僅開放 Real 以及 guest 使用者登入即可;
      4. 設定時,最好在 /etc/ftpaccess 就限制連線者的位址,以杜絕可能的入侵者的嘗試;
      5. 盡量將使用者限制在他們自己的家目錄內;
      6. 將不想讓他連線的帳號以 PAM 模組來抵擋,亦即將使用者帳號寫入 /etc/ftpusers 裡面即可;
      7. 可以的話,以 iptables 以及 TCP_Wrappers 架設兩層防火牆,限制住開放的網域即可。
       
      由設定、PAM 模組、TCP_Wrappers、iptables 共有四層防火牆,這樣會比較安全一些,不能說就『高枕無憂』啦,但是會比較放心一些!我們約略的提一下防火牆的相關設定吧!
       

      iptalbes
       
      最外層的防火牆可以說就是這樣 iptables 了,在設定之前,我們就必需要瞭解的是,我的 port 是幾號?一般來說, port 至少有 21 以及 20 兩個,但是不要忘記了,還有 passive ports 喔!這裡我們假設 FTP 僅允許來自 140.116.0.0/16 這個 B Class ,而 passive ports (假設我們沒有使用 related 那個防火牆設定項目)開放 65501 至 65505 共五個,那麼我就應該在我的防火牆規則加入這幾段:
       
      /sbin/iptables -A INPUT -p TCP -i eth0 -s 140.116.0.0/16 --dport 20:21   \
        -j ACCEPT
      /sbin/iptables -A INPUT -p TCP -i eth0 -s 140.116.0.0/16 --dport 65501:65505\
        -j ACCEPT 
       
      這樣就限制了 FTP 僅可以使用的 ports ,其他更多的防火牆規劃,請參考『簡易防火牆』那個章節吧!
       

      TCP_Wrappers
       
      TCP_Wrappers 的設定我們在『簡易防火牆』那一章節已經提過了,這裡僅針對 FTP 提出設定項目:
       
      [root@test /root]# vi /etc/hosts.allow
      in.ftpd : 140.116.0.0/255.255.0.0

      [root@test /root]# vi /etc/hosts.deny
      in.ftpd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
      /bin/echo; /usr/sbin/safe_finger @%h ) | \
      /bin/mail -s "%d -%h security" root@localhost & \
      : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入,您的連線將會被紀錄,並且作為以後的參考\n\n ". )

       
      這樣一個小型的防火牆就建置起來啦!而且,只要有人 scan 你主機的 ftp port ,就會立刻被記錄下來喔!
       

      pam 模組與 /etc/ftpusers 的關係
       
      要登入 FTP 之前需要輸入密碼對吧!輸入密碼就可以利用 PAM 模組來進行過濾囉!目前我們使用的 PAM 模組是放置在 /etc/pam.d 這個目錄中,而 ftp 則是 /etc/pam.d/ftp 這個檔案,在前頭我們也約略提過這個檔案啦,主要就是將要被抵擋的使用者帳號寫入到 /etc/ftpusers ,那麼該帳號想要登入 FTP 時,就會被 PAM 模組的過濾系統擋掉!相當簡易吧!而且還很有效呢! ^_^
       

      FTP 本身提供的抵擋 username 或 host 的控制項目
       
      除此之外, FTP 的設定檔裡面 /etc/ftpaccess 也有 deny 與 deny-uid 等等的抵擋機制,您也可以使用 /etc/ftphosts 來抵擋,關於這些檔案的設定在本章前面都提過了,請翻閱參考囉! ^_^

    重點回顧

    • FTP 是 File Transfer Protocol 的簡寫,主要的功能是進行 Server 與 Client 端的檔案管理、傳輸等事項;
    • Wu FTP 是很常見的一個 FTP 軟體,不過由於安全性,建議務必升級到最新版本,此外,他的主要設定檔是 /etc/ftpaccess 這一個;
    • 除了 Wu FTP 這個 FTP 軟體之外,其實可以使用 SSH 提供的 sftp 功能來取代 FTP;
    • FTP 這個 daemon 比較常以 super daemon 來管理,亦即 xinetd 或者是 inet 這兩個 super daemon ;
    • FTP 這個 daemon 所開啟的正規的 port 為 20 與 21 ,其中, 21 為指令通道, 20 為資料傳輸通道;
    • FTP 的傳輸路線主要分為主動與被動(Passive, PASV),如果是主動的話,則 ftp-data 以 20 傳送,否則則以 /etc/ftpaccess 規定的 passive ports 或者隨機選取大於 1024 的 port 來進行被動式連線模式;
    • 一般來說, FTP 上面共有三個群組,分別是實體用戶、訪客與匿名登入者(real, guest, anonymous);
    • 可以藉由修改 /etc/passwd 裡面的 Shell 欄位,來讓使用者僅能使用 FTP 而無法登入主機;
    • 可以使用 guestuser 及 guest-root 來限制實體用戶,使成為訪客用戶;
    • 需要以 upload 來設定可以讓 anonymous 上傳的目錄,並設定好其權限喔!
    • FTP 的指令、與使用者活動所造成的登錄檔是放置在 /var/log/xferlog 裡面;
    • 在 Client 端使用 ftp 這個程式時,可以加上『 ftp -p hostname』來讓連線變成 passive 模式。

    參考資源


    本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看)

    • FTP 在建立連線以及資料傳輸時,會建立哪些連線?
    • FTP 主動式與被動式連線有何不同?
    • 有哪些動作可以讓您的 FTP 主機更為安全 ( secure ) ?
    • 我們知道 ftp 會啟用兩個 ports ,請問這兩個 port 在哪裡規範的?而且,一般正規的 port 是幾號?
    • Wu FTP 的主要設定檔在哪裡?
    • 在 Wu FTP 的設定檔當中,那個 log transfer 是幹嘛用的?
    • 在 Wu FTP 的設定檔當中,那個 passive ports 是幹嘛用的?
    • 那一個檔案可以用來抵擋類似 root 這種系統帳號的登入 FTP?
    • 在 FTP 的 server 與 client 端進行資料傳輸時,有哪兩種模式?為何這兩種模式影響資料的傳輸很重要?

    • 前往參考用解答
    修改歷史:
    2003/03/26:第一次完成 2003/09/13:修改部分內容,增加了詳細說明 chroot 的地方去!
    2003/03/26以來統計人數
    其他連結
    環境工程模式篇
    鳥園討論區
    鳥哥舊站

    今日 人數統計
    昨日 人數統計
    本月 人數統計
    上月 人數統計