Board logo

標題: linux FTP架設 [打印本頁]

作者: danny    時間: 2009-4-9 22:06     標題: linux FTP架設

FTP 伺服器與用戶端程式
FTP 就是"檔案傳輸協定"(File Transfer Protocol)的簡寫。 FTP 伺服器允許用戶端, 連線與取回(下載)檔案的要求。目前 Linux 上存在有多種 FTP 伺服器與用戶端程式, 他們通常會放在大部分的 Linux 發行版本中。有文字模式的用戶端程式, 也有 GUI 模式的。
原理:File Transfer Protocol ( FTP ) 是相當古老的網路協定之一,他最主要的功能就是進行 Server 端與 Client 端之間的檔案傳送的功能啦!FTP 其實是以 TCP 封包的模式進行 Server 與 Client 之間的連線,當連線建立之後,使用者可以在 Client 端連上 Server 端進行檔案的下載與上傳,此外,還可以直接管理用戶在 Server 上面的檔案呢,相當的方便!而這個最古老的 FTP 伺服器軟體,大概要算是 Wu FTP 了,所以,底下我們將針對 Wu FTP 進行設定的說明喔!
套件安裝: 事實上,使用 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 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 [email protected]
# 這樣的格式!這個 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 的設定檔,如果要進行多重控制的話,例如:我的主機有兩塊介面卡,一塊對內一塊對外,對內與對外的『開放時間』與『開放網域』及『相關權限』都不相同時,就可以使用其他額外的設定來控制這些參數! 
好了,那麼最終終於要來啟動 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


[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


限制最大線上人數
 
如果由於自己本身的硬體設備問題或者是頻寬的問題,所以不想提供太多的同時連線使用者數量時,可以使用『最大線上人數限制』的項目來規範呢!規範的內容很簡單,同樣的僅要編寫 /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




歡迎光臨 ihao論壇 (https://ihao.org/dz5/) Powered by Discuz! 6.0.0