利用一個比較安全的 FTP 軟體來架設檔案伺服器!
FTP (File transfer protocol) 是相當古老的傳輸協定之一,他最主要的功能是在伺服器與用戶端之間進行檔案的傳輸。
這個古老的協定使用的是明碼傳輸方式,且過去有相當多的安全危機歷史。為了更安全的使用 FTP
協定,我們主要介紹較為安全但功能較少的 vsftpd 這個軟體吶。
FTP 伺服器的功能除了單純的進行檔案的傳輸與管理之外,依據伺服器軟體的設定架構,它還可以提供幾個主要的功能。
底下我們約略的來談一談:
FTP 伺服器在預設的情況下,依據使用者登入的情況而分為三種不同的身份,分別是:
(1)實體帳號,real user;(2)訪客, guest;(3)匿名登入者, anonymous
這三種。這三種身份的使用者在系統上面的使用權限差異很大喔!例如實體用戶取得系統的權限比較完整,
所以可以進行比較多的動作;至於匿名登入者,大概我們就僅提供他下載資源的能力而已,並不許匿名者使用太多主機的資源啊!
當然,這三種人物能夠使用的『線上指令』自然也就不相同囉! ^_^
FTP 可以利用系統的 syslogd 來進行資料的紀錄,
而記錄的資料包括了使用者曾經下達過的命令與使用者傳輸資料(傳輸時間、檔案大小等等)的紀錄呢!
所以你可以很輕鬆的在 /var/log/ 裡面找到各項登錄資訊喔!
為了避免使用者在你的 Linux 系統當中隨意逛大街 (意指離開使用者自己的家目錄而進入到 Linux 系統的其他目錄去), 所以將使用者的工作範圍『侷限』在使用者的家目錄底下,嗯!實在是個不錯的好主意!FTP 可以限制使用者僅能在自己的家目錄當中活動喔!如此一來,由於使用者無法離開自己的家目錄,而且登入 FTP 後,顯示的『根目錄』就是自己家目錄的內容,這種環境稱之為 change root ,簡稱 chroot ,改變根目錄的意思啦!
這有什麼好處呢?當一個惡意的使用者以 FTP 登入你的系統當中,如果沒有 chroot 的環境下,他可以到 /etc, /usr/local, /home 等其他重要目錄底下去察看檔案資料,尤其是很重要的 /etc/ 底下的設定檔,如 /etc/passwd 等等。如果你沒有做好一些檔案權限的管理與保護,那他就有辦法取得系統的某些重要資訊, 用來『入侵』你的系統呢!所以在 chroot 的環境下,當然就比較安全一些咯!
FTP 的傳輸使用的是 TCP 封包協定,在第二章網路基礎中我們談過, TCP 在建立連線前會先進行三向交握。不過 FTP 伺服器是比較麻煩一些,因為 FTP 伺服器使用了兩個連線,分別是命令通道與資料流通道 (ftp-data) 。這兩個連線都需要經過三向交握, 因為是 TCP 封包嘛!那麼這兩個連線通道的關係是如何呢?底下我們先以 FTP 預設的主動式 (active) 連線來作個簡略的說明囉:
簡單的連線流程就如上圖所示,至於連線的步驟是這樣的:
如此一來則成功的建立起『命令』與『資料傳輸』兩個通道!不過,要注意的是,
『資料傳輸通道』是在有資料傳輸的行為時才會建立的通道喔!並不是一開始連接到 FTP
伺服器就立刻建立的通道呢!留意一下囉!
利用上述的說明來整理一下 FTP 伺服器端會使用到的埠號主要有:
再強調一次,這兩個埠口的工作是不一樣的,而且,重要的是兩者的連線發起端是不一樣的!首先 port 21 主要接受來自用戶端的主動連線,至於 port 20
則為 FTP 伺服器主動連線至用戶端呢!這樣的情況在伺服器與用戶端兩者同時為公共 IP (Public IP)
的網際網路上面通常沒有太大的問題,不過,萬一你的用戶端是在防火牆後端,或者是 NAT
伺服器後端呢?會有什麼問題發生呢?底下我們來談一談這個嚴重的問題!
回想一下我們的第九章防火牆! 一般來說,很多的區域網路都會使用防火牆 (iptables) 的 NAT 功能,那麼在 NAT 後端的 FTP 用戶如何連接到 FTP 伺服器呢? 我們可以簡單的以下圖來說明:
瞭解問題的所在了嗎?在 FTP 的主動式連線當中,NAT 將會被視為用戶端,但 NAT 其實並非用戶端啊, 這就造成問題了。如果你曾經在 IP 分享器後面連接某些 FTP 伺服器時,可能偶爾會發現明明就連接上 FTP 伺服器了 (命令通道已建立),但是就是無法取得檔案名稱的列表,而是在超過一段時間後顯示『 Can't build data connection: Connection refused,無法進行資料傳輸』之類的訊息, 那肯定就是這個原因所造成的困擾了。
那有沒有辦法可以克服這個問題呢?難道真的在 Linux NAT 後面就一定無法使用 FTP 嗎?當然不是! 目前有兩個簡易的方法可以克服這個問題:
那麼什麼是被動式連線呢?我們可以使用底下的圖示來作個簡略的介紹喔:
發現上面的不同點了嗎?被動式 FTP 資料通道的連線方向是由用戶端向伺服器端連線的喔! 如此一來,在 NAT 內部的用戶端主機就可以順利的連接上 FTP Server 了!但是,萬一 FTP 主機也是在 NAT 後端那怎麼辦...呵呵!那可就糗了吧~ @_@這裡就牽涉到更深入的 DMZ 技巧了,我們這裡暫不介紹這些深入的技巧,先理解一下這些特殊的連線方向, 這將有助於你未來伺服器架設時候的考慮因素喔!
此外,不曉得你有無發現,透過 PASV 模式,伺服器在沒有特別設定的情況下,會隨機選取大於 1024 的埠口來提供用戶端連接之用。那麼萬一伺服器啟用的埠口被搞鬼怎麼辦?而且, 如此一來也很難追蹤來自入侵者攻擊的登錄資訊啊!所以,這個時候我們可以透過 passive ports 的功能來『限定』伺服器啟用的 port number 喔!
其實,在 FTP 上面傳送的資料很可能被竊取,因為 FTP 是明碼傳輸的嘛!而且某些 FTP 伺服器軟體的資安歷史問題也是很嚴重的。 因此,一般來說,除非是學校或者是一些社團單位要開放沒有機密或授權問題的資料之外,FTP 是少用為妙的。
拜 SSH 所賜,目前我們已經有較為安全的 FTP 了,那就是 ssh 提供的 sftp 這個 server 啊!這個 sftp-server 最大的優點就是:『在上面傳輸的資料是經過加密的』!所以在網際網路上面流竄的時候, 嘿嘿!畢竟是比較安全一些啦!所以建議你,除非必要,否則的話使用 SSH 提供的 sftp-server 功能即可~
然而這個功能對於一些習慣了圖形介面,或者是有中文檔名的使用者來說,實在是不怎麼方便, 雖說目前有個圖形介面的 filezilla 用戶端軟體,不過很多時候還是會發生一些莫名的問題說! 所以,有的時候 FTP 網站還是有其存在的需要的。如果真的要架設 FTP 網站,那麼還是得需要注意幾個事項喔:
無論如何,在網路上聽過太多人都是由於開放 FTP 這個伺服器而導致整個主機被入侵的事件,所以, 這裡真的要給他一直不斷的強調,要注意安全啊!
既然 FTP 是以明碼傳輸,並且某些早期的 FTP 伺服器軟體也有不少的安全性漏洞,那又為何需要架設 FTP 伺服器啊?
沒辦法啊,總是有人有需要這個玩意兒的,譬如說各大專院校不就有提供 FTP 網站的服務嗎?
這樣可以讓校內的同學共同分享校內的網路資源嘛!不過,由於 FTP 登入者的身份可以分為三種,
你到底要開放哪一種身份登入呢?這個時候你可以這樣簡單的思考一下囉:
很多的 FTP 伺服器預設就已經允許實體用戶的登入了。不過,需要瞭解的是,以實體用戶做為 FTP 登入者身份時, 系統預設並沒有針對實體用戶來進行『限制』的,所以他可以針對整個檔案系統進行任何他所具有權限的工作。 因此,如果你的 FTP 使用者沒能好好的保護自己的密碼而導致被入侵,那麼你的整個 Linux 系統資料將很有可能被竊取啊! 開放實體用戶時的建議如下:
通常會建立 guest 身份的案例當中,多半是由於伺服器提供了類似『個人 Web 首頁』的功能給一般身份使用者, 那麼這些使用者總是需要管理自己的網頁空間吧?這個時候將使用者的身份壓縮成為 guest ,並且將他的可用目錄設定好,即可提供使用者一個方便的使用環境了!且不需要提供他 real user 的權限喔! 常見的建議如下:
雖然提供匿名登入給網際網路的使用者進入實在不是個好主意,因為每個人都可以去下載你的資料, 萬一頻寬被吃光光怎麼辦?但如同前面講過的,學校單位需要分享全校同學一些軟體資源時, FTP 伺服器也是一個很不錯的解決方案啊!你說是吧。如果要開放匿名使用者的話,要注意:
一般來說,如果你是要放置一些公開的、沒有版權糾紛的資料在網路上供人下載的話, 那麼一個僅提供匿名登入的 FTP 伺服器,並且對整個網際網路開放是 OK 的啦! 不過,如果你預計要提供的的軟體或資料是具有版權的,但是該版權允許你在貴單位內傳輸的情況下, 那麼架設一個『僅針對內部開放的匿名 FTP 伺服器 (利用防火牆處理) 』也是 OK 的啦!
如果你還想要讓使用者反饋的話,那是否要架設一個匿名者可上傳的區域呢?鳥哥對這件事情的看法是.... 『萬萬不可』啊!如果要讓使用者反饋的話,除非該使用者是你信任的,否則不要允許對方上傳! 所以此時一個檔案系統權限管理嚴格的 FTP 伺服器,並提供實體用戶的登入就有點需求啦! 總之,要依照你的需求來思考是否有需要喔!
終於要來聊一聊這個簡單的 vsftpd 囉!vsftpd 的全名是『Very Secure FTP Daemon 』的意思,
換句話說,vsftpd 最初發展的理念就是在建構一個以安全為重的 FTP 伺服器呢!我們先來聊一聊為什麼 vsftpd
號稱『非常安全』呢?然後再來談設定吧!
為了建構一個安全為主的 FTP 伺服器, vsftpd 針對作業系統的『程序的權限 (privilege)』概念來設計, 如果你讀過基礎篇的十七章程序與資源管理的話, 應該會曉得系統上面所執行的程式都會引發一個程序,我們稱他為 PID (Process ID), 這個 PID 在系統上面能進行的任務與他擁有的權限有關。也就是說, PID 擁有的權限等級越高, 他能夠進行的任務就越多。舉例來說,使用 root 身份所觸發的 PID 通常擁有可以進行任何工作的權限等級。
不過,萬一觸發這個 PID 的程式 (program) 有漏洞而導致被網路怪客 (cracker) 所攻擊而取得此 PID 使用權時, 那麼網路怪客將會取得這個 PID 擁有的權限吶!所以,近來發展的軟體都會盡量的將服務取得的 PID 權限降低,使得該服務即使不小心被入侵了,入侵者也無法得到有效的系統管理權限,這樣會讓我們的系統較為安全的啦。 vsftpd 就是基於這種想法而設計的。
除了 PID 方面的權限之外, vsftpd 也支援 chroot 這個函式的功能,chroot 顧名思義就是『 change root directory 』的意思,那個 root 指的是『根目錄』而非系統管理員。 他可以將某個特定的目錄變成根目錄,所以與該目錄沒有關係的其他目錄就不會被誤用了。
舉例來說,如果你以匿名身份登入我們的 ftp 服務的話,通常你會被限定在 /var/ftp 目錄下工作, 而你看到的根目錄其實就只是 /var/ftp ,至於系統其他如 /etc, /home, /usr... 等其他目錄你就看不到了! 這樣一來即使這個 ftp 服務被攻破了,沒有關係,入侵者還是僅能在 /var/ftp 裡面跑來跑去而已,而無法使用 Linux 的完整功能。自然我們的系統也就會比較安全啦!
vsftpd 是基於上面的說明來設計的一個較為安全的 FTP 伺服器軟體,他具有底下的特點喔:
由於具有這樣的特點,所以 vsftpd 會變的比較安全一些咯!底下就開始來談如何設定吧!
vsftpd 所需要的軟體只有一個,那就是 vsftpd 啊!^_^!如果你的 CentOS 沒有安裝,請利用 yum install vsftpd 來安裝他吧!軟體很小,下載連同安裝不需要幾秒鐘就搞定了!而事實上整個軟體提供的設定檔也少的令人高興!簡單易用就是 vsftpd 的特色啊!這些設定資料比較重要的有:
[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 system-auth account include system-auth session include system-auth session required pam_loginuid.so |
[root@www ~]# cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon ....(底下省略).... |
大致上就只有這幾個檔案需要注意而已,而且每個檔案的設定又都很簡單!真是不錯啊!
事實上,/etc/vsftpd/vsftpd.conf 本身就是一個挺詳細的設定檔,且使用『 man 5 vsftpd.conf 』則可以得到完整的參數說明。
不過我們這裡依舊先將 vsftpd.conf 內的常用參數給他寫出來,希望對你有幫助:
上面這些是常見的 vsftpd 的設定參數,還有很多參數我沒有列出來,你可以使用 man 5 vsftpd.conf 查閱喔!不過,基本上上面這些參數已經夠我們設定 vsftpd 囉。
vsftpd 可以使用 stand alone 或 super daemon 的方式來啟動,我們 CentOS 預設是以 stand alone 來啟動的。
那什麼時候應該選擇 stand alone 或者是 super daemon 呢?如果你的 ftp
伺服器是提供給整個網際網路來進行大量下載的任務,例如各大專院校的 FTP 伺服器,那建議你使用 stand alone 的方式,
服務的速度上會比較好。如果僅是提供給內部人員使用的 FTP 伺服器,那使用 super daemon 來管理即可啊。
其實 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 所啟動的呢! |
如果你的 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 = stream wait = no user = root server = /usr/sbin/vsftpd log_on_success += DURATION USERID log_on_failure += USERID nice = 10 disable = 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 |
有趣吧!兩者啟動的方式可不一樣啊!管理的方式就會差很多的呦!不管你要使用哪種啟動的方式,切記不要兩者同時啟動,否則會發生錯誤的!你應該使用 chkconfig --list 檢查一下這兩種啟動的方式,然後依據你的需求來決定用哪一種方式啟動。鳥哥底下的設定都會以 stand alone 這個 CentOS 預設的啟動模式來處理,所以趕緊將剛剛的動作給他改回來喔!
在 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. 與伺服器環境有關的設定 dirmessage_enable=YES <==若目錄下有 .message 則會顯示該檔案的內容 xferlog_enable=YES <==啟動登錄檔記錄,記錄於 /var/log/xferlog connect_from_port_20=YES <==支援主動式連線功能 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 可以達到如下的功能:
所以當你啟動 vsftpd 後,你的實體用戶就能夠直接利用 vsftpd 這個服務來傳輸他自己的資料了。 不過比較大的問題是,因為 vsftpd 預設使用 GMT 時間,因為你在用戶端使用 ftp 軟體連接到 FTP 伺服器時,會發現每個檔案的時間都慢了八小時了!真是討厭啊! 所以建議你加設一個參數值,就是『 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 使用時,請注意得要開放防火牆喔!關於防火牆的建置情況, 由於牽涉到資料流的主動、被動連線方式,因此,還得要加入防火牆模組。這部份我們在後續的 21.2.8 小節再加以介紹,反正,最終記得要開放 FTP 的連線要求就對了!
雖然在 CentOS 的預設情況當中實體用戶已經可以使用 FTP 的服務了,不過我們可能還需要一些額外的功能來限制實體用戶。 舉例來說,限制使用者無法離開家目錄 (chroot)、限制下載速率、限制使用者上傳檔案時的權限 (mask) 等等。 底下我們先列出一些希望達到的功能,然後再繼續進行額外功能的處理:
你可以自行處理 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. 與伺服器環境有關的設定 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 |
[root@www ~]# vim /etc/vsftpd/welcome.txt 歡迎光臨本小站,本站提供 FTP 的相關服務! 主要的服務是針對本機實體用戶提供的, 若有任何問題,請與鳥哥聯絡! |
[root@www ~]# vim /etc/vsftpd/user_list root bin ....(底下省略).... |
# 測試使用已知使用者登入,例如 dmtsai 這個實體用戶: [root@www ~]# ftp localhost Connected to localhost.localdomain. 220-歡迎光臨本小站,本站提供 FTP 的相關服務! <==剛剛建立的歡迎訊息 220-主要的服務是針對本機實體用戶提供的, 220-若有任何問題,請與鳥哥聯絡! 220 Name (localhost:root): student 331 Please specify the password. Password: <==輸入密碼囉在這裡! 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. <==預設使用二進位傳輸! ftp> bye 221 Goodbye. |
上面是最簡單的實體帳號相關設定。那如果你還想要限制使用者家目錄的 chroot
或其他如速限等資料,就得要看看底下的特殊設定項目囉。
在預設的情況下,CentOS 的 FTP 是不允許實體帳號登入取得家目錄資料的,這是因為 SELinux 的問題啦! 如果你在剛剛的 ftp localhost 步驟中,在 bye 離開 FTP 之前下達過『 dir 』的話,那你會發現沒有任何資料跑出來~ 這並不是你錯了,而是 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 allow_tftp_anon_write --> off ftp_home_dir --> off <==就是這玩意兒!要設定 on 才行! ftpd_connect_db --> off ....(底下省略).... [root@www ~]# setsebool -P ftp_home_dir=1 |
這樣就搞定囉!如果還有其他可能發生錯誤的原因,包括檔案資料使用 mv 而非使用 cp 導致 SELinux
檔案類型無法繼承原有目錄的類型時,那就請自行查閱 /var/log/messages 的內容吧!通常 SELinux
沒有這麼難處理的啦!^_^
在鳥哥接觸的一般 FTP 使用環境中,大多數都是要開放給廠商連線來使用的,給自己人使用的機會雖然也有, 不過使用者數量通常比較少一些。所以囉,鳥哥現在都是建議預設讓實體用戶通通被 chroot, 而允許不必 chroot 的帳號才需要額外設定。這樣的好處是,新建的帳號如果忘記進行 chroot,反正原本就是 chroot, 比較不用擔心如果該帳號是開給廠商時該怎辦的問題。
現在假設我系統裡面僅有 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 在他們的家目錄下,
這樣對系統比較好啦!接下來,請你自己分別使用有與沒有被 chroot 的帳號來連線測試看看。
你可不希望頻寬被使用者上傳/下載所耗盡,而影響咱們伺服器的其他正常服務吧?所以限制使用者的傳輸頻寬有時也是需要的! 假設『我要限制所有使用者的總傳輸頻寬最大可達 1 MBytes/秒 』時,你可以這樣做即可:
[root@www ~]# vim /etc/vsftpd/vsftpd.conf # 增加底下這一個參數即可: local_max_rate=1000000 <==記住喔,單位是 bytes/second [root@www ~]# /etc/init.d/vsftpd restart |
上述的單位是 Bytes/秒,所以你可以依據你自己的網路環境來限制你的頻寬!這樣就給他限制好囉!有夠容易吧!
那怎麼測試啊?很簡單,用本機測試最準!你可以用 dd 做出一個 10MB 的檔案放在 student 的家目錄下,然後用 root 下達
ftp localhost,並輸入 student 的帳密,接下來給他 get 這個新的檔案,就能夠在最終知道下載的速度啦!
如果你有限制最大使用頻寬的話,那麼你可能還需要限制最大線上人數才行!舉例來說,你希望最多只有 10 個人同時使用你的 FTP 的話,並且每個 IP 來源最多只能建立一條 FTP 的連線時,那你可以這樣做:
[root@www ~]# vim /etc/vsftpd/vsftpd.conf # 增加底下的這兩個參數: max_clients=10 max_per_ip=1 [root@www ~]# /etc/init.d/vsftpd restart |
這樣就搞定了!讓你的 FTP 不會人滿為患吶!
在預設的環境當中,我們是將『不許使用 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 才行! 使用這個機制請特別小心,否則容易搞混掉~
透過這幾個簡單的設定值,相信 vsftpd 已經可以符合大部分合法 FTP 網站的需求囉! 更多詳細的用法則請參考 man 5 vsftpd.conf 吧!
例題:
假設你因為某些特殊需求,所以必須要開放 root 使用 FTP 傳輸檔案,那麼你應該要如何處理?
答:
由於系統帳號無法使用 FTP 是因為 PAM 模組與 vsftpd 的內建功能所致,亦即是 /etc/vsftpd/ftpusers 及 /etc/vsftpd/user_list
這兩個檔案的影響。所以你只要進入這兩個檔案,並且將 root 那一行註解掉,那 root 就可以使用 vsftpd這個 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 <==匿名登入時,系統不會檢驗密碼 (通常是email) anon_max_rate=1000000 <==最大頻寬使用為 1MB/s 左右 data_connection_timeout=60 <==資料流連線的 timeout 為 60 秒 idle_session_timeout=600 <==若匿名者發呆超過 10 分鐘就斷線 max_clients=50 <==最大連線與每個 IP 的可用連線 max_per_ip=5 # 2. 與實體用戶相關的資訊,本案例中為關閉他的情況! local_enable=NO # 3. 與伺服器環境有關的設定 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 |
[root@www ~]# vim /etc/vsftpd/anon_welcome.txt 歡迎光臨本站所提供的 FTP 服務! 本站主要提供 Linux 作業系統相關檔案以及 GNU 自由軟體喔! 有問題請與站長聯絡!謝謝大家! 主要的目錄為: linux 提供 Linux 作業系統相關軟體 gnu 提供 GNU 的自由軟體 uploads 提供匿名的您上傳資料 |
[root@www ~]# ftp localhost Connected to localhost.localdomain. 220-歡迎光臨本站所提供的 FTP 服務! <==底下這幾行中文就是歡迎與提示訊息! 220-本站主要提供 Linux 作業系統相關檔案以及 GNU 自由軟體喔! 220-有問題請與站長聯絡!謝謝大家! 220-主要的目錄為: 220- 220-linux 提供 Linux 作業系統相關軟體 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,135,141) 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Jun 02 15:07 gnu -rw-r--r-- 1 0 0 17 May 24 14:46 index.html drwxr-xr-x 2 0 0 4096 Jun 02 15:07 linux drwxr-xr-x 2 0 0 4096 Mar 31 07:49 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 的檔案系統權限正確才行! 我們知道匿名者取得的身份是 ftp ,所以如果想讓匿名者上傳資料到 /var/ftp/uploads/ 中,則需要這樣做:
[root@www ~]# mkdir /var/ftp/uploads [root@www ~]# chown ftp /var/ftp/uploads |
然後你以匿名者身份登入後,就會發現匿名者的根目錄多了一個 /upload 的目錄存在了,並且你可以在該目錄中上傳檔案/目錄喔! 如此一來系統的權限大開!很要命喔!所以,請仔細的控制好你的上傳目錄才行!
不過,在實際測試當中,卻發現還是沒辦法上傳呢!怎麼回事啊?如果你有去看一下 /var/log/messages 的話,那就會發現啦! 又是 SELinux 這傢伙呢!怎麼辦?就透過『 sealert -l ... 』在 /var/log/messages 裡面觀察到的指令丟進去, 立刻就知道解決方案啦!解決方案就是放行 SELinux 的匿名 FTP 規則如下:
[root@www ~]# setsebool -P allow_ftpd_anon_write=1 [root@www ~]# setsebool -P allow_ftpd_full_access=1 |
然後你再測試一下用 anonymous 登入,到 /uploads 去上傳個檔案吧!就會知道能不能成功哩!
一般來說,使用者上傳的資料在管理員尚未查閱過是否合乎版權等相關事宜前,是不應該讓其他人下載的! 然而前一小節的設定當中,使用者上傳的資料是可以被其他人所瀏覽與下載的!如此一來實在是很危險!所以如果你要設定 /var/ftp/uploads/ 內透過匿名者上傳的資料中,僅能上傳不能被下載時,那麼被上傳的資料的權限就得要修改一下才行! 請將前一小節所設定的四個參數簡化成為:
[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 這個用戶了,
因此我們無法進行覆寫或刪除的動作。此時,你只能更改本地端檔案的檔名再次的上傳,重新從頭一直上傳囉!
|
FTP 的連線分為主動式與被動式,主動式連線比較好處理,因為都是透過伺服器的 port 20 對外主動連線, 所以防火牆的處理比較簡單。被動式連線就比較麻煩~因為預設 FTP 伺服器會隨機取幾個沒有在使用當中的埠口來建立被動式連線,那防火牆的設定就麻煩啦!
沒關係,我們可以透過指定幾個固定範圍內的埠口來作為 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 |
匿名使用者的設定大致上這樣就能符合你的需求囉!其他的設定就自己看著辦吧! ^_^
防火牆設定有什麼難的?將第九章裡面的 script 拿出來修改即可啊!不過,如同前言談到的,FTP 使用兩個埠口,加上常有隨機啟用的資料流埠口,以及被動式連線的伺服器埠口等, 所以,你可能得要進行:
要修改的地方不少,那就讓我們來一步一腳印吧!
# 1. 加入模組:雖然 iptables.rule 已加入模組,不過系統檔案還是修改一下好了: [root@www ~]# vim /etc/sysconfig/iptables-config IPTABLES_MODULES="ip_conntrack_netbios_ns 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 |
這樣就好了!同時兼顧主動式與被動式的連線!並且加入所需要的 FTP 模組囉!
底下說明幾個常見的問題與解決之道吧!
上面是蠻常發現的錯誤,如果還是無法解決你的問題,請你務必分析一下這兩個檔案:/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 |
這樣未來有新連線或者是錯誤時,就會額外寫一份 /var/log/vsftpd.log 去喔!
用戶端的連線軟體主要有文字介面的 ftp 及
lftp 這兩支指令,詳細的使用方式請參考第五章常用網路指令的說明。至於 Linux 底下的圖形介面軟體,可以參考 gftp
這支程式喔!圖形介面的啦!很簡單啊!那 Windows 底下有沒有相對應的 FTP 用戶端軟體?
上述的軟體都是自由軟體啊,那麼 Windows 作業系統有沒有自由軟體啊?有的,你可以使用 filezilla 這個好東西!這個玩意兒的詳細說明與下載點可以在底下的連結找到:
目前 (2011/06) 最新的穩定版本是 3.5.x 版,所以底下鳥哥就以這個版本來跟大家說明。為什麼要選擇 Filezilla 呢?除了他是自由軟體之外,這傢伙竟然可以連結到 SSH 的 sftp 呢!真是很不錯的一個傢伙啊!^_^!另外要注意的是,底下鳥哥是以 Windows 版本來說明的,不要拿來在 X window 上面安裝喔!^_^ (請下載 Filezilla client 不是 server 喔!)
因為這個程式是給 Windows 安裝用的,所以安裝的過程就是...(下一步)^n 就好了!並且這個程式支援多國語系, 所以你可以選擇繁體中文呢!實在是很棒!安裝完畢之後,請你執行他,就會出現如下的畫面了:
上圖的 第一、二到五區的內容所代表的資料是:
而另外圖中的 a, b, c 則代表的是:
好,接下來我們連接到 FTP 伺服器上面去,所以你可按下圖 21.3-1 的 a 部分,會出現如下畫面:
上圖的箭頭與相關的內容是這樣的:
基本上這樣設定完就能夠連上主機了,不過,如果你還想要更詳細的規範資料連接的方式 (主動式與被動式) 以及其他資料時, 可以按下的『傳輸設定』按鈕,就會出現如下畫面了:
在這個畫面當中你可以選擇是否使用被動式傳輸機制,還可以調整最大連線數呢!為什麼要自我限制呢? 因為 Filezilla 會主動的重複建立多條連線來快速下載,但如果 vsftpd.conf 有限制 max_per_ip 的話, 某些下載會被拒絕的!因此,這個時候在此設定為 1 就顯的很重要~隨時只有一支連線建立,就不會有重複登入的問題! 最後請按下圖 21.3-2 畫面中的『連線』吧!
更多的用法就請你自行研究囉!
我們在 第二十章 WWW 伺服器當中曾經談過瀏覽器所支援的協定,其中一個就是 ftp 這個協定囉!這個協定的處理方式可以在網址列的地方這樣輸入的:
要記得,如果你沒有輸入那個 username@ 的字樣時,系統預設會以匿名登入來處理這次的連線。因此如果你想要使用實體用戶連線時, 就在在 IP 或主機名稱之前填寫你的帳號。舉例來說,鳥哥的 FTP 伺服器 (192.168.100.254) 若有 dmtsai 這個使用者, 那我啟動瀏覽器後,可以這樣做:
然後在出現的對話視窗當中輸入 dmtsai 的密碼,就能夠使用瀏覽器來管理我在 FTP 伺服器內的檔案系統囉!是否很容易啊 甚至,你連密碼都想要寫上網址列,那就更厲害啦!
既然 http 都有 https 了,那麼使用明碼傳輸的 ftp 有沒有加密的 ftps 呢?嘿嘿!說的好!有的啦~既然都有 openssl 這個加密函式庫, 我們當然能夠使用類似的機制來處理 FTP 囉!但前提之下是你的 vsftpd 有支援 SSL 函式庫才行!此外,我們也必須要建立 SSL 的憑證檔給 vsftpd 使用,這樣才能夠進行加密嘛!瞭解乎!接下來,就讓我們一步一步的進行 ftps 的伺服器建置吧!
如果你的 vsftpd 當初編譯的時候沒有支援 SSL 模組,那麼你就得只好自己重新編譯一個 vsftpd 的軟體了!我們的 CentOS 有支援嗎? 趕緊來瞧瞧:
[root@www ~]# ldd $(which vsftpd) | grep ssl
libssl.so.6 => /lib/libssl.so.6 (0x0086d000)
|
如果有出現 libssl.so 的字樣,就是有支援!這樣才能夠繼續下一步呦!
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) [GB]:TW State or Province Name (full name) [Berkshire]:Taiwan Locality Name (eg, city) [Newbury]:Tainan Organization Name (eg, company) [My 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 2157 6月 3 17:52 /etc/vsftpd/vsftpd.pem # 要注意一下權限喔! |
在前面 21.2 裡面大多是單純匿名或單純實體帳戶,這裡我們將實體帳號透過 SSL 連線,但匿名者使用明碼傳輸! 兩者同時提供給用戶端使用啦!FTP 的設定項目主要是這樣:
此時,整體的設定值會有點像這樣:
[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 加密的憑證檔案所在 # 一般伺服器系統設定的項目: 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 |
接下來我們利用 filezilla 來說明一下,如何透過 SSL/TLS 功能來進行連線加密。很簡單,只要在站台管理員的地方選擇:
如上圖所示,重點在箭頭所指的地方,需要透過 TLS 的加密方式才行!然後,鳥哥嘗試使用 student 這個一般帳號登入系統, 連線的時候,應該會出現如下的圖示才對:
如果一切都沒有問題,那麼你可以點選上圖那個『總是信任』的項目,如此一來,未來連線到這個地方就不會再次要你確認憑證啦! 很簡單的解決了 FTP 連線加密的問題囉!^_^
例題:
想一想,既然有了 SFTP 可以進行加密的 FTP 傳輸,那為何需要 ftps 呢?
答:
因為既然要開放 SFTP 的話,就得要同時放行 sshd 亦即是 ssh 的連線,如此一來,你的 port 22 很可能會常常被偵測~若是 openssl,
openssh 出問題,恐怕你的系統就會被綁架。如果你的 FTP 真的有必要存在,那麼透過 ftps 以及利用 vsftpd 這個較為安全的伺服器軟體來架設,
理論上,是要比 sftp 來的安全些~至少對 Internet 放行 ftps 還不會覺得很可怕...
|