鸟哥的Linux私房菜(服务器)- 第二十一章、文件服务器之三: FTP 服务器
最近更新日期:2011/08/08
| FTP (File Transfer Protocol) 可說是最古老的協(xié)議之一了,主要是用來進行檔案的傳輸,尤其是大型檔案的傳輸使用 FTP 更是方便!不過,值得注意的是,使用 FTP 來傳輸時,其實是具有一定程度的『危險性』, 因為數據在因特網上面是完全沒有受到保護的『明碼』傳輸方式!但是單純的 FTP 服務還是有其必要性的,例如很多學校就有 FTP 服務器的架設需求啊! |
21.1?FTP 的數據鏈路原理
21.1.1?FTP 功能簡介
21.1.2?FTP 的運作流程與使用到的端口
21.1.3?客戶端選擇被動式聯(lián)機模式
21.1.4?FTP 的安全性問題與替代方案
21.1.5?開放什么身份的使用者登入
21.2?vsftpd 服務器基礎設定
21.2.1?為何使用 vsftpd
21.2.2?所需要的軟件以及軟件結構
21.2.3?vsftpd.conf 設定值說明?
21.2.4?vsftpd 啟動的模式
21.2.5?CentOS 的 vsftpd 默認值:?使用本地端時間
21.2.6?針對實體賬號的設定:?SELinux,?chroot,?限制帶寬,?最大上線人數,?可用賬號列表
21.2.7?僅有匿名登錄的相關設定:?匿名的根,?可上傳下載,?僅可上傳,?被動式聯(lián)機埠口
21.2.8?防火墻設定
21.2.9?常見問題與解決之道
21.3?客戶端的圖形接口 FTP 聯(lián)機軟件
21.3.1?Filezilla
21.3.2?透過瀏覽器取得 FTP 聯(lián)機
21.4?讓 vsftpd 增加 SSL 的加密功能
21.5?重點回顧
21.6?本章習題
21.7?參考數據與延伸閱讀
21.8?針對本文的建議:http://phorum.vbird.org/viewtopic.php?p=118520
21.1 FTP 的數據鏈路原理
FTP (File transfer protocol) 是相當古老的傳輸協(xié)議之一,他最主要的功能是在服務器與客戶端之間進行檔案的傳輸。 這個古老的協(xié)議使用的是明碼傳輸方式,且過去有相當多的安全危機歷史。為了更安全的使用 FTP 協(xié)議,我們主要介紹較為安全但功能較少的 vsftpd 這個軟件吶。
2.1.1 FTP 功能簡介
FTP 服務器的功能除了單純的進行檔案的傳輸與管理之外,依據服務器軟件的設定架構,它還可以提供幾個主要的功能。 底下我們約略的來談一談:
-
不同等級的用戶身份:user, guest, anonymous
FTP 服務器在預設的情況下,依據使用者登入的情況而分為三種不同的身份,分別是:?(1)實體賬號,real user;(2)訪客, guest;(3)匿名登錄者, anonymous?這三種。這三種身份的用戶在系統(tǒng)上面的權限差異很大喔!例如實體用戶取得系統(tǒng)的權限比較完整, 所以可以進行比較多的動作;至于匿名登錄者,大概我們就僅提供他下載資源的能力而已,并不許匿名者使用太多主機的資源啊! 當然,這三種人物能夠使用的『在線指令』自然也就不相同啰! ^_^
-
命令記錄與登錄文件記錄:
FTP 可以利用系統(tǒng)的?syslogd?來進行數據的紀錄, 而記錄的數據報括了用戶曾經下達過的命令與用戶傳輸數據(傳輸時間、檔案大小等等)的紀錄呢! 所以你可以很輕松的在 /var/log/ 里面找到各項登錄信息喔!
-
限制用戶活動的目錄: (change root, 簡稱 chroot)
為了避免用戶在你的 Linux 系統(tǒng)當中隨意逛大街 (意指離開用戶自己的家目錄而進入到 Linux 系統(tǒng)的其他目錄去), 所以將使用者的工作范圍『局限』在用戶的家目錄底下,嗯!實在是個不錯的好主意!FTP 可以限制用戶僅能在自己的家目錄當中活動喔!如此一來,由于使用者無法離開自己的家目錄,而且登入 FTP 后,顯示的『根目錄』就是自己家目錄的內容,這種環(huán)境稱之為 change root ,簡稱 chroot ,改變根目錄的意思啦!
這有什么好處呢?當一個惡意的使用者以 FTP 登入你的系統(tǒng)當中,如果沒有 chroot 的環(huán)境下,他可以到 /etc, /usr/local, /home 等其他重要目錄底下去察看檔案數據,尤其是很重要的 /etc/ 底下的配置文件,如 /etc/passwd 等等。如果你沒有做好一些檔案權限的管理與保護,那他就有辦法取得系統(tǒng)的某些重要信息, 用來『入侵』你的系統(tǒng)呢!所以在 chroot 的環(huán)境下,當然就比較安全一些咯!
21.1.2 FTP 的運作流程與使用到的端口
FTP 的傳輸使用的是 TCP 封包協(xié)議,在第二章網絡基礎中我們談過, TCP 在建立聯(lián)機前會先進行三向交握。不過 FTP 服務器是比較麻煩一些,因為?FTP 服務器使用了兩個聯(lián)機,分別是命令信道與數據流通道 (ftp-data) 。這兩個聯(lián)機都需要經過三向交握, 因為是 TCP 封包嘛!那么這兩個聯(lián)機通道的關系是如何呢?底下我們先以?FTP 預設的主動式 (active) 聯(lián)機來作個簡略的說明啰:
圖 21.1-1、FTP 服務器的主動式聯(lián)機示意圖
簡單的聯(lián)機流程就如上圖所示,至于聯(lián)機的步驟是這樣的:
如上圖所示,客戶端會隨機取一個大于 1024 以上的埠口 (port AA) 來與 FTP 服務器端的 port 21 達成聯(lián)機, 這個過程當然需要三向交握了!達成聯(lián)機后客戶端便可以透過這個聯(lián)機來對 FTP 服務器下達指令, 包括查詢檔名、下載、上傳等等指令都是利用這個通道來下達的;
FTP 服務器的 21 埠號主要用在命令的下達,但是當牽涉到數據流時,就不是使用這個聯(lián)機了。 客戶端在需要數據的情況下,會告知服務器端要用什么方式來聯(lián)機,如果是主動式 (active) 聯(lián)機時, 客戶端會先隨機啟用一個埠口 (圖 21.1-1 當中的 port BB) ,且透過命令通道告知 FTP 服務器這兩個信息,并等待 FTP 服務器的聯(lián)機;
FTP 服務器由命令通道了解客戶端的需求后,會主動的由 20 這個埠號向客戶端的 port BB 聯(lián)機, 這個聯(lián)機當然也會經過三向交握啦!此時 FTP 的客戶端與服務器端共會建立兩條聯(lián)機,分別用在命令的下達與數據的傳遞。 而預設 FTP 服務器端使用的主動聯(lián)機埠號就是 port 20 啰!
如此一來則成功的建立起『命令』與『數據傳輸』兩個信道!不過,要注意的是, 『數據傳輸信道』是在有數據傳輸的行為時才會建立的通道喔!并不是一開始連接到 FTP 服務器就立刻建立的通道呢!留意一下啰!
-
主動式聯(lián)機使用到的埠號
利用上述的說明來整理一下 FTP 服務器端會使用到的埠號主要有:
- 命令通道的 ftp (默認為 port 21) 與
- 數據傳輸的 ftp-data (默認為port 20)。
再強調一次,這兩個埠口的工作是不一樣的,而且,重要的是兩者的聯(lián)機發(fā)起端是不一樣的!首先 port 21 主要接受來自客戶端的主動聯(lián)機,至于 port 20 則為 FTP 服務器主動聯(lián)機至客戶端呢!這樣的情況在服務器與客戶端兩者同時為公共 IP (Public IP) 的因特網上面通常沒有太大的問題,不過,萬一你的客戶端是在防火墻后端,或者是 NAT 服務器后端呢?會有什么問題發(fā)生呢?底下我們來談一談這個嚴重的問題!
-
在主動聯(lián)機的 FTP 服務器與客戶端之間具有防火墻的聯(lián)機問題
回想一下我們的第九章防火墻! 一般來說,很多的局域網絡都會使用防火墻 (iptables) 的 NAT 功能,那么在 NAT 后端的 FTP 用戶如何連接到 FTP 服務器呢? 我們可以簡單的以下圖來說明:
圖 21.1-2、 FTP 客戶端與服務器端聯(lián)機中間具有防火墻的聯(lián)機狀態(tài)
因為 NAT 會主動的記錄由內部送往外部的聯(lián)機信息,而由于命令信道的建立是由客戶端向服務器端聯(lián)機的, 因此這一條聯(lián)機可以順利的建立起來的;
同樣的,客戶端主機會先啟用 port BB ,并透過命令通道告知 FTP 服務器,且等待服務器端的主動聯(lián)機;
但是由于透過 NAT 的轉換后,FTP 服務器只能得知 NAT 的 IP 而不是客戶端的 IP , 因此 FTP 服務器會以 port 20 主動的向 NAT 的 port BB 發(fā)送主動聯(lián)機的要求。 但你的 NAT 并沒有啟動 port BB 來監(jiān)聽 FTP 服務器的聯(lián)機啊!
了解問題的所在了嗎?在 FTP 的主動式聯(lián)機當中,NAT 將會被視為客戶端,但 NAT 其實并非客戶端啊, 這就造成問題了。如果你曾經在 IP 分享器后面連接某些 FTP 服務器時,可能偶爾會發(fā)現明明就連接上 FTP 服務器了 (命令通道已建立),但是就是無法取得文件名的列表,而是在超過一段時間后顯示『?Can't build data connection: Connection refused,無法進行數據傳輸』之類的訊息, 那肯定就是這個原因所造成的困擾了。
那有沒有辦法可以克服這個問題呢?難道真的在 Linux NAT 后面就一定無法使用 FTP 嗎?當然不是! 目前有兩個簡易的方法可以克服這個問題:
- 使用 iptables 所提供的 FTP 偵測模塊:
其實 iptables 早就提供了許多好用的模塊了,這個 FTP 當然不會被錯過! 你可以使用?modprobe?這個指令來加載 ip_conntrack_ftp 及 ip_nat_ftp 等模塊,這幾個模塊會主動的分析『目標是 port 21 的聯(lián)機』信息, 所以可以得到 port BB 的資料,此時若接受到 FTP 服務器的主動聯(lián)機,就能夠將該封包導向正確的后端主機了! ^_^
不過,如果你鏈接的目標 FTP 服務器他的命令通道默認端口號并非標準的 21 埠號時 (例如某些地下 FTP 服務器), 那么這兩個模塊就無法順利解析出來了,這樣說,理解嗎?
- 客戶端選擇被動式 (Passive) 聯(lián)機模式:
除了主動式聯(lián)機之外,FTP 還提供一種稱為被動式聯(lián)機的模式,什么是被動式呢? 既然主動式是由服務器向客戶端聯(lián)機,反過來講,被動式就是由客戶端向服務器端發(fā)起聯(lián)機的啰! 既然是由客戶端發(fā)起聯(lián)機的,那自然就不需要考慮來自 port 20 的聯(lián)機啦!關于被動式聯(lián)機模式將在下一小節(jié)介紹喔!
21.1.3 客戶端選擇被動式聯(lián)機模式
那么什么是被動式聯(lián)機呢?我們可以使用底下的圖示來作個簡略的介紹喔:
圖 21.1-3、FTP 的被動式數據流聯(lián)機流程
同樣的需要建立命令通道,透過三向交握就可以建立起這個通道了。
當有使用數據信道的指令時,客戶端可透過命令通道發(fā)出 PASV 的被動式聯(lián)機要求 (Passive 的縮寫), 并等待服務器的回應;
如果你的 FTP 服務器是能夠處理被動式聯(lián)機的,此時 FTP 服務器會先啟動一個埠口在監(jiān)聽。 這個端口號碼可能是隨機的,也可以自定義某一范圍的埠口,端看你的 FTP 服務器軟件而定。 然后你的 FTP 服務器會透過命令通道告知客戶端該已經啟動的埠口 (圖中的 port PASV), 并等待客戶端的聯(lián)機。
然后你的客戶端會隨機取用一個大于 1024 的端口號來對主機的 port PASV 聯(lián)機。 如果一切都順利的話,那么你的 FTP 數據就可以透過 port BB 及 port PASV 來傳送了。
發(fā)現上面的不同點了嗎?被動式 FTP 數據信道的聯(lián)機方向是由客戶端向服務器端聯(lián)機的喔! 如此一來,在 NAT 內部的客戶端主機就可以順利的連接上 FTP Server 了!但是,萬一 FTP 主機也是在 NAT 后端那怎么辦...呵呵!那可就糗了吧~ @_@這里就牽涉到更深入的 DMZ 技巧了,我們這里暫不介紹這些深入的技巧,先理解一下這些特殊的聯(lián)機方向, 這將有助于你未來服務器架設時候的考慮因素喔!
此外,不曉得你有無發(fā)現,透過 PASV 模式,服務器在沒有特別設定的情況下,會隨機選取大于 1024 的埠口來提供客戶端連接之用。那么萬一服務器啟用的埠口被搞鬼怎么辦?而且, 如此一來也很難追蹤來自入侵者攻擊的登錄信息啊!所以,這個時候我們可以透過 passive ports 的功能來『限定』服務器啟用的 port number 喔!
21.1.4 FTP 的安全性問題與替代方案
其實,在 FTP 上面?zhèn)魉偷臄祿芸赡鼙桓`取,因為 FTP 是明碼傳輸的嘛!而且某些 FTP 服務器軟件的資安歷史問題也是很嚴重的。 因此,一般來說,除非是學校或者是一些社團單位要開放沒有機密或授權問題的資料之外,FTP 是少用為妙的。
拜?SSH?所賜,目前我們已經有較為安全的 FTP 了,那就是 ssh 提供的 sftp 這個 server 啊!這個 sftp-server 最大的優(yōu)點就是:『在上面?zhèn)鬏數臄祿墙涍^加密的』!所以在因特網上面流竄的時候, 嘿嘿!畢竟是比較安全一些啦!所以建議你,除非必要,否則的話使用 SSH 提供的 sftp-server 功能即可~
然而這個功能對于一些習慣了圖形接口,或者是有中文檔名的使用者來說,實在是不怎么方便, 雖說目前有個圖形接口的 filezilla 客戶端軟件,不過很多時候還是會發(fā)生一些莫名的問題說! 所以,有的時候 FTP 網站還是有其存在的需要的。如果真的要架設 FTP 網站,那么還是得需要注意幾個事項喔:
無論如何,在網絡上聽過太多人都是由于開放 FTP 這個服務器而導致整個主機被入侵的事件,所以, 這里真的要給他一直不斷的強調,要注意安全啊!
21.1.5 開放什么身份的使用者登入
既然 FTP 是以明碼傳輸,并且某些早期的 FTP 服務器軟件也有不少的安全漏洞,那又為何需要架設 FTP 服務器啊? 沒辦法啊,總是有人有需要這個玩意兒的,譬如說各大專院校不就有提供 FTP 網站的服務嗎? 這樣可以讓校內的同學共同分享校內的網絡資源嘛!不過,由于 FTP 登入者的身份可以分為三種, 你到底要開放哪一種身份登入呢?這個時候你可以這樣簡單的思考一下啰:
-
開放實體用戶的情況 (Real user):
很多的 FTP 服務器默認就已經允許實體用戶的登入了。不過,需要了解的是,以實體用戶做為 FTP 登入者身份時, 系統(tǒng)默認并沒有針對實體用戶來進行『限制』的,所以他可以針對整個文件系統(tǒng)進行任何他所具有權限的工作。 因此,如果你的 FTP 使用者沒能好好的保護自己的密碼而導致被入侵,那么你的整個 Linux 系統(tǒng)數據將很有可能被竊取啊! 開放實體用戶時的建議如下:
- 使用替代的 FTP 方案較佳:?由于實體用戶本來就可以透過網絡連接到主機來進行工作 (例如 SSH),因此實在沒有需要特別的開放 FTP 的服務啊!因為例如 sftp 本來就能達到傳輸檔案的功能啰!
- 限制用戶能力,如 chroot 與 /sbin/nologin 等:?如果確定要讓實體用戶利用 FTP 服務器的話,那么你可能需要讓某些系統(tǒng)賬號無法登入 FTP 才行,例如 bin, apache 等等。 最簡單常用的作法是透過 PAM 模塊來處理,譬如 vsftpd 這個軟件默認可以透過 /etc/vsftpd/ftpusers 這個檔案來設定不想讓他具有登入 FTP 的賬號。另外,將使用者身份 chroot 是相當需要的!
-
訪客身份 (Guest)
通常會建立 guest 身份的案例當中,多半是由于服務器提供了類似『個人 Web 首頁』的功能給一般身份用戶, 那么這些使用者總是需要管理自己的網頁空間吧?這個時候將使用者的身份壓縮成為 guest ,并且將他的可用目錄設定好,即可提供使用者一個方便的使用環(huán)境了!且不需要提供他 real user 的權限喔! 常見的建議如下:
- 僅提供需要登入的賬號即可,不需要提供系統(tǒng)上面所有人均可登入的環(huán)境啊!
- 當然,我們在服務器的設定當中,需要針對不同的訪客給他們不一樣的『家目錄』, 而這個家目錄與用戶的權限設定需要相符合喔!例如要提供 dmtsai 這個人管理他的網頁空間,而他的網頁空間放置在 /home/dmtsai/www 底下,那我就將 dmtsai 在 FTP 提供的目錄僅有 /home/dmtsai/www 而已,比較安全啦!而且也方便使用者啊!
- 針對這樣的身份者,需要設定較多的限制,包括:上下傳檔案數目與硬盤容量的限制、 聯(lián)機登入的時間限制、許可使用的指令要減少很多很多,例如 chmod 就不要允許他使用等等!
-
匿名登錄使用者 (anonymous)
雖然提供匿名登錄給因特網的使用者進入實在不是個好主意,因為每個人都可以去下載你的數據, 萬一帶寬被吃光光怎么辦?但如同前面講過的,學校單位需要分享全校同學一些軟件資源時, FTP 服務器也是一個很不錯的解決方案啊!你說是吧。如果要開放匿名用戶的話,要注意:
- 無論如何,提供匿名登錄都是一件相當危險的事情,因為只要你一不小心, 將重要的資料放置到匿名者可以讀取的目錄中時,那么就很有可能會泄密!與其戰(zhàn)戰(zhàn)兢兢,不如就不要設定啊~
- 果真要開放匿名登錄時,很多限制都要進行的,這包括:(1)允許的工作指令要減低很多, 幾乎就不許匿名者使用指令啦、(2)限制文件傳輸的數量,盡量不要允許『上傳』數據的設定、 (3)限制匿名者同時登入的最大聯(lián)機數量,可以控制盜連喔!
一般來說,如果你是要放置一些公開的、沒有版權糾紛的數據在網絡上供人下載的話, 那么一個僅提供匿名登錄的 FTP 服務器,并且對整個因特網開放是 OK 的啦! 不過,如果你預計要提供的的軟件或數據是具有版權的,但是該版權允許你在貴單位內傳輸的情況下, 那么架設一個『僅針對內部開放的匿名 FTP 服務器 (利用防火墻處理) 』也是 OK 的啦!
如果你還想要讓使用者反饋的話,那是否要架設一個匿名者可上傳的區(qū)域呢?鳥哥對這件事情的看法是.... 『萬萬不可』啊!如果要讓使用者反饋的話,除非該使用者是你信任的,否則不要允許對方上傳! 所以此時一個文件系統(tǒng)權限管理嚴格的 FTP 服務器,并提供實體用戶的登入就有點需求啦! 總之,要依照你的需求來思考是否有需要喔!
21.2 vsftpd 服務器基礎設定
終于要來聊一聊這個簡單的 vsftpd 啰!vsftpd 的全名是『Very Secure FTP Daemon?』的意思, 換句話說,vsftpd 最初發(fā)展的理念就是在建構一個以安全為重的 FTP 服務器呢!我們先來聊一聊為什么 vsftpd 號稱『非常安全』呢?然后再來談設定吧!
21.2.1 為何使用 vsftpd
為了建構一個安全為主的 FTP 服務器, vsftpd 針對操作系統(tǒng)的『程序的權限 (privilege)』概念來設計, 如果你讀過基礎篇的十七章程序與資源管理的話, 應該會曉得系統(tǒng)上面所執(zhí)行的程序都會引發(fā)一個程序,我們稱他為 PID (Process ID), 這個 PID 在系統(tǒng)上面能進行的任務與他擁有的權限有關。也就是說, PID 擁有的權限等級越高, 他能夠進行的任務就越多。舉例來說,使用 root 身份所觸發(fā)的 PID 通常擁有可以進行任何工作的權限等級。
不過,萬一觸發(fā)這個 PID 的程序 (program) 有漏洞而導致被網絡怪客 (cracker) 所攻擊而取得此 PID 使用權時, 那么網絡怪客將會取得這個 PID 擁有的權限吶!所以,近來發(fā)展的軟件都會盡量的將服務取得的 PID 權限降低,使得該服務即使不小心被入侵了,入侵者也無法得到有效的系統(tǒng)管理權限,這樣會讓我們的系統(tǒng)較為安全的啦。 vsftpd 就是基于這種想法而設計的。
除了 PID 方面的權限之外, vsftpd 也支持 chroot 這個函式的功能,chroot 顧名思義就是『 change root directory 』的意思,那個 root 指的是『根目錄』而非系統(tǒng)管理員。 他可以將某個特定的目錄變成根目錄,所以與該目錄沒有關系的其他目錄就不會被誤用了。
舉例來說,如果你以匿名身份登入我們的 ftp 服務的話,通常你會被限定在 /var/ftp 目錄下工作, 而你看到的根目錄其實就只是 /var/ftp ,至于系統(tǒng)其他如 /etc, /home, /usr... 等其他目錄你就看不到了! 這樣一來即使這個 ftp 服務被攻破了,沒有關系,入侵者還是僅能在 /var/ftp 里面跑來跑去而已,而無法使用 Linux 的完整功能。自然我們的系統(tǒng)也就會比較安全啦!
vsftpd 是基于上面的說明來設計的一個較為安全的 FTP 服務器軟件,他具有底下的特點喔:
- vsftpd 這個服務的啟動者身份為一般用戶,所以對于 Linux 系統(tǒng)的權限較低,對于 Linux 系統(tǒng)的危害就相對的減低了。此外, vsftpd 亦利用 chroot() 這個函式進行改換根目錄的動作,使得系統(tǒng)工具不會被 vsftpd 這支服務所誤用;
- 任何需要具有較高執(zhí)行權限的 vsftpd 指令均以一支特殊的上層程序所控制, 該上層程序享有的較高執(zhí)行權限功能已經被限制的相當的低,并以不影響 Linux 本身的系統(tǒng)為準;
- 絕大部分 ftp 會使用到的額外指令功能 (dir, ls, cd ...) 都已經被整合到 vsftpd 主程序當中了,因此理論上 vsftpd 不需要使用到額外的系統(tǒng)提供的指令,所以在 chroot 的情況下,vsftpd 不但可以順利運作,且不需要額外功能對于系統(tǒng)來說也比較安全。
- 所有來自客戶端且想要使用這支上層程序所提供的較高執(zhí)行權限之 vsftpd 指令的需求, 均被視為『不可信任的要求』來處理,必需要經過相當程度的身份確認后,方可利用該上層程序的功能。 例如 chown(), Login 的要求等等動作;
- 此外,上面提到的上層程序中,依然使用 chroot() 的功能來限制用戶的執(zhí)行權限。
由于具有這樣的特點,所以 vsftpd 會變的比較安全一些咯!底下就開始來談如何設定吧!
21.2.2 所需要的軟件以及軟件結構
vsftpd 所需要的軟件只有一個,那就是 vsftpd 啊!^_^!如果你的 CentOS 沒有安裝,請利用 yum install vsftpd 來安裝他吧!軟件很小,下載連同安裝不需要幾秒鐘就搞定了!而事實上整個軟件提供的配置文件也少的令人高興!簡單易用就是 vsftpd 的特色啊!這些設定數據比較重要的有:
- /etc/vsftpd/vsftpd.conf
嚴格來說,整個 vsftpd 的配置文件就只有這個檔案!這個檔案的設定是以?bash 的變量設定相同的方式來處理的, 也就是『參數=設定值』來設定的,注意,?等號兩邊不能有空白喔!至于詳細的 vsftpd.conf 可以使用 『 man 5 vsftpd.conf 』來詳查。
- /etc/pam.d/vsftpd
這個是 vsftpd 使用 PAM 模塊時的相關配置文件。主要用來作為身份認證之用,還有一些用戶身份的抵擋功能, 也是透過這個檔案來達成的。你可以察看一下該檔案:
上面那個 file 后面接的檔案是『限制使用者無法使用 vsftpd 』之意, 也就是說,其實你的限制檔案不見得要使用系統(tǒng)默認值,也可以在這個檔案里面進行修改啦! ^_^[root@www ~]# cat /etc/pam.d/vsftpd #%PAM-1.0 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth
- /etc/vsftpd/ftpusers
與上一個檔案有關系,也就是 PAM 模塊 (/etc/pam.d/vsftpd) 所指定的那個無法登入的用戶配置文件啊! 這個檔案的設定很簡單,你只要將『不想讓他登入 FTP 的賬號』寫入這個檔案即可。一行一個賬號,看起來像這樣:
瞧見沒有?絕大部分的系統(tǒng)賬號都在這個檔案內喔,也就是說,系統(tǒng)賬號默認是沒有辦法使用 vsftpd 的啦! 如果你還想要讓某些使用者無法登入,寫在這里是最快的![root@www ~]# cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon ....(底下省略)....
- /etc/vsftpd/user_list
這個檔案是否能夠生效與 vsftpd.conf 內的兩個參數有關,分別是『 userlist_enable, userlist_deny 』。 如果說 /etc/vsftpd/ftpusers 是 PAM 模塊的抵擋設定項目,那么這個 /etc/vsftpd/user_list 則是 vsftpd 自定義的抵擋項目。事實上這個檔案與 /etc/vsftpd/ftpusers 幾乎一模一樣, 在預設的情況下,你可以將不希望可登入 vsftpd 的賬號寫入這里。不過這個檔案的功能會依據 vsftpd.conf 配置文件內的 userlist_deny={YES/NO} 而不同,這得要特別留意喔!
- /etc/vsftpd/chroot_list
這個檔案預設是不存在的,所以你必須要手動自行建立。這個檔案的主要功能是可以將某些賬號的使用者 chroot 在他們的家目錄下!但這個檔案要生效與 vsftpd.conf 內的『 chroot_list_enable, chroot_list_file 』兩個參數有關。 如果你想要將某些實體用戶限制在他們的家目錄下而不許到其他目錄去,可以啟動這個設定項目喔!
- /usr/sbin/vsftpd
這就是 vsftpd 的主要執(zhí)行檔咯!不要懷疑, vsftpd 只有這一個執(zhí)行檔而已啊!
- /var/ftp/
這個是 vsftpd 的預設匿名者登入的根目錄喔!其實與 ftp 這個賬號的家目錄有關啦!
大致上就只有這幾個檔案需要注意而已,而且每個檔案的設定又都很簡單!真是不錯啊!
21.2.3 vsftpd.conf 設定值說明
事實上,/etc/vsftpd/vsftpd.conf 本身就是一個挺詳細的配置文件,且使用『 man 5 vsftpd.conf 』則可以得到完整的參數說明。 不過我們這里依舊先將 vsftpd.conf 內的常用參數給他寫出來,希望對你有幫助:
-
與服務器環(huán)境較相關的設定值
- connect_from_port_20=YES (NO)
記得在前一小節(jié)提到的主動式聯(lián)機使用的 FTP 服務器的 port 嗎?這就是 ftp-data 的埠號;
- listen_port=21
vsftpd 使用的命令通道 port,如果你想要使用非正規(guī)的埠號,在這個設定項目修改吧! 不過你必須要知道,這個設定值僅適合以 stand alone 的方式來啟動喔!(對于 super daemon 無效)
- dirmessage_enable=YES (NO)
當用戶進入某個目錄時,會顯示該目錄需要注意的內容,顯示的檔案默認是 .message ,你可以使用底下的設定項目來修訂!
- message_file=.message
當 dirmessage_enable=YES 時,可以設定這個項目來讓 vsftpd 尋找該檔案來顯示訊息!
- listen=YES (NO)
若設定為 YES 表示 vsftpd 是以 standalone 的方式來啟動的!預設是 NO 呦!所以我們的 CentOS 將它改為 YES 哩!這樣才能使用 stand alone 的方式來喚醒。
- pasv_enable=YES (NO)
支持數據流的被動式聯(lián)機模式(passive mode),一定要設定為 YES 的啦!
- use_localtime=YES (NO)
是否使用本地時間?vsftpd 預設使用 GMT 時間(格林威治),所以預設的 FTP 內的檔案日期會比臺灣晚 8 小時,建議修改設定為 YES 吧!
- write_enable=YES (NO)
如果你允許用戶上傳數據時,就要啟動這個設定值;
- connect_timeout=60
單位是秒,在數據連接的主動式聯(lián)機模式下,我們發(fā)出的連接訊號在 60 秒內得不到客戶端的響應,則不等待并強制斷線咯。?
- accept_timeout=60
當用戶以被動式 PASV 來進行數據傳輸時,如果服務器啟用 passive port 并等待 client 超過 60 秒而無回應, 那么就給他強制斷線!這個設定值與 connect_timeout 類似,不過一個是管理主動聯(lián)機,一個管理被動聯(lián)機。
- data_connection_timeout=300
如果服務器與客戶端的數據聯(lián)機已經成功建立 (不論主動還是被動聯(lián)機),但是可能由于線路問題導致 300 秒內還是無法順利的完成數據的傳送,那客戶端的聯(lián)機就會被我們的 vsftpd 強制剔除!
- idle_session_timeout=300
如果使用者在 300 秒內都沒有命令動作,強制脫機!避免占著茅坑不拉屎~
- max_clients=0
如果 vsftpd 是以 stand alone 方式啟動的,那么這個設定項目可以設定同一時間,最多有多少 client 可以同時連上 vsftpd 哩!限制使用 FTP 的用量!
- max_per_ip=0
與上面 max_clients 類似,這里是同一個 IP 同一時間可允許多少聯(lián)機?
- pasv_min_port=0, pasv_max_port=0
上面兩個是與 passive mode 使用的 port number 有關,如果你想要使用 65400 到 65410 這 11 個 port 來進行被動式聯(lián)機模式的連接,可以這樣設定 pasv_max_port=65410 以及 pasv_min_port=65400。 如果是 0 的話,表示隨機取用而不限制。
- ftpd_banner=一些文字說明
當使用者聯(lián)機進入到 vsftpd 時,在 FTP 客戶端軟件上頭會顯示的說明文字。不過,這個設定值數據比較少啦! 建議你可以使用底下的 banner_file 設定值來取代這個項目;
- banner_file=/path/file
這個項目可以指定某個純文本檔作為使用者登入 vsftpd 服務器時所顯示的歡迎字眼。同時,也能夠放置一些讓使用者知道本 FTP 服務器的目錄架構!
-
與實體用戶較相關的設定值
- guest_enable=YES (NO)
若這個值設定為 YES 時,那么任何實體賬號,均會被假設成為 guest 喔 (所以預設是不開放的)! 至于訪客在 vsftpd 當中,預設會取得 ftp 這個使用者的相關權限。但可以透過 guest_username 來修改。
- guest_username=ftp
在 guest_enable=YES 時才會生效,指定訪客的身份而已。
- local_enable=YES (NO)
這個設定值必須要為 YES 時,在 /etc/passwd 內的賬號才能以實體用戶的方式登入我們的 vsftpd 服務器喔!
- local_max_rate=0
實體用戶的傳輸速度限制,單位為 bytes/second, 0 為不限制。
- chroot_local_user=YES (NO)
在預設的情況下,是否要將使用者限制在自己的家目錄之內(chroot)?如果是 YES 代表用戶默認就會被 chroot,如果是 NO, 則預設是沒有 chroot。不過,實際還是需要底下的兩個參數互相參考才行。為了安全性,這里應該要設定成 YES 才好。
- chroot_list_enable=YES (NO)
是否啟用 chroot 寫入列表的功能?與底下的 chroot_list_flie 有關!這個項目得要開啟,否則底下的列表檔案會無效。?
- chroot_list_file=/etc/vsftpd.chroot_list
如果 chroot_list_enable=YES 那么就可以設定這個項目了!這個項目與 chroot_local_user 有關,詳細的設定狀態(tài)請參考21.2.6 chroot?的說明。
- userlist_enable=YES (NO)
是否藉助 vsftpd 的抵擋機制來處理某些不受歡迎的賬號,與底下的參數設定有關;
- userlist_deny=YES (NO)
當 userlist_enable=YES 時才會生效的設定,若此設定值為 YES 時,則當使用者賬號被列入到某個檔案時, 在該檔案內的使用者將無法登入 vsftpd 服務器!該檔案文件名與下列設定項目有關。
- userlist_file=/etc/vsftpd/user_list
若上面 userlist_deny=YES 時,則這個檔案就有用處了!在這個檔案內的賬號都無法使用 vsftpd 喔!
-
匿名者登入的設定值
- anonymous_enable=YES (NO)
設定為允許 anonymous 登入我們的 vsftpd 主機!預設是 YES ,底下的所有相關設定都需要將這個設定為 anonymous_enable=YES 之后才會生效!
- anon_world_readable_only=YES (NO)
僅允許 anonymous 具有下載可讀檔案的權限,預設是 YES。
- anon_other_write_enable=YES (NO)
是否允許 anonymous 具有除了寫入之外的權限?包括刪除與改寫服務器上的檔案及檔名等權限。預設當然是 NO!如果要設定為 YES,那么開放給 anonymous 寫入的目錄亦需要調整權限,讓 vsftpd 的 PID 擁有者可以寫入才行!
- anon_mkdir_write_enable=YES (NO)
是否讓 anonymous 具有建立目錄的權限?默認值是 NO!如果要設定為 YES, 那么 anony_other_write_enable 必須設定為 YES !
- anon_upload_enable=YES (NO)
是否讓 anonymous 具有上傳數據的功能,默認是 NO,如果要設定為 YES ,則 anon_other_write_enable=YES 必須設定。
- deny_email_enable=YES (NO)
將某些特殊的 email address 抵擋住,不讓那些 anonymous 登入!如果以 anonymous 登入服務器時,不是會要求輸入密碼嗎?密碼不是要你輸入你的 email address 嗎?如果你很討厭某些 email address, 就可以使用這個設定來將他取消登入的權限!需與下個設定項目配合:
- banned_email_file=/etc/vsftpd/banned_emails
如果 deny_email_enable=YES 時,可以利用這個設定項目來規(guī)定哪個 email address 不可登入我們的 vsftpd 喔!在上面設定的檔案內,一行輸入一個 email address 即可!
- no_anon_password=YES (NO)
當設定為 YES 時,表示 anonymous 將會略過密碼檢驗步驟,而直接進入 vsftpd 服務器內喔!所以一般預設都是 NO 的!(登入時會檢查輸入的 emai)
- anon_max_rate=0
這個設定值后面接的數值單位為 bytes/秒 ,限制 anonymous 的傳輸速度,如果是 0 則不限制(由最大帶寬所限制),如果你想讓 anonymous 僅有 30 KB/s 的速度,可以設定『anon_max_rate=30000』
- anon_umask=077
限制 anonymous 上傳檔案的權限!如果是 077 則 anonymous 傳送過來的檔案權限會是 -rw------- 喔!
-
關于系統(tǒng)安全方面的一些設定值
- ascii_download_enable=YES (NO)
如果設定為 YES ,那么 client 就優(yōu)先 (預設) 使用 ASCII 格式下載文件。
- ascii_upload_enable=YES (NO)
與上一個設定類似的,只是這個設定針對上傳而言!預設是 NO
- one_process_model=YES (NO)
這個設定項目比較危險一點~當設定為 YES 時,表示每個建立的聯(lián)機都會擁有一支 process 在負責,可以增加 vsftpd 的效能。不過, 除非你的系統(tǒng)比較安全,而且硬件配備比較高,否則容易耗盡系統(tǒng)資源喔!一般建議設定為 NO 的啦!
- tcp_wrappers=YES (NO)
當然我們都習慣支持?TCP Wrappers?的啦!所以設定為 YES 吧!
- xferlog_enable=YES (NO)
當設定為 YES 時,使用者上傳與下載文件都會被紀錄起來。記錄的檔案與下一個設定項目有關:
- xferlog_file=/var/log/xferlog
如果上一個 xferlog_enable=YES 的話,這里就可以設定了!這個是登錄檔的檔名啦!
- xferlog_std_format=YES (NO)
是否設定為 wu ftp 相同的登錄檔格式?預設為 NO ,因為登錄檔會比較容易讀! 不過,如果你有使用 wu ftp 登錄文件的分析軟件,這里才需要設定為 YES
- dual_log_enable=YES, vsftpd_log_file=/var/log/vsftpd.log
除了 /var/log/xferlog 的 wu-ftp 格式登錄檔之外,還可以具有 vsftpd 的獨特登錄檔格式喔!如果你的 FTP 服務器并不是很忙碌, 或許訂出兩個登錄檔的撰寫 (/var/log/{vsftpd.log,xferlog) 是不錯的。
- nopriv_user=nobody
我們的 vsftpd 預設以 nobody 作為此一服務執(zhí)行者的權限。因為 nobody 的權限相當的低,因此即使被入侵,入侵者僅能取得 nobody 的權限喔!
- pam_service_name=vsftpd
這個是 pam 模塊的名稱,我們放置在 /etc/pam.d/vsftpd 即是這個咚咚!
上面這些是常見的 vsftpd 的設定參數,還有很多參數我沒有列出來,你可以使用 man 5 vsftpd.conf 查閱喔!不過,基本上上面這些參數已經夠我們設定 vsftpd 啰。
21.2.4 vsftpd 啟動的模式
vsftpd 可以使用 stand alone 或 super daemon 的方式來啟動,我們 CentOS 預設是以 stand alone 來啟動的。 那什么時候應該選擇 stand alone 或者是 super daemon 呢?如果你的 ftp 服務器是提供給整個因特網來進行大量下載的任務,例如各大專院校的 FTP 服務器,那建議你使用 stand alone 的方式, 服務的速度上會比較好。如果僅是提供給內部人員使用的 FTP 服務器,那使用 super daemon 來管理即可啊。
-
利用 CentOS 提供的 script 來啟動 vsftpd (stand alone)
其實 CentOS 不用作任何設定就能夠啟動 vsftpd 啰!是這樣啟動的啦:
| [root@www ~]# /etc/init.d/vsftpd start [root@www ~]# netstat -tulnp| grep 21 tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 11689/vsftpd # 看到啰,是由 vsftpd 所啟動的呢! |
-
自行設定以 super daemon 來啟動 (有必要再進行,不用實作)
如果你的 FTP 是很少被使用的,那么利用 super daemon 來管理不失為一個好主意。 不過若你想要使用 super daemon 管理的話,那就得要自行修改一下配置文件了。其實也不難啦,你應該要這樣處理的:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 找到 listen=YES 這一行:大約在 109 行左右啦,并將它改成: listen=NO |
接下來修改一下 super daemon 的配置文件,底下這個檔案你必須要自行建立的,原本是不存在的喔:
| [root@www ~]# yum install xinetd <==假設 xinetd 沒有安裝時 [root@www ~]# vim /etc/xinetd.d/vsftpd service ftp {socket_type = streamwait = nouser = rootserver = /usr/sbin/vsftpdlog_on_success += DURATION USERIDlog_on_failure += USERIDnice = 10disable = no } |
然后嘗試啟動看看呢:
| [root@www ~]# /etc/init.d/vsftpd stop [root@www ~]# /etc/init.d/xinetd restart [root@www ~]# netstat -tulnp| grep 21 tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 32274/xinetd |
有趣吧!兩者啟動的方式可不一樣啊!管理的方式就會差很多的呦!不管你要使用哪種啟動的方式,切記不要兩者同時啟動,否則會發(fā)生錯誤的!你應該使用 chkconfig --list 檢查一下這兩種啟動的方式,然后依據你的需求來決定用哪一種方式啟動。鳥哥底下的設定都會以 stand alone 這個 CentOS 默認的啟動模式來處理,所以趕緊將剛剛的動作給他改回來喔!
21.2.5 CentOS 的 vsftpd 默認值
在 CentOS 的默認值當中,vsftpd 是同時開放實體用戶與匿名用戶的,CentOS 的默認值如下:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 1. 與匿名者有關的信息: anonymous_enable=YES <==支持匿名者的登入使用 FTP 功能# 2. 與實體用戶有關的設定 local_enable=YES <==支持本地端的實體用戶登入 write_enable=YES <==允許用戶上傳數據 (包括檔案與目錄) local_umask=022 <==建立新目錄 (755) 與檔案 (644) 的權限# 3. 與服務器環(huán)境有關的設定 dirmessage_enable=YES <==若目錄下有 .message 則會顯示該檔案的內容 xferlog_enable=YES <==啟動登錄文件記錄,記錄于 /var/log/xferlog connect_from_port_20=YES <==支持主動式聯(lián)機功能 xferlog_std_format=YES <==支持 WuFTP 的登錄檔格式 listen=YES <==使用 stand alone 方式啟動 vsftpd pam_service_name=vsftpd <==支持 PAM 模塊的管理 userlist_enable=YES <==支持 /etc/vsftpd/user_list 檔案內的賬號登入管控! tcp_wrappers=YES <==支持 TCP Wrappers 的防火墻機制 |
上面各項設定值請自行參考?21.2.3?的詳細說明吧。而通過這樣的設定值咱們的 vsftpd 可以達到如下的功能:
- 你可以使用 anonymous 這個匿名賬號或其他實體賬號 (/etc/passwd) 登入;
- anonymous 的家目錄在 /var/ftp ,且無上傳權限,亦已經被 chroot 了;
- 實體用戶的家目錄參考 /etc/passwd,并沒有被 chroot,可前往任何有權限可進入的目錄中;
- 任何于 /etc/vsftpd/ftpusers 內存在的賬號均無法使用 vsftpd (PAM);
- 可利用 /etc/hosts.{allow|deny} 來作為基礎防火墻;
- 當客戶端有任何上傳/下載信息時,該信息會被紀錄到 /var/log/xferlog 中;
- 主動式聯(lián)機的埠口為 port 20;
- 使用格林威治時間 (GMT)。
所以當你啟動 vsftpd 后,你的實體用戶就能夠直接利用 vsftpd 這個服務來傳輸他自己的數據了。 不過比較大的問題是,因為 vsftpd 預設使用 GMT 時間,因為你在客戶端使用 ftp 軟件連接到 FTP 服務器時,會發(fā)現每個檔案的時間都慢了八小時了!真是討厭啊! 所以建議你加設一個參數值,就是『 use_localtime=YES 』啰!
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 在這個檔案當中的最后一行加入這一句即可 use_localtime=YES[root@www ~]# /etc/init.d/vsftpd restart [root@www ~]# chkconfig vsftpd on |
如此一來你的 FTP 服務器不但可以提供匿名賬號來下載 /var/ftp 的數據,如果使用實體賬號來登入的話, 就能夠進入到該用戶的家目錄底下去了!真是很簡單方便的一個設定啊!且使用本地端時間呢! ^_^
另外,如果你預計要將 FTP 開放給 Internet 使用時,請注意得要開放防火墻喔!關于防火墻的建置情況, 由于牽涉到數據流的主動、被動聯(lián)機方式,因此,還得要加入防火墻模塊。這部份我們在后續(xù)的?21.2.8 小節(jié)再加以介紹,反正,最終記得要開放 FTP 的聯(lián)機要求就對了!
21.2.6 針對實體賬號的設定
雖然在 CentOS 的默認情況當中實體用戶已經可以使用 FTP 的服務了,不過我們可能還需要一些額外的功能來限制實體用戶。 舉例來說,限制用戶無法離開家目錄 (chroot)、限制下載速率、限制用戶上傳檔案時的權限 (mask) 等等。 底下我們先列出一些希望達到的功能,然后再繼續(xù)進行額外功能的處理:
- 希望使用臺灣本地時間取代 GMT 時間;
- 用戶登入時顯示一些歡迎訊息的信息;
- 系統(tǒng)賬號不可登入主機 (亦即 UID 小于 500 以下的賬號);
- 一般實體用戶可以進行上傳、下載、建立目錄及修改檔案等動作;
- 用戶新增的檔案、目錄之 umask 希望設定為 002;
- 其他主機設定值保留默認值即可。
你可以自行處理 vsftpd.conf 這個檔案,以下則是一個范例。注意,如果你的 vsftpd.conf 沒有相關設定值, 請自行補上吧!OK!讓我們開始一步一步來依序處理先:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 1. 與匿名者相關的信息,在這個案例中將匿名登錄取消: anonymous_enable=NO# 2. 與實體用戶相關的信息:可寫入,且 umask 為 002 喔! local_enable=YES write_enable=YES local_umask=002 userlist_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd/user_list <==這個檔案必須存在!還好,預設有此檔案!# 3. 與服務器環(huán)境有關的設定 use_localtime=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd tcp_wrappers=YES banner_file=/etc/vsftpd/welcome.txt <==這個檔案必須存在!需手動建立![root@www ~]# /etc/init.d/xinetd restart <==取消 super dameon [root@www ~]# /etc/init.d/vsftpd restart |
當我們想讓登入者可查閱咱們系統(tǒng)管理員所下達的『公告』事項時,可以使用這個設定!那就是 banner_file=/etc/vsftpd/welcome.txt 這個參數的用途了!我們可以編輯這個檔案即可。 好了,開始來建立歡迎畫面吧!
| [root@www ~]# vim /etc/vsftpd/welcome.txt 歡迎光臨本小站,本站提供 FTP 的相關服務! 主要的服務是針對本機實體用戶提供的, 若有任何問題,請與鳥哥聯(lián)絡! |
再來是針對系統(tǒng)賬號來給予抵擋的機制,其實有兩個檔案啦,一個是 PAM 模塊管的,一個是 vsftpd 主動提供的, 在預設的情況下這兩個檔案分別是:
- /etc/vsftpd/ftpusers:就是 /etc/pam.d/vsftpd 這個檔案的設定所影響的;
- /etc/vsftpd/user_list:由 vsftpd.conf 的 userlist_file 所設定。
這兩個檔案的內容是一樣的哩~并且這兩個檔案必須要存在才行。請你參考你的 /etc/passwd 配置文件, 然后將 UID 小于 500 的賬號名稱給他同時寫到這兩個檔案內吧!一行一個賬號!
| [root@www ~]# vim /etc/vsftpd/user_list root bin ....(底下省略).... |
你可以使用圖形接口的 FTP 客戶端軟件來處理,也可以透過 Linux 本身提供的 ftp 客戶端功能哩! 關于?ftp 指令我們已經在第五章談過了,你可以自行前往參考。這里直接測試一下吧:
| # 測試使用已知使用者登入,例如 dmtsai 這個實體用戶: [root@www ~]# ftp localhost Trying 127.0.0.1... Connected to localhost (127.0.0.1). 220-歡迎光臨本小站,本站提供 FTP 的相關服務! <==剛剛建立的歡迎訊息 220-主要的服務是針對本機實體用戶提供的, 220-若有任何問題,請與鳥哥聯(lián)絡! 220 Name (localhost:root): student 331 Please specify the password. Password: <==輸入密碼啰在這里! 500 OOPS: cannot change directory:/home/student <==有講登入失敗的原因喔! Login failed. ftp> bye 221 Goodbye. |
上面是最簡單的實體賬號相關設定。那如果你還想要限制用戶家目錄的 chroot 或其他如速限等數據,就得要看看底下的特殊設定項目啰。
-
實體賬號的 SELinux 議題
在預設的情況下,CentOS 的 FTP 是不允許實體賬號登入取得家目錄數據的,這是因為 SELinux 的問題啦! 如果你在剛剛的 ftp localhost 步驟中,在 bye 離開 FTP 之前下達過『 dir 』的話,那你會發(fā)現沒有任何資料跑出來~ 這并不是你錯了,而是 SELinux 不太對勁的緣故。那如何解決呢?這樣處理即可:
| [root@www ~]# getsebool -a | grep ftp allow_ftpd_anon_write --> off allow_ftpd_full_access --> off allow_ftpd_use_cifs --> off allow_ftpd_use_nfs --> off ftp_home_dir --> off <==就是這玩意兒!要設定 on 才行! ....(底下省略)....[root@www ~]# setsebool -P ftp_home_dir=1 |
這樣就搞定啰!如果還有其他可能發(fā)生錯誤的原因,包括檔案數據使用 mv 而非使用 cp 導致 SELinux 文件類型無法繼承原有目錄的類型時,那就請自行查閱 /var/log/messages 的內容吧!通常 SELinux 沒有這么難處理的啦!^_^
-
對使用者 (包括未來新增用戶) 進行 chroot
在鳥哥接觸的一般 FTP 使用環(huán)境中,大多數都是要開放給廠商聯(lián)機來使用的,給自己人使用的機會雖然也有, 不過使用者數量通常比較少一些。所以啰,鳥哥現在都是建議默認讓實體用戶通通被 chroot, 而允許不必 chroot 的賬號才需要額外設定。這樣的好處是,新建的賬號如果忘記進行 chroot,反正原本就是 chroot, 比較不用擔心如果該賬號是開給廠商時該怎辦的問題。
現在假設我系統(tǒng)里面僅有 vbird 與 dmtsai 兩個賬號不要被 chroot,其他如 student, smb1... 等賬號通通預設是 chroot 的啦,包括未來新增賬號也全部預設 chroot!那該如何設定?很簡單,三個設定值加上一個額外配置文件就搞定了!步驟如下:
| # 1. 修改 vsftpd.conf 的參數值: [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 增加是否設定針對某些使用者來 chroot 的相關設定呦! chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list# 2. 建立不被 chroot 的使用者賬號列表,即使沒有任何賬號,此檔案也是要存在! [root@www ~]# vim /etc/vsftpd/chroot_list vbird dmtsai[root@www ~]# /etc/init.d/vsftpd restart |
如此一來,除了 dmtsai 與 vbird 之外的其他可用 FTP 的賬號者,通通會被 chroot 在他們的家目錄下, 這樣對系統(tǒng)比較好啦!接下來,請你自己分別使用有與沒有被 chroot 的賬號來聯(lián)機測試看看。
-
限制實體用戶的總下載流量 (帶寬)
你可不希望帶寬被使用者上傳/下載所耗盡,而影響咱們服務器的其他正常服務吧?所以限制使用者的傳輸帶寬有時也是需要的! 假設『我要限制所有使用者的總傳輸帶寬最大可達 1 MBytes/秒 』時,你可以這樣做即可:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 增加底下這一個參數即可: local_max_rate=1000000 <==記住喔,單位是 bytes/second[root@www ~]# /etc/init.d/vsftpd restart |
上述的單位是 Bytes/秒,所以你可以依據你自己的網絡環(huán)境來限制你的帶寬!這樣就給他限制好啰!有夠容易吧! 那怎么測試啊?很簡單,用本機測試最準!你可以用 dd 做出一個 10MB 的檔案放在 student 的家目錄下,然后用 root 下達 ftp localhost,并輸入 student 的帳密,接下來給他 get 這個新的檔案,就能夠在最終知道下載的速度啦!
-
限制最大同時上線人數與同一 IP 的 FTP 聯(lián)機數
如果你有限制最大使用帶寬的話,那么你可能還需要限制最大在線人數才行!舉例來說,你希望最多只有 10 個人同時使用你的 FTP 的話,并且每個 IP 來源最多只能建立一條 FTP 的聯(lián)機時,那你可以這樣做:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 增加底下的這兩個參數: max_clients=10 max_per_ip=1[root@www ~]# /etc/init.d/vsftpd restart |
這樣就搞定了!讓你的 FTP 不會人滿為患吶!
-
建立嚴格的可使用 FTP 的賬號列表
在預設的環(huán)境當中,我們是將『不許使用 FTP 的賬號寫入 /etc/vsftpd/user_list 檔案』,所以沒有寫入 /etc/vsftpd/user_list 當中的使用者就能夠使用 FTP 了!如此一來,未來新增的使用者預設都能夠使用 FTP 的服務。 如果換個角度來思考,若我想只讓某些人可以使用 FTP 而已,亦即是新增的使用者預設不可使用 FTP 這個服務的話那么應該如何作呢?你需要修改配置文件成為這樣:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 這幾個參數必須要修改成這樣: userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/user_list[root@www ~]# /etc/init.d/vsftpd restart |
則此時『寫入 /etc/vsftpd/user_list 變成可以使用 FTP 的賬號』了! 所以未來新增的使用者如果要能夠使用 FTP 的話,就必須要寫入 /etc/vsftpd/user_list 才行! 使用這個機制請?zhí)貏e小心,否則容易搞混掉~
透過這幾個簡單的設定值,相信 vsftpd 已經可以符合大部分合法 FTP 網站的需求啰! 更多詳細的用法則請參考 man 5 vsftpd.conf 吧!
| 例題: 假設你因為某些特殊需求,所以必須要開放 root 使用 FTP 傳輸檔案,那么你應該要如何處理? 答: 由于系統(tǒng)賬號無法使用 FTP 是因為 PAM 模塊與 vsftpd 的內建功能所致,亦即是 /etc/vsftpd/ftpusers 及 /etc/vsftpd/user_list 這兩個檔案的影響。所以你只要進入這兩個檔案,并且將 root 那一行批注掉,那 root 就可以使用 vsftpd這個 FTP 服務了。 不過,不建議如此作喔! |
21.2.7 僅有匿名登錄的相關設定
雖然你可以同時開啟實體用戶與匿名用戶,不過建議你,服務器還是依據需求,針對單一種身份來設定吧! 底下我們將針對匿名用戶來設定,且不開放實體用戶。一般來說,這種設定是給類似大專院校的 FTP 服務器來使用的哩!
- 使用臺灣本地的時間,而非 GMT 時間;
- 提供歡迎訊息,說明可提供下載的信息;
- 僅開放 anonymous 的登入,且不需要輸入密碼;
- 文件傳輸的速限為 1 Mbytes/second;
- 數據連接的過程 (不是命令通道!) 只要超過 60 秒沒有響應,就強制 Client 斷線!
- 只要 anonymous 超過十分鐘沒有動作,就予以斷線;
- 最大同時上線人數限制為 50 人,且同一 IP 來源最大聯(lián)機數量為 5 人;
-
預設的 FTP 匿名者的根目錄所在: ftp 賬號的家目錄
OK!那如何設定呢?首先我們必須要知道的是匿名用戶的目錄在哪里? 事實上匿名者默認登入的根目錄是以 ftp 這個用戶的家目錄為主,所以你可以使用『 finger ftp 』來查閱。 咱們的 CentOS 默認的匿名者根目錄在 /var/ftp/ 中。且匿名登錄者在使用 FTP 服務時,他預設可以使用『 ftp 』 這個使用者身份的權限喔,只是被 chroot 到 /var/ftp/ 目錄中就是了。
因為匿名者只會在 /var/ftp/ 當中瀏覽,所以你必須將要提供給用戶下載的數據通通給放置到 /var/ftp/ 去。 假設你已經放置了 linux 的相關目錄以及 gnu 的相關軟件到該目錄中了,那我們可以這樣做個假設:
| [root@www ~]# mkdir /var/ftp/linux [root@www ~]# mkdir /var/ftp/gnu |
然后將 vsftpd.conf 的數據清空,重新這樣處理他吧:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 將這個檔案的全部內容改成這樣: # 1. 與匿名者相關的信息: anonymous_enable=YES no_anon_password=YES <==匿名登錄時,系統(tǒng)不會檢驗密碼 (通常是email) anon_max_rate=1000000 <==最大帶寬使用為 1MB/s 左右 data_connection_timeout=60 <==數據流聯(lián)機的 timeout 為 60 秒 idle_session_timeout=600 <==若匿名者發(fā)呆超過 10 分鐘就斷線 max_clients=50 <==最大聯(lián)機與每個 IP 的可用聯(lián)機 max_per_ip=5# 2. 與實體用戶相關的信息,本案例中為關閉他的情況! local_enable=NO# 3. 與服務器環(huán)境有關的設定 use_localtime=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd tcp_wrappers=YES banner_file=/etc/vsftpd/anon_welcome.txt <==檔名有改喔![root@www ~]# /etc/init.d/vsftpd restart |
各位親愛的觀眾朋友!要注意~在這個案例當中,我們將歡迎訊息設定在 /etc/vsftpd/anon_welcome.txt 這個檔案中, 至于這個檔案的內容你可以這樣寫 (這個檔案一定要存在!否則會造成客戶端無法聯(lián)機成功喔!):
| [root@www ~]# vim /etc/vsftpd/anon_welcome.txt 歡迎光臨本站所提供的 FTP 服務! 本站主要提供 Linux 操作系統(tǒng)相關檔案以及 GNU 自由軟件喔! 有問題請與站長聯(lián)絡!謝謝大家! 主要的目錄為:linux 提供 Linux 操作系統(tǒng)相關軟件 gnu 提供 GNU 的自由軟件 uploads 提供匿名的您上傳數據 |
同樣的,我們使用 ftp 這個軟件來給他測試一下吧!
| [root@www ~]# ftp localhost Connected to localhost (127.0.0.1). 220-歡迎光臨本站所提供的 FTP 服務! <==底下這幾行中文就是歡迎與提示訊息! 220-本站主要提供 Linux 操作系統(tǒng)相關檔案以及 GNU 自由軟件喔! 220-有問題請與站長聯(lián)絡!謝謝大家! 220-主要的目錄為: 220- 220-linux 提供 Linux 操作系統(tǒng)相關軟件 220-gnu 提供 GNU 的自由軟件 220-uploads 提供匿名的您上傳數據 220 Name (localhost:root): anonymous <==匿名賬號名稱是要背的! 230 Login successful. <==沒有輸入密碼即可登入呢! Remote system type is UNIX. Using binary mode to transfer files. ftp> dir 227 Entering Passive Mode (127,0,0,1,196,17). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Aug 08 16:37 gnu -rw-r--r-- 1 0 0 17 Aug 08 14:18 index.html drwxr-xr-x 2 0 0 4096 Aug 08 16:37 linux drwxr-xr-x 2 0 0 4096 Jun 25 17:44 pub 226 Directory send OK. ftp> bye 221 Goodbye. |
-
讓匿名者可上傳/下載自己的資料 (權限開放最大)
在上列的數據當中,實際上匿名用戶僅可進行下載的動作而已。如果你還想讓匿名者可以上傳檔案或者是建立目錄的話, 那你還需要額外增加一些設定才行:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 新增底下這幾行啊! write_enable=YES anon_other_write_enable=YES anon_mkdir_write_enable=YES anon_upload_enable=YES[root@www ~]# /etc/init.d/vsftpd restart |
如果你設定上面四項參數,則會允許匿名者擁有完整的建立、刪除、修改檔案與目錄的權限。 不過,實際要生效還需要 Linux 的文件系統(tǒng)權限正確才行!?我們知道匿名者取得的身份是 ftp ,所以如果想讓匿名者上傳數據到 /var/ftp/uploads/ 中,則需要這樣做:
| [root@www ~]# mkdir /var/ftp/uploads [root@www ~]# chown ftp /var/ftp/uploads |
然后你以匿名者身份登入后,就會發(fā)現匿名者的根目錄多了一個 /upload 的目錄存在了,并且你可以在該目錄中上傳檔案/目錄喔! 如此一來系統(tǒng)的權限大開!很要命喔!所以,請仔細的控制好你的上傳目錄才行!
不過,在實際測試當中,卻發(fā)現還是沒辦法上傳呢!怎么回事啊?如果你有去看一下 /var/log/messages 的話,那就會發(fā)現啦! 又是 SELinux 這家伙呢!怎么辦?就透過『 sealert -l ... 』在 /var/log/messages 里面觀察到的指令丟進去, 立刻就知道解決方案啦!解決方案就是放行 SELinux 的匿名 FTP 規(guī)則如下:
| [root@www ~]# setsebool -P allow_ftpd_anon_write=1 [root@www ~]# setsebool -P allow_ftpd_full_access=1 |
然后你再測試一下用 anonymous 登入,到 /uploads 去上傳個檔案吧!就會知道能不能成功哩!
-
讓匿名者僅具有上傳權限,不可下載匿名者上傳的東西
一般來說,用戶上傳的數據在管理員尚未查閱過是否合乎版權等相關事宜前,是不應該讓其他人下載的! 然而前一小節(jié)的設定當中,用戶上傳的資料是可以被其他人所瀏覽與下載的!如此一來實在是很危險!所以如果你要設定 /var/ftp/uploads/ 內透過匿名者上傳的數據中,僅能上傳不能被下載時,那么被上傳的數據的權限就得要修改一下才行! 請將前一小節(jié)所設定的四個參數簡化成為:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 將這幾行給他改一改先!記得要拿掉 anon_other_write_enable=YES write_enable=YES anon_mkdir_write_enable=YES anon_upload_enable=YES chown_uploads=YES <==新增的設定值在此! chown_username=daemon[root@www ~]# /etc/init.d/vsftpd restart |
當然啦,那個 /var/ftp/uploads/ 還是需要可以被 ftp 這個使用者寫入才行!如此一來被上傳的檔案將會被修改檔案擁有者成為 daemon 這個使用者,而 ftp (匿名者取得的身份) 是無法讀取 daemon 的數據的,所以也就無法被下載啰! ^_^
| 例題: 在上述的設定后,我嘗試以 anonymous 登入并且上傳一個大檔案到 /uploads/ 目錄下。由于網絡的問題,這個檔案傳到一半就斷線。 下在我重新上傳時,卻告知這個檔案無法覆寫!該如何是好? 答: 為什么會無法覆寫呢?因為這個檔案在你脫機后,檔案的擁有者就被改為 daemon 了!因為這個檔案不屬于 ftp 這個用戶了, 因此我們無法進行覆寫或刪除的動作。此時,你只能更改本地端檔案的檔名再次的上傳,重新從頭一直上傳啰! |
-
被動式聯(lián)機埠口的限制
FTP 的聯(lián)機分為主動式與被動式,主動式聯(lián)機比較好處理,因為都是透過服務器的 port 20 對外主動聯(lián)機, 所以防火墻的處理比較簡單。被動式聯(lián)機就比較麻煩~因為預設 FTP 服務器會隨機取幾個沒有在使用當中的埠口來建立被動式聯(lián)機,那防火墻的設定就麻煩啦!
沒關系,我們可以透過指定幾個固定范圍內的埠口來作為 FTP 的被動式數據連接之用即可, 這樣我們就能夠預先知道 FTP 數據鏈路的埠口啦!舉例來說,我們假設被動式連接的埠口為 65400 到 65410 這幾個埠口時,可以這樣設定:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 增加底下這幾行即可啊! pasv_min_port=65400 pasv_max_port=65410[root@www ~]# /etc/init.d/vsftpd restart |
匿名用戶的設定大致上這樣就能符合你的需求啰!其他的設定就自己看著辦吧! ^_^
21.2.8 防火墻設定
防火墻設定有什么難的?將第九章里面的 script 拿出來修改即可啊!不過,如同前言談到的,FTP 使用兩個埠口,加上常有隨機啟用的數據流埠口,以及被動式聯(lián)機的服務器埠口等, 所以,你可能得要進行:
- 加入 iptables 的 ip_nat_ftp, ip_conntrack_ftp 兩個模塊
- 開放 port 21 給因特網使用
- 開放前一小節(jié)提到的 port 65400~65410 埠口給 Internet 聯(lián)機用
要修改的地方不少,那就讓我們來一步一腳印吧!
| # 1. 加入模塊:雖然 iptables.rule 已加入模塊,不過系統(tǒng)檔案還是修改一下好了: [root@www ~]# vim /etc/sysconfig/iptables-config IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp" # 加入模塊即可!兩個模塊中間有空格鍵隔開!然后重新啟動 iptables 服務啰![root@www ~]# /etc/init.d/iptables restart# 2. 修改 iptables.rule 的腳本如下: [root@www ~]# vim /usr/local/virus/iptables/iptables.rule iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT # 找到上面這一行,并將前面的批注拿掉即可!并且新增底下這一行喔! iptables -A INPUT -p TCP -i $EXTIF --dport 65400:65410 --sport 1024:65534 -j ACCEPT[root@www ~]# /usr/local/virus/iptables/iptables.rule |
這樣就好了!同時兼顧主動式與被動式的聯(lián)機!并且加入所需要的 FTP 模塊啰!
21.2.9 常見問題與解決之道
底下說明幾個常見的問題與解決之道吧!
- 如果在 Client 端上面發(fā)現無法聯(lián)機成功,請檢查:
- iptables 防火墻的規(guī)則當中,是否開放了 client 端的 port 21 登入?
- 在 /etc/hosts.deny 當中,是否將 client 的登入權限擋住了?
- 在 /etc/xinetd.d/vsftpd 當中,是否設定錯誤,導致 client 的登入權限被取消了?
- 如果 Client 已經連上 vsftpd 服務器,但是卻顯示『 XXX file can't be opend 』的字樣,請檢查:
- 最主要的原因還是在于在 vsftpd.conf 當中設定了檢查某個檔案,但是你卻沒有將該檔案設定起來, 所以,請檢查 vsftpd.conf 里面所有設定的檔案檔名,使用 touch 這個指令將該檔案建立起來即可!
- 如果 Client 已經連上 vsftpd 服務器,卻無法使用某個賬號登入,請檢查:
- 在 vsftpd.conf 里面是否設定了使用 pam 模塊來檢驗賬號,以及利用 userlist_file 來管理賬號?
- 請檢查 /etc/vsftpd/ftpusers 以及 /etc/vsftpd/user_list 檔案內是否將該賬號寫入了?
- 如果 Client 無法上傳檔案,該如何是好?
- 最可能發(fā)生的原因就是在 vsftpd.conf 里面忘記加上這個設定『write_enable=YES』這個設定,請加入;
- 是否所要上傳的目錄『權限』不對,請以 chmod 或 chown 來修訂;
- 是否 anonymous 的設定里面忘記加上了底下三個參數:
- anon_other_write_enable=YES
- anon_mkdir_write_enable=YES
- anon_upload_enable=YES
- 是否因為設定了 email 抵擋機制,又將 email address 寫入該檔案中了!?請檢查!
- 是否設定了不許 ASCII 格式傳送,但 Client 端卻以 ASCII 傳送呢?請在 client 端以 binary 格式來傳送檔案!
- 檢查一下 /var/log/messages ,是否被 SELinux 所抵擋住了呢?
上面是蠻常發(fā)現的錯誤,如果還是無法解決你的問題,請你務必分析一下這兩個檔案:/var/log/vsftpd.log 與 /var/log/messages ,里面有相當多的重要資料,可以提供給你進行除錯喔!不過 /var/log/vsftpd.log 卻預設不會出現! 只有 /var/log/xferlog 而已。如果你想要加入 /var/log/vsftpd.log 的支持,可以這樣做:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf dual_log_enable=YES vsftpd_log_file=/var/log/vsftpd.log # 加入這兩個設定值即可呦![root@www ~]# /etc/init.d/vsftpd restart |
這樣未來有新聯(lián)機或者是錯誤時,就會額外寫一份 /var/log/vsftpd.log 去喔!
21.3 客戶端的圖形接口 FTP 聯(lián)機軟件
客戶端的聯(lián)機軟件主要有文字接口的?ftp?及?lftp?這兩支指令,詳細的使用方式請參考第五章常用網絡指令的說明。至于 Linux 底下的圖形接口軟件,可以參考 gftp 這支程序喔!圖形接口的啦!很簡單啊!那 Windows 底下有沒有相對應的 FTP 客戶端軟件?
21.3.1 Filezilla
上述的軟件都是自由軟件啊,那么 Windows 操作系統(tǒng)有沒有自由軟件啊?有的,你可以使用 filezilla 這個好東西!這個玩意兒的詳細說明與下載點可以在底下的連結找到:
- 說明網站:http://filezilla.sourceforge.net/
- 下載網站:http://sourceforge.net/project/showfiles.php?group_id=21558
目前 (2011/06) 最新的穩(wěn)定版本是 3.5.x 版,所以底下鳥哥就以這個版本來跟大家說明。為什么要選擇 Filezilla 呢?除了他是自由軟件之外,這家伙竟然可以連結到 SSH 的 sftp 呢!真是很不錯的一個家伙啊!^_^!另外要注意的是,底下鳥哥是以 Windows 版本來說明的,不要拿來在 X window 上面安裝喔!^_^ (請下載 Filezilla client 不是 server 喔!)
因為這個程序是給 Windows 安裝用的,所以安裝的過程就是...(下一步)^n 就好了!并且這個程序支持多國語系, 所以你可以選擇繁體中文呢!實在是很棒!安裝完畢之后,請你執(zhí)行他,就會出現如下的畫面了:
圖 21.3-1、Filezilla 的操作接口示意圖
上圖的 第一、二到五區(qū)的內容所代表的資料是:
而另外圖中的 a, b, c 則代表的是:
好,接下來我們連接到 FTP 服務器上面去,所以你可按下圖 21.3-1 的 a 部分,會出現如下畫面:
圖 21.3-2、Filezilla 的 FTP 站臺管理員使用示意圖
上圖的箭頭與相關的內容是這樣的:
- 主機:在這個方框中填寫主機的 IP,端口如果不是標準的 port 21 才填寫其他埠口。
- 協(xié)定:主要有 (1)FTP 及 (2)SFTP (SSHD 所提供),我們這里選 FTP
- 加密:是否有網絡加密,新的協(xié)議中,FTP 可以加上 TLS 的 FTPS 喔!預設為明碼
- 登入型式:因為需要賬號密碼,選擇『一般』即可,然后底下就是輸入使用者、賬號即可。
基本上這樣設定完就能夠連上主機了,不過,如果你還想要更詳細的規(guī)范數據連接的方式 (主動式與被動式) 以及其他數據時, 可以按下的『傳輸設定』按鈕,就會出現如下畫面了:
圖 21.3-3、Filezilla 站臺管理員內的傳輸設定
在這個畫面當中你可以選擇是否使用被動式傳輸機制,還可以調整最大聯(lián)機數呢!為什么要自我限制呢? 因為 Filezilla 會主動的重復建立多條聯(lián)機來快速下載,但如果 vsftpd.conf 有限制 max_per_ip 的話, 某些下載會被拒絕的!因此,這個時候在此設定為 1 就顯的很重要~隨時只有一支聯(lián)機建立,就不會有重復登入的問題! 最后請按下圖 21.3-2 畫面中的『聯(lián)機』吧!
圖 21.3-4、Filezilla 聯(lián)機成功示意圖
更多的用法就請你自行研究啰!
21.3.2 透過瀏覽器取得 FTP 聯(lián)機
我們在?第二十章 WWW 服務器當中曾經談過瀏覽器所支持的協(xié)議,其中一個就是 ftp 這個協(xié)定啰!這個協(xié)議的處理方式可以在網址列的地方這樣輸入的:
- ftp://username@your_ip
要記得,如果你沒有輸入那個 username@ 的字樣時,系統(tǒng)默認會以匿名登錄來處理這次的聯(lián)機。因此如果你想要使用實體用戶聯(lián)機時, 就在在 IP 或主機名之前填寫你的賬號。舉例來說,鳥哥的 FTP 服務器 (192.168.100.254) 若有 dmtsai 這個使用者, 那我啟動瀏覽器后,可以這樣做:
- ftp://dmtsai@192.168.100.254
然后在出現的對話窗口當中輸入 dmtsai 的密碼,就能夠使用瀏覽器來管理我在 FTP 服務器內的文件系統(tǒng)啰!是否很容易啊 甚至,你連密碼都想要寫上網址列,那就更厲害啦!
- ftp://dmtsai:yourpassword@192.168.100.254
21.4 讓 vsftpd 增加 SSL 的加密功能
既然 http 都有 https 了,那么使用明碼傳輸的 ftp 有沒有加密的 ftps 呢?嘿嘿!說的好!有的啦~既然都有 openssl 這個加密函式庫, 我們當然能夠使用類似的機制來處理 FTP 啰!但前提之下是你的 vsftpd 有支持 SSL 函式庫才行!此外,我們也必須要建立 SSL 的憑證檔給 vsftpd 使用,這樣才能夠進行加密嘛!了解乎!接下來,就讓我們一步一步的進行 ftps 的服務器建置吧!
-
1. 檢查 vsftpd 有無支持 ssl 模塊:
如果你的 vsftpd 當初編譯的時候沒有支持 SSL 模塊,那么你就得只好自己重新編譯一個 vsftpd 的軟件了!我們的 CentOS 有支持嗎? 趕緊來瞧瞧:
| [root@www ~]# ldd $(which vsftpd) | grep ssllibssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f0587879000) |
如果有出現 libssl.so 的字樣,就是有支持!這樣才能夠繼續(xù)下一步呦!
-
2. 建立專門給 vsftpd 使用的憑證數據:
CentOS 給我們一個建立憑證的地方,那就是 /etc/pki/tls/certs/ 這個目錄!詳細的說明我們在?20.5.2?里面談過咯,所以這里只介紹怎么做:
| [root@www ~]# cd /etc/pki/tls/certs [root@www certs]# make vsftpd.pem ----- ....(前面省略).... Country Name (2 letter code) [XX]:TW State or Province Name (full name) []:Taiwan Locality Name (eg, city) [Default City]:Tainan Organization Name (eg, company) [Default Company Ltd]:KSU Organizational Unit Name (eg, section) []:DIC Common Name (eg, your name or your server's hostname) []:www.centos.vbird Email Address []:root@www.centos.vbird[root@www certs]# cp -a vsftpd.pem /etc/vsftpd/ [root@www certs]# ll /etc/vsftpd/vsftpd.pem -rw-------. 1 root root 3116 2011-08-08 16:52 /etc/vsftpd/vsftpd.pem # 要注意一下權限喔! |
-
3. 修改 vsftpd.conf 的配置文件,假定有實體、匿名賬號:
在前面 21.2 里面大多是單純匿名或單純實體帳戶,這里我們將實體賬號透過 SSL 聯(lián)機,但匿名者使用明碼傳輸! 兩者同時提供給客戶端使用啦!FTP 的設定項目主要是這樣:
- 提供實體賬號登入,實體賬號可上傳數據,且 umask 為 002
- 實體賬號默認為 chroot 的情況,且全部實體賬號可用帶寬為 1Mbytes/second
- 實體賬號的登入與數據傳輸均需透過 SSL 加密功能傳送;
- 提供匿名登錄,匿名者僅能下載,不能上傳,且使用明碼傳輸 (不透過 SSL)
此時,整體的設定值會有點像這樣:
| [root@www ~]# vim /etc/vsftpd/vsftpd.conf # 實體賬號的一般設定項目: local_enable=YES write_enable=YES local_umask=002 chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list local_max_rate=10000000# 匿名者的一般設定: anonymous_enable=YES no_anon_password=YES anon_max_rate=1000000 data_connection_timeout=60 idle_session_timeout=600# 針對 SSL 所加入的特別參數!每個項目都很重要! ssl_enable=YES <==啟動 SSL 的支持 allow_anon_ssl=NO <==但是不允許匿名者使用 SSL 喔! force_local_data_ssl=YES <==強制實體用戶數據傳輸加密 force_local_logins_ssl=YES <==同上,但連登入時的帳密也加密 ssl_tlsv1=YES <==支持 TLS 方式即可,底下不用啟動 ssl_sslv2=NO ssl_sslv3=NO rsa_cert_file=/etc/vsftpd/vsftpd.pem <==預設 RSA 加密的憑證檔案所在# 一般服務器系統(tǒng)設定的項目: max_clients=50 max_per_ip=5 use_localtime=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd tcp_wrappers=YES banner_file=/etc/vsftpd/welcome.txt dual_log_enable=YES vsftpd_log_file=/var/log/vsftpd.log pasv_min_port=65400 pasv_max_port=65410[root@www ~]# /etc/init.d/vsftpd restart |
-
4. 聯(lián)機測試看看!使用 Filezilla 聯(lián)機測試:
接下來我們利用 filezilla 來說明一下,如何透過 SSL/TLS 功能來進行聯(lián)機加密。很簡單,只要在站臺管理員的地方選擇:
圖 21.4-1、透過 Filezilla 聯(lián)機到 SSL/TLS 支持的 FTP 方式
如上圖所示,重點在箭頭所指的地方,需要透過 TLS 的加密方式才行!然后,鳥哥嘗試使用 student 這個一般賬號登入系統(tǒng), 聯(lián)機的時候,應該會出現如下的圖示才對:
圖 21.4-2、透過 Filezilla 是否接受憑證呢?
如果一切都沒有問題,那么你可以點選上圖那個『總是信任』的項目,如此一來,未來聯(lián)機到這個地方就不會再次要你確認憑證啦! 很簡單的解決了 FTP 聯(lián)機加密的問題啰!^_^
| 例題: 想一想,既然有了 SFTP 可以進行加密的 FTP 傳輸,那為何需要 ftps 呢? 答: 因為既然要開放 SFTP 的話,就得要同時放行 sshd 亦即是 ssh 的聯(lián)機,如此一來,你的 port 22 很可能會常常被偵測~若是 openssl, openssh 出問題,恐怕你的系統(tǒng)就會被綁架。如果你的 FTP 真的有必要存在,那么透過 ftps 以及利用 vsftpd 這個較為安全的服務器軟件來架設, 理論上,是要比 sftp 來的安全些~至少對 Internet 放行 ftps 還不會覺得很可怕... |
21.5 重點回顧
- FTP 是文件傳輸協(xié)議 (File Transfer Protocol) 的簡寫,主要的功能是進行服務器與客戶端的檔案管理、傳輸等事項;
- FTP 的服務器軟件非常多,例如 Wu FTP, Proftpd, vsftpd 等等,各種 FTP 服務器軟件的發(fā)展理念并不相同, 所以選擇時請依照你的需求來決定所需要的軟件;
- FTP 使用的是明碼傳輸,而過去一些 FTP 服務器軟件也曾被發(fā)現安全漏洞,因此設定前請確定該軟件已是最新版本,避免安全議題的衍生;
- 由于 FTP 是明碼傳輸,其實可以使用 SSH 提供的 sftp 來取代 FTP ;
- 大多數的 FTP 服務器軟件都提供 chroot 的功能,將實體用戶限制在他的家目錄內;
- FTP 這個 daemon 所開啟的正規(guī)埠口為 20 與 21 ,其中 21 為命令通道, 20 為主動聯(lián)機的數據傳輸信道;
- FTP 的數據傳輸方式主要分為主動與被動(Passive, PASV),如果是主動的話,則 ftp-data 在服務器端主動以 port 20 連接到客戶端,否則需開放被動式監(jiān)聽的埠口等待客戶端來連接;
- 在 NAT 主機內的客戶端 FTP 軟件聯(lián)機時可能發(fā)生困擾,這可以透過 iptables 的 nat 模塊或利用被動式聯(lián)機來克服;
- 一般來說, FTP 上面共有三個群組,分別是實體用戶、訪客與匿名登錄者(real, guest, anonymous);
- 可以藉由修改 /etc/passwd 里面的 Shell 字段,來讓使用者僅能使用 FTP 而無法登入主機;
- FTP 的指令、與用戶活動所造成的登錄檔是放置在 /var/log/xferlog 里面;
- vsftpd 為專注在安全議題上而發(fā)展的一套 FTP 服務器軟件,他的配置文件在 /etc/vsftpd/vsftpd.conf
21.6 本章習題
- FTP 在建立聯(lián)機以及數據傳輸時,會建立哪些聯(lián)機? 需建立兩種聯(lián)機,分別是命令信道與數據傳輸信道。在主動式聯(lián)機上為 port 21(ftp) 與 port 20(ftp-data)。
- FTP 主動式與被動式聯(lián)機有何不同? 主動式聯(lián)機的時候,命令聯(lián)機是由 client 端主動連接到服務器端,但是 ftp-data 則是由服務器端主動的聯(lián)機到 client 端。至于被動式聯(lián)機的時候,則不論 command 還是 ftp-data 的聯(lián)機,服務器端都是監(jiān)聽客戶端的要求的!
- 有哪些動作可以讓你的 FTP 主機更為安全 (secure) ?
- 隨時更新服務器軟件到最新版本;
- 讓 guest 與 anonymous 的家目錄限制在固定的目錄中(chroot 或是 restricted);
- 拒絕 root 的登入或者其他系統(tǒng)賬號的登入;
- 拒絕大部分的 upload 行為!
- 我們知道 ftp 會啟用兩個 ports ,請問這兩個 port 在哪里規(guī)范的 (以 vsftpd 為例)?而且,一般正規(guī)的 port 是幾號? 若為 stand alone 時,都是由 vsftpd.conf 規(guī)范,命令通道為 listen_port=21 規(guī)范,數據連接為 connect_from_port_20=YES 及pasv_max_port=0, pasv_max_port=0 所規(guī)范。
若是 super daemon 所管理時,命令信道則由 /etc/services 所規(guī)范了。 - 那幾個檔案可以用來抵擋類似 root 這種系統(tǒng)賬號的登入 FTP? /etc/vsftpd/ftpusers
/etc/vsftpd/user_list - 在 FTP 的 server 與 client 端進行數據傳輸時,有哪兩種模式?為何這兩種模式影響數據的傳輸很重要? 數據的傳輸有 ASCII 與 Binary 兩種方式,在進行 ascii 傳送方式時,被傳送的檔案將會以文本模式來進行傳送的行為, 因此,檔案的屬性會被修改過,可能造成執(zhí)行檔最后卻無法執(zhí)行等的問題!一般來說,ASCII 通常僅用在文本文件與一些原始碼檔案的傳送。
- 我的主機明明時區(qū)設定沒有問題,但為何登入 vsftpd 這個 FTP 服務時,時間就是少八小時?該如何解決? 肯定是時區(qū)方面出了問題,應該就是 vsftpd.conf 里面少了『 use_localtime=YES 』這個參數了。
21.7 參考數據與延伸閱讀
- vsftpd 官方網站:http://vsftpd.beasts.org/
- man 5 vsftpd.conf
- Filezilla 官方網站:http://filezilla.sourceforge.net/
- vsftpd + ssl 功能:http://wiki.vpslink.com/Configuring_vsftpd_for_secure_connections_%28TLS/SSL/SFTP%29
- http://beginlinux.com/blog/2009/01/secure-ftp-with-ssl-on-centos/
總結
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(服务器)- 第二十一章、文件服务器之三: FTP 服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的Linux私房菜(服务器)- 第二
- 下一篇: 鸟哥的Linux私房菜(服务器)- 簡易