我是疯子 我怕谁?

所有的东西都是乱弹和自己的技术积累和网络见闻

很详细的linux下ftp假设的教程

tcsm | 11 十月, 2006 20:10

簡易 FTP Server 架設 -- Wu FTP

 
在 Internet 上面的傳輸協定當中, FTP ( File Transfer Protocol ) 算是一個最古老的協定之一了!早期還沒有這麼多好用的協定之前( 例如 SAMBA ),都是使用 FTP 來進行資料的傳遞的呢!另外,一般來說,資料的傳輸以 FTP 這個協定來傳送是相當的快速的,而且某些場合當中其實也相當的方便。不過,值得注意的是,使用 FTP 來傳輸時,其實是具有一定程度的『危險性』,因為資料在 Internet 上面是完全沒有受到保護的『明碼』機制!所以,其實鳥哥不太建議大家使用這個伺服器的啦!尤其當你建置好了 FTP 之後,如果經常進行資料的傳遞,對於您的網路頻寬『真的有很大的損害』啊!不過,無論如何, FTP 仍然有其存在的必要!例如中山大學的 FTP 站就作的相當的棒啊!所以,底下我們就來談一談用在這個古老的協定上面,最古老的伺服器之一: Wu FTP
 
原理
  :FTP 的功能簡介
  :FTP 的運作流程與使用到的 Port
  :什麼是『被動, passive』的連線
  :FTP 的替代方案與安全性問題
  :什麼時候才要設定 FTP 啊!開放誰人連進來
套件安裝
Server 端設定
  :Wu FTP 的結構
  :最簡單的 ftpaccess 設定檔
  :使用 Super daemon 管理 FTP 的情況
  :歡迎畫面的建立、 Readme 檔案與關閉 FTP 訊息內容
  :限制最大線上人數
  :限制與取消使用者的家目錄規範
  :時間相關的設定項目
  :流量與上傳下載總量的限制項目
  :創造 guest user 與 guest user 的家目錄問題
  :anonymous 的根目錄與建立可上傳目錄
  :針對人物(real, guest, anonymous)的限制設定項目
  :拒絕某些使用者與開放某些使用者的登入(/etc/ftphosts, deny-uid, allow-uid)
  :目錄與連結檔的問題
  :建立 passive port 提供 client 端登入
  :修改 FTP 預設的 port 21 的連線
  :一個多樣化的實例
Client 端的使用 FTP 軟體
  :ftp
  :ncftp
Server 端的安全設定項目
  :iptables
  :TCP_Wrappers
  :pam 模組與 /etc/ftpusers 的關係
  :FTP 本身提供的抵擋 username 或 host 的控制項目
重點回顧
參考資源
本章習題練習

原理:
    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. 命令記錄與登錄檔記錄:FTP 可以利用系統的 syslogd 這個 daemon 來進行資料的紀錄,而記錄的資料包括了使用者曾經下達過的命令與使用者傳輸資料(傳輸時間、檔案大小等等)的紀錄呢!
       
    3. 限制或解除使用者家目錄所在(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. Server 端接受後,回應給 Client 端:當 Server 接收到 Client 的要求之後,會回應 Client 端的需求,此時 Server 端會建立等待連線的資源,並且將一帶有 SYN 與確認 (ACK) 的封包送回 Client 端;
       
    3. Client 端回應確認封包:在 Client 端接收到來自 Server 端告知的封包後,會再次的發送一個確認封包給主機,此時,兩邊才會正式的建立起連線的通道,這個步驟 1 ~ 3 就是 Three-Way Handshake(三向交握的啦!)。需要注意的是,這個已經建立連線的通道(通常是 port 21)僅能進行 FTP 的『指令』而已,如果該指令涉及到資料的傳送(data transfer)時,例如上傳或下載等等,那麼就需要額外建立一條資料傳輸的通道才行 ( ftp-data )!而資料傳輸的通道建立則需要繼續底下的步驟
       
    4. Client 端發送資料傳輸要求的命令給 Server:當需要進行資料的傳輸時,Client 端會啟用另一個高於 1024 的埠口來做為連線的準備(這個高於 1024 的埠口與步驟 1 那個埠口不是同一個!),並且 Client 端會主動的利用剛剛已經建立的指令通道(通常是 port 21)發送一個命令告訴 Server 說:『我已經準備好一個資料傳輸的埠口了,請準備進行傳輸吧』!特別留意喔,這個時候 Client 是透過『命令通道』來對 Server 下達命令的,而且已經通知 Server 我(client)要啟用的埠口了喔
       
    5. Server 端以 ftp-data 埠口主動連線到 Client :收到命令之後的 Server 會『主動』的以 ftp-data 埠口(一般為 port 20)向 Client 端通知的那個高於 1024 的埠口進行連線,特別需要留意的是,此時是『Server 端主動向 Client 端的連線』喔,所以該連線的 TCP 封包會帶有一個 SYN 的標誌在
       
    6. 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. 另一個方法就是使用被動式連線 (passive)!什麼是被動式連線呢?想一想,既然『主機主動』連線到我的 NAT 後面的 client 不能成功,那麼我反其道而行,如果以 client 來連到 server 呢?是否就變成如同 port 21 相似的連線方向,如此一來不就可以成功的建立連線了嗎?呵呵!沒錯,而且也不需要啟動上面兩個模組了,並且也不擔心 FTP Server 是否啟用非 port 20 的 ftp-data port 啦!這部份我們底下說明喔。
 

什麼是『被動, passive』的連線
 
既然在 NAT (或防火牆) 後端的 client 無法讓主機主動的來建立連線,那麼我就讓主機『被動的等我 client 去連線』啊!果真如此的話,那麼我的連線狀態變成如何了呢?
 
  1. Client 端主動向 Server 端發送連線需求
     
  2. Server 端接受後,回應給 Client 端
     
  3. Client 端回應確認封包:上面這三個步驟與主動式連線一樣,同樣的完成三向交握後,建立命令通道了!底下說明被動式資料傳輸通道的建立。
     
  4. Client 端發送資料傳輸要求的命令給 Server:與主動式連線不一樣的是,在被動式連線時,Client 端在下達命令之後,並告訴 FTP Server 說『我要使用 PASV 模式(就是 passive 啦!)的方式來進行資料傳輸』;
     
  5. Server 端挑選 > 1024 的埠口等待連線:在接受 client 的 PASV 要求之後,如果沒有特別的設定時 (目前的 FTP 伺服器版本已經可以指定 passive port 來規定被動式連接的埠口號碼 ) ,Server 會隨機選取一個大於 1024 的埠口,並經由命令通道告訴 client 端說:『我已經開了一個 ftp-data 的埠口等妳連線喔!』並開始等待 client 端的連線;
     
  6. 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 &line; 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&line;trivial&line;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]#

评论

发表评论
 authimage
 
Accessible and Valid XHTML 1.0 Strict and CSS
Powered by LifeType - Design by BalearWeb