伺服器架設篇 - RedHat 9

第二十四章、簡易 vsftpd 伺服器設定

very secure FTP (vsftp) server

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

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
既然說 FTP 真的很危險,那麼不要開啟也罷!不過,偏偏很多時候我們又得使用到 FTP 的功能。這個時候選擇一個比較安全的 FTP 伺服器軟體就很重要啦!除了 proftpd 可以取代 Wu FTP 之外,另一個蠻安全的 vsftpd 也可以用來取代喔!這個章節我們就來談一談 vsftpd 的設定吧!

前言

    除了 proftpd 之外,事實上,這個 vsftpd 也是一個很好的 FTP 伺服器軟體喔!為什麼這麼說呢?因為 vsftpd 全名是『very secure FTP daemon』的意思,所以他的發展本來就是以安全性為考量來發展這個套件的。vsftpd 在安全性的考量上面,主要針對了『程序的權限, privilege』概念來設計的,因為我們的任何服務在 Linux 上面運作時都會取得一個 PID,而這個 PID 是有擁有者的身份的,也就是說,這個服務的 PID 在我們的 Linux 上面是具有某些『權限』的。萬一這個服務的 PID 所屬擁有者的身份等級太高,例如 root 的權限,那麼如果不幸該 PID 有些設計上的漏洞,使得該 PID 被入侵的話,入侵者將具有該 PID 的權限,也就是 root 的身份喔!所以,近來發展的套件都會盡量的將服務取得的 PID 權限降低,使得該服務即使不小心被入侵了,入侵者也無法得到有效的系統管理權限,這樣會讓我們的系統較為安全的啦。
     
    除了上面這個權限的設計之外, vsftpd 也利用 chroot 這個軟體的輔助,來讓登入者僅能於一些較不重要的目錄當中活動,而無法使用 Linux 系統全部的功能。所謂的 chroot 這個函數,最主要的功能就是『改變根目錄的所在 ( change root directory )』了!舉例來說,如果您想要讓使用者登入 A 服務後,且執行任何指令都是在 /tmp/pub 目錄下,並限制使用者使用 A 服務時都只能在 /tmp/pub 目錄下,那麼使用『 chroot /tmp/pub command 』就能夠讓 /tmp/pub 變成 A 服務的根目錄『/』了!如此一來,使用者就無法離開 /tmp/pub ,那麼萬一我們 A 服務的 PID 還是被入侵時,沒有關係,入侵者還是僅能在 /tmp/pub 裡面跑來跑去而已,而無法使用 Linux 的完整功能。這個時候,自然我們的系統也就會比較安全啦!
     
    vsftpd 是基於上面的說明來設計的一個較為安全的 FTP 伺服器軟體,他具有底下的特點喔:
     
    • vsftpd 是以一般身份啟動服務,所以對於 Linux 系統的使用權限較低,對於 Linux 系統的危害就相對的減低了。此外, vsftpd 亦利用 chroot() 這個函式進行改換根目錄的動作,使得系統工具不會被 vsftpd 這支服務所誤用;
    • 任何需要具有較高執行權限的 vsftpd 指令均以一支特殊的上層程序 ( parent process ) 所控制 ,該上層程序享有的較高執行權限功能已經被限制的相當的低,並以不影響 Linux 本身的系統為準;
    • 所有來自 clients 端,想要使用這支上層程序所提供的較高執行權限之 vsftpd 指令的需求,均被視為『不可信任的要求』來處理,必需要經過相當程度的身份確認後,方可利用該上層程序的功能。例如 chown(), Login 的要求等等動作;
    • 此外,上面提到的上層程序中,依然使用 chroot() 的功能來限制使用者的執行權限。
     
    由於具有這樣的特點,所以 vsftpd 會變的比較安全一些咯!
     
    另外,要架設 vsftpd 之前,還是請您得先要針對 FTP 的主動連線、被動連線以及 port 21, 20 這兩個指令通道與資料通道的基礎有一定程度的認識喔,會比較容易進入狀況,所以,還是回到前面的 Wu FTP 那一張節,將前言的部分看完才好吶!我這裡假設您已經具有 FTP 的相關知識了,所以底下就直接來進行 vsftpd 的安裝與設定吧!

套件安裝:


    以 RPM 安裝
     
    在目前新版的 Red Hat 9 主要的 FTP 伺服器軟體就是 vsftpd 這個玩意兒!所以您可以拿出光碟裡面的 vsftpd 來直接以 RPM 安裝即可!如果您的 Linux distribution 沒有提供 vsftpd 的話,沒有關係,我們也可以使用底下的 Tarball 的方式來安裝吶!
     

    以 Tarball 安裝
     
    要以 Tarball 安裝,當然得先下載 Tarball 的檔案了!vsftpd 的官方網站下載點為: 您可以自行找尋自己喜歡的版本來安裝。我這裡以 1.2.0 這一版來安裝 vsftpd 在我的 Mandrake 9.0 上面喔!(註:如果是 Red Hat 的系統,原本就有 vsftpd 了,所以使用 RPM 安裝比較好!至於其他沒有提供 vsftpd RPM 檔案的 distribution 就可以使用 Tarball 咯!)
     
    1. 下載與解壓縮:
    [root@test root]# wget \
    > ftp://vsftpd.beasts.org/users/cevans/vsftpd-1.2.0.tar.gz
    [root@test root]# cd /usr/local/src
    [root@test root]# tar -zxvf /root/vsftpd-1.2.0.tar.gz
    [root@test root]# cd vsftpd-1.2.0/
    # 在這個目錄下有個 INSTALL 與 README 請務必察看喔!
     
    2. 開始編譯與安裝
    # vsftpd 預設安裝的路徑為:
    # 所有可執行檔放置在 /usr/local/sbin 裡面;
    # man page 放置在 /usr/local/man/man5 與 /usr/local/man/man8
    # 若 super daemon 為 xinetd 時,會複製一份啟動檔案到 /etc/xinetd.d 去!
    [root@test vsftpd-1.2.0]# make
    # 編譯的過程可能有 warning 的訊息,只要不是 Error 就可以不理他!
    [root@test vsftpd-1.2.0]# make install
    [root@test vsftpd-1.2.0]# cp vsftpd.conf /etc
    # 將 PAM 身份認證模組給他放進去系統裡面!
    [root@test vsftpd-1.2.0]# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd
    # 建立 ftp 這個使用者以及他的家目錄:
    # 若本來就存在 ftp 這個使用者,那就不需要進行新增!
    [root@test vsftpd-1.2.0]# useradd -M ftp -d /var/ftp
    [root@test vsftpd-1.2.0]# mkdir -p /var/ftp
    [root@test vsftpd-1.2.0]# chown root:root /var/ftp
    [root@test vsftpd-1.2.0]# chmod 755 /var/ftp
    # 建立 vsftpd 需要的特殊目錄
    [root@test vsftpd-1.2.0]# mkdir -p /usr/share/empty
     
    3. 如果需要移除時:
    # 如果想要移除 vsftp 時,可以這樣做
    [root@test vsftpd-1.2.0]# rm /usr/local/sbin/vsftpd
    [root@test vsftpd-1.2.0]# rm /usr/local/man/man5/vsftpd.conf.5
    [root@test vsftpd-1.2.0]# rm /usr/local/man/man8/vsftpd.8
    [root@test vsftpd-1.2.0]# rm /etc/xinetd.d/vsftpd
    [root@test vsftpd-1.2.0]# rm /etc/vsftpd.conf
    # 因為剛剛安裝只有安裝這幾個檔案而已說!所以啦, vsftpd 真的是挺安全的說!
     
    4. 測試:
    # 先確認一下 xinetd.d 有沒有問題再說:
    [root@test root]# vi /etc/xinetd.d/vsftpd
    service ftp
    {
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/local/sbin/vsftpd
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
         disable                 = no
    }
    [root@test root]# /etc/rc.d/init.d/xinetd restart
    [root@test root]# ftp localhost
    ftp localhost
    Connected to localhost.
    220 (vsFTPd 1.2.0)
    530 Please login with USER and PASS.
    530 Please login with USER and PASS.
    KERBEROS_V4 rejected as an authentication type
    Name (localhost:root): anonymous
    # 這樣就表示 vsftpd 已經可以正確的啟動了,不過因為我們還沒有設定好
    # /etc/vsftpd.conf ,所以會有無法登入的問題!沒關係,
    # 等一下設定好就 OK 了!
     
    安裝的過程真的是很簡單,不過, vsftpd.conf 這個檔案放置的地點在 RPM 與 Tarball 則可能有點不一樣,需要給他特別留意呢!例如 Red Hat 9 預設放置在 /etc/vsftpd/vsftpd.conf ,而 Tarball 則預設放置在 /etc/vsftpd.conf 裡面說!

Server 端的設定

    其實在 Server 端的設定蠻容易的,因為整個 vsftpd 的設定檔幾乎可以說只有一個,那就是 vsftpd.conf 這個檔案了。底下我們就來談一談整個 vsftpd 的套件結構與如何設定編輯 vsftpd.conf 這個設定檔吧! ^_^
     

    vsftpd 的套件結構
     
    vsftpd 的套件結構很簡單,設定檔與執行檔實在是不多,無論如何,我們還是得要瞭解一下:
     
    • /etc/vsftpd.conf 或 /etc/vsftpd/vsftpd.conf:這個就是 vsftpd 的主要設定檔了!也是等一下我們要設定的主要項目說。在這個設定檔裡面,所有的設定項目都是以『參數=設定值』來設定的,注意一下,等號兩邊沒有空白喔!至於 vsftpd.conf 的詳細說明,其實在 vsftpd.conf 裡面就已經相當的清晰了,如果還想要有其他的支援,可以使用『man 5 vsftpd.conf』來查閱喔!

    •  
    • /etc/pam.d/vsftpd 與 /etc/ftpusers 或 /etc/vsftpd.ftpusers:這個與 Wu FTP 是相同的作用啦!利用 pam 模組來進行身份確認的動作說!那麼怎麼知道使用 /etc/vsftpd.ftpusers 或 /etc/ftpusers 呢?看 /etc/pam.d/vsftpd 的內容即可!
    • [root@test root]# vi /etc/pam.d/vsftpd
      #%PAM-1.0
      auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
      auth       required     pam_stack.so service=system-auth
      auth       required     pam_shells.so
      account    required     pam_stack.so service=system-auth
      session    required     pam_stack.so service=system-auth
      上面的斜體字是同一行,注意到斜體字那一行,可以發現 file="檔名" 那個檔名就是『限制使用者無法使用 vsftpd 』的主要設定檔案囉!
       
    • /etc/vsftpd.chroot_list:這個檔案不見得會使用到,且與實體用戶有關!當我們在 vsftpd.conf 裡面設定好了實體用戶的使用者沒有被 chroot 到自己的家目錄下(也就是使用者登入後不只能到自己的家目錄,還可以跳到其他目錄),不過,某些使用者您想讓他無法離開家目錄時,預設在 /etc/vsftpd.chroot_list 這個檔案裡面,就可以將該使用者限制在自己的家目錄內了!一行一個帳號。

    •  
    • /etc/vsftp.banned_emails:這個檔案與匿名登入有關,不過也不見得會用到!當您允許匿名者 (anonymous) 登入您的 FTP 主機,不過卻不允許某些 email address 登入,那麼就可以將該 email address 寫入到這個檔案裡面去喔!

    •  
    • /usr/local/sbin/vsftpd 或 /usr/sbin/vsftpd:這就是 vsftpd 的主要執行檔咯!不要懷疑, vsftpd 只有這一個執行檔而已啊!

    •  
    • /var/ftp:這個是 vsftpd 的預設匿名者登入的根目錄喔!

    •  
    大致上就只有這幾個檔案需要注意而已呢!
     

    vsftpd.conf 設定值說明
     
    vsftpd.conf 是 vsftpd 的主要設定檔案,在這裡我們約略來說明一下常見的 vsftpd.conf 裡面的各個設定參數吧!
     
    關於主機的設定值
    connect_from_port_20=YES (NO)
     還記得 wu ftp 那篇文章提到的,關於主動連線的 ftp-data 嗎?
     這個設定項目在啟動主動連線的 port 20 咯!
    listen_port=21
     使用的 vsftpd 命令通道的 port number 設定,如果您想要使用非
     正規的 ftp port,在這個設定項目修改吧!
    dirmessage_enable=YES (NO)
     當使用者進入某個目錄時,會顯示該目錄需要注意的內容,顯示的
     檔案預設是 .message ,當然,可以使用底下的設定項目來修訂!
    message_file=.message
     當 dirmessage_enable=YES 時,可以設定這個項目來讓 vsftpd 
     尋找該檔案來顯示訊息!您也可以設定其他檔名喔!
    listen=YES (NO)
     若設定為 YES 表示 vsftpd 是以 standalone 的方式來啟動的!
    pasv_enable=YES (NO)
     啟動被動式連線(passive mode),一定要設定為 YES 的啦!
    use_localtime=YES (NO)
     是否使用主機的時間?!預設使用 GMT 時間(格林威治),會比台灣
     時間晚 8 小時,一般來說,建議設定為 YES 吧!
    write_enable=YES (NO)
     是否允許使用者具有寫入的權限?!這包括刪除與修改等功能喔!
    connect_timeout=60
     單位是秒,如果 client 嘗試連接我們的 vsftpd 命令通道超過 60 秒,
     則不等待,強制斷線咯。
    accept_timeout=60
     當使用者以被動式 PASV 來進行資料傳輸時,如果主機啟用 passive port 
     並等待 client 超過60 秒,那麼就給他強制斷線!您可以修改 60 這個數值。
    data_connection_timeout=300
     如果 client 與 Server 間的資料傳送在 300 秒內都無法傳送成功,
     那 Client 的連線就會被我們的 vsftpd 強制剔除!
    idle_session_timeout=300
     如果使用者在 300 秒內都沒有命令動作,強制離線!
    max_clients=0
     如果 vsftpd 是以 stand alone 方式啟動的,那麼這個設定項目可以設定
     同一時間,最多有多少 client 可以同時連上 vsftpd 哩!?
    max_per_ip=0
     與上面 max_clients 類似,這裡是同一個 IP 同一時間可允許多少連線?
    pasv_max_port=0
    pasv_min_port=0
     上面兩個是與 passive mode 使用的 port number 有關,如果您想要使用
     65400 到 65410 這 11 個 port 來進行被動式資料的連接,可以這樣設定
     pasv_max_port=65410 以及 pasv_min_port=65400
    ftpd_banner=一些文字說明
     當使用者無法順利連上我們的主機,例如連線數量已經超過 max_clients 
     的設定了,那麼 client 的畫面就會顯示『一些文字說明』的字樣,您可以修改
     
    關於實體用戶登入者的設定值
    guest_enable=YES (NO)
     若這個值設定為 YES 時,那麼任何非 anonymous 登入的帳號,均會被
     假設成為 guest (訪客) 喔!
    local_enable=YES (NO)
     這個設定值必須要為 YES 時,在 /etc/passwd 內的帳號才能以
     實體用戶的方式登入我們的 vsftpd 主機喔!
    local_max_rate=0
     實體用戶的傳輸速度限制,單位為 bytes/second, 0 為不限制。
    chroot_local_user=YES (NO)
     將使用者限制在自己的家目錄之內(chroot)!這個設定在 vsftpd 
     當中預設是 NO,因為有底下兩個設定項目的輔助喔!
     所以不需要啟動他!
    chroot_list_enable=YES (NO)
     是否啟用將某些實體用戶限制在他們的家目錄內?!預設是 NO ,
     不過,如果您想要讓某些使用者無法離開他們的家目錄時,
     可以考慮將這個設定為 YES ,並且規劃下個設定值
    chroot_list_file=/etc/vsftpd.chroot_list
     如果 chroot_list_enable=YES 那麼就可以設定這個項目了!他裡面可以規定
     那一個實體用戶會被限制在自己的家目錄內而無法離開!(chroot)
     一行一個帳號即可!
    userlist_deny=YES (NO)
     若此設定值為 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 時,可以利用這個設定項目來規定那個
     email address 不可登入我們的 vsftpd 喔!在上面設定的檔案內,
     一行輸入一個 email address 即可!
    no_anon_password=YES (NO)
     當設定為 YES 時,表示 anonymous 將會略過密碼檢驗步驟,
     而直接進入 vsftpd 伺服器內喔!所以一般預設都是 NO 的!
    anon_max_rate=0
     這個設定值後面接的數值單位為 bytes/秒 ,限制 anonymous 的傳輸速度,
     如果是 0 則不限制(由最大頻寬所限制),如果您想讓 anonymous 僅有 
     30 KB/s 的速度,可以設定『anon_max_rate=30000』
    anon_umask=077
     限制 anonymous 的權限!如果是 077 則 anonymous 傳送過來的檔案
     權限會是 -rw------- 喔!
     
    關於系統安全的設定值:
    ascii_download_enable=YES (NO)
     如果設定為 YES ,那麼 client 就可以使用 ASCII 格式下載檔案。
     一般來說,由於啟動了這個設定項目可能會導致 DoS 的攻擊,因此預設是NO。
    ascii_upload_enable=YES (NO)
     與上一個設定類似的,只是這個設定針對上傳而言!預設是 NO。
    async_abor_enable=YES (NO)
     如果您的 FTP client 會下達 "async ABOR" 這個指令時,這個設定才需要啟用
     一般來說,由於這個設定並不安全,所以通常都是將他取消的!
    check_shell=YES (NO)
     如果您想讓擁有任何奇怪的 shell 的使用者(在 /etc/passwd 的 shell 欄位)
     可以使用 vsftpd 的話,這個設定可以設定為 NO 喔!
    one_process_model=YES (NO)
     這個設定項目比較危險一點~當設定為 YES 時,表示每個建立的連線
     都會擁有一支 process 在負責,可以增加 vsftpd 的效能。不過,
     除非您的系統比較安全,而且硬體配備比較高,否則容易耗盡系統資源喔!
     一般建議設定為 NO 的啦!
    tcp_wrappers=YES (NO)
     當然我們都習慣支援 TCP Wrappers 的啦!所以設定為 YES 吧!
    xferlog_enable=YES (NO)
     當設定為 YES 時,使用者上傳與下載檔案都會被紀錄起來。記錄檔案
     與下一個設定項目有關:
    xferlog_file=/var/log/vsftpd.log
     如果上一個 xferlog_enable=YES 的話,這裡就可以設定了!
     這個是登錄檔的檔名啦!
    xferlog_std_format=YES (NO)
     是否設定為 wu ftp 相同的登錄檔格式?!預設為 NO ,因為登錄檔會比較容易讀!
     不過,如果您有使用 wu ftp 登錄檔的分析軟體,這裡才需要設定為 YES
    nopriv_user=nobody
     我們的 vsftpd 預設以 nobody 作為此一服務執行者的權限。因為 nobody 的權限
     相當的低,因此即使被入侵,入侵者僅能取得 nobody 的權限喔!
    pam_service_name=vsftpd
     這個是 pam 模組的名稱,我們放置在 /etc/pam.d/vsftpd 即是這個咚咚!
     
    上面這些是相當常見的 vsftpd 的設定參數,還有很多參數我沒有列出來,您可以使用 man 5 vsftpd.conf 查閱喔!不過,基本上上面這些參數已經夠我們設定 vsftpd 囉!
     

    最簡單的 vsftpd.conf 設定
     
    如果您很懶的去設定 vsftpd 的話,那麼可以使用很簡單的設定值來規劃您的 FTP 伺服器。底下就是 Red Hat 9 的預設 vsftpd 的設定值,您可以使用這樣的設定值來啟動您的 FTP 伺服器即可。這樣的設定值有幾個用處:
     
    • 任何在 /etc/vsftpd.ftpusers 裡面的使用者帳號均無法使用 vsftpd 喔!
    • 開放 anonymous 與 實體用戶 登入 vsftpd ;
    • 實體用戶登入主機時,可以跳至任何具有登入權限的目錄當中(沒有 chroot );
    • 使用 port 20 作為主動連線時的 ftp-data 傳送埠口;
    • 利用 /etc/hosts.allow(deny) 來管理登入權限;
    • 當 Client 上傳/下載檔案時,該資訊會記錄在 /var/log/vsftpd.log 裡面;
    • 其他的設定均已預設值來規範(如被動式 port number 等等)。
     
    [root@test root]# vi /etc/xinetd.d/vsftpd
    service ftp
    {
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/local/sbin/vsftpd
            server_args             = /etc/vsftpd.conf
    # 上面這個請依照您的主機環境來設定!尤其是 server_args 請設定您的
    # vsftpd.conf 所在目錄的完整檔名(含目錄名稱)!
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
            disable                 = no
    }
    [root@test root]# vi /etc/vsftpd/vsftpd.conf  # (或 /etc/vsftpd.conf)
    # 關於主機與安全性的設定
    use_localtime=YES
    dirmessage_enable=YES
    connect_from_port_20=YES
    xferlog_enable=YES
    xferlog_std_format=YES
    pam_service_name=vsftpd
    tcp_wrappers=YES
    # 關於 anonymous 的設定
    anonymous_enable=YES
    # 關於 real user 的設定
    local_enable=YES
    write_enable=YES
    local_umask=022
    userlist_enable=YES
    # 以上設定值的意義請往前翻到 vsftpd.conf 設定值的意義 章節去察看!
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    這樣您的最簡易的 FTP 伺服器就已經設定完成了!簡單的很吧!而且還相當的安全呢!
     

    針對僅有開放實體用戶登入的設定
     
    好了,這裡我們再使用其他的設定值來修正我們的 vsftpd.conf 這個設定檔。因為開放 anonymous 畢竟不太安全,所以我們將 anonymous 的登入權限關閉,並且僅讓 real user (實體用戶) 登入我們的 vsftpd 時,要如何設定呢?我的要求如下:
     
    • 使用台灣本地的時間而不是 GMT 時間;
    • 所有在 /etc/passwd 裡面出現的實體帳號均能登入 vsftpd 主機;
    • 但是系統帳號 (如 root 等, UID 小於 500 的帳號)均不能使用 vsftpd ;
    • 而且由於 badbird 與 nogoodbird 這兩個帳號使用者比較不乖,我要讓這兩個使用者被關在自己的家目錄當中(chroot);
    • 並且限制資料的傳輸速度為 100 Kbytes/second;
    • 當使用者進入 /home 這個目錄時,顯示:『一般使用者家目錄』的字樣在 Client 端的螢幕上;
    • 使用者可以進行上傳、下載以及修改檔案等等動作。
     
    1. 基礎設定檔
    [root@test root]# vi /etc/vsftpd/vsftpd.conf (或 /etc/vsftpd.conf)
    # 關於主機與安全性的設定
    use_localtime=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    pam_service_name=vsftpd
    tcp_wrappers=YES
    # 關於 anonymous 的設定
    anonymous_enable=NO
    # 關於 Real User 的設定
    local_enable=YES
    write_enable=YES
    local_umask=022
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd.chroot_list
    userlist_deny=YES
    userlist_file=/etc/vsftpd.user_list
    local_max_rate=100000
    # 以上設定值的意義請往前翻到 vsftpd.conf 設定值的意義 章節去察看!
     
    2. 限制實體用戶在自己的家目錄內 (chroot) 的設定檔
    [root@test root]# vi /etc/vsftpd.chroot_list
    badbird
    nogoodbird
    # 沒有寫到這個檔案內的其他用戶,就可以離開自己的家目錄,
    # 而到其他目錄裡面去瀏覽了!
     
    3. 以 PAM 模組限制某些帳號無法登入主機的設定:
    [root@test root]# vi /etc/pam.d/vsftpd
    # 會發現這樣的字句:
    auth ..... file=/etc/vsftpd.ftpusers ....
    # 那個 file=.. 後面接的檔名就是以 PAM 模組抵擋的帳號內容了!
    [root@test root]# vi /etc/vsftpd.ftpusers
    # 底下列出的帳號將無法使用 vsftpd 喔!與 wu ftp 的 /etc/ftpusers 相同功能
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    news
    uucp
    operator
    games
    nobody
     
    4. 以 userlist_file 抵擋某些帳號的登入:
    # 事實上,這個功能與上面的 PAM 功能相似啦!只是 PAM 是外掛的,而
    # 這個設定是 vsftpd 預設提供的就是了!
    [root@test root]# vi /etc/vsftpd.user_list
    # 這個檔案的設定與上面 /etc/vsftpd.ftpusers 相同即可!
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    news
    uucp
    operator
    games
    nobody
     
    5. 設定進入目錄時,顯示的訊息:
    [root@test root]# vi /home/.message
    一般使用者家目錄
     
    6. 重新啟動 xinetd 囉!
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    上面的設定裡面有很多重複的地方,比方說 /etc/vsftpd.ftpusers 與 /etc/vsftpd.user_list 就是重複的設定了!不過,這樣是比較安全啦!因為 PAM 模組是外掛的程式,而另一個檔案則是 vsftpd 提供的功能!但是請特別留意,因為很多使用者可能會一不小心僅修改了其中一個檔案,另一個檔案則忘記修訂,會很麻煩喔! ^_^!至於也是重點之一的 /etc/vsftpd.chroot_list 就可以將使用者限制在他們自己的家目錄內了!設定上很容易吧!附帶說明,上面的檔名都與 vsftpd.conf 的設定有關
     
    看過了上面關於實體用戶的設定之後,咦!那麼如何讓 root 可以登入 vsftpd 主機呢?!呵呵!就是將 /etc/vsftpd.ftpusers 與 /etc/vsftpd.user_list 這兩個檔案裡面的 root 拿掉就可以啦!不過,本人可是不建議這麼搞的喔!
     

    針對僅有開放匿名使用者登入的設定
     
    好了,上面一章節談的是僅開放 Real User ,那麼這個章節我們就來談一談,沒有 Real user 僅有 anonymous 的登入說!我想要的功能是這樣的:
     
    • 使用台灣本地的時間,而非 GMT 時間;
    • 僅開放 anonymous 的登入;
    • 檔案傳輸的速限為 30 Kbytes/second;
    • 允許 anonymous 上傳檔案到 /var/ftp/upload 這個目錄當中,並且允許 anonymous 建立目錄;
    • 資料連接的過程 (不是命令通道!) 只要超過 60 秒沒有回應,就強制 Client 斷線!
    • 只要 anonymous 超過十分鐘沒有動作,就予以斷線;
    • 被動式連接的埠口為 65400 到 65420 這幾個 port number 即可;
    • 最大同時上線人數限制為 50 人,且同一 IP 來源最大連線數量為 5 人;
    • 不許使用 ASCII 格式上傳或下載!
    • 不許以 linux.vbird.org 這個網址為 email address 的密碼輸入!
     
    OK!這樣要如何設定呢!?
     
    1. 基礎設定檔
    [root@test root]# vi /etc/vsftpd/vsftpd.conf (或 /etc/vsftpd.conf)
    # 與主機與安全性有關的設定
    use_localtime=YES
    write_enable=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    xferlog_file=/var/log/vsftpd.log
    data_connection_timeout=60
    idle_session_timeout=600
    max_clients=50
    max_per_ip=5
    ascii_upload_enable=NO
    ascii_download_enable=NO
    connect_from_port_20=YES
    pasv_min_port=65400
    pasv_max_port=65420
    pam_service_name=vsftpd
    tcp_wrappers=YES
    nopriv_user=ftp
    # 關於 anonymous 的設定
    anonymous_enable=YES
    anon_other_write_enable=YES
    anon_mkdir_write_enable=YES
    anon_upload_enable=YES
    deny_email_enable=YES
    banned_email_file=/etc/vsftpd.banned_emails
    anon_max_rate=30000
    # 關於 real user 的設定
    local_enable=NO
    # 以上設定值的意義請往前翻到 vsftpd.conf 設定值的意義 章節去察看!
     
    2. 建立抵擋不當 email address 的檔案
    [root@test root]# vi /etc/vsftpd.banned_emails
    linux.vbird.org
    # 一行寫一個 email 名稱喔!
     
    3. 建立可以上傳的目錄!
    # 因為我們的 nopriv_user 設定為 ftp ,所以上傳的目錄擁有者為 ftp 喔
    [root@test root]# mkdir -p /var/ftp/upload
    [root@test root]# chown ftp /var/ftp/upload
     
    4. 重新啟動 xinetd 囉!
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    經過上面的說明之後,您就可以很清楚的知道了 Real user 與 anonymous 在 vsftpd 當中的設定了,那麼您就可以很輕易的就架設出一部 vsftpd 伺服器了呢!趕緊嘗試看看吧! ^_^

Client 端的設定:

Client 端並沒有什麼好設定的地方,主要就是 ftp 的使用了,請參考 wu FTP 主機設定一節!

安全相關方面

    有關安全性的設定方面,當然就是與登入以及防火牆有關囉!那就來談一談吧!
     

    防火牆抵擋
     
    要啟用 vsftpd 自然就得要開放防火牆囉!所以您如果想要對 Internet 開放您的 FTP 伺服器,就必須至少要有這一段 iptables 防火牆規則在您的規則列當中:
     
    /sbin/iptables -A INPUT -p TCP -i eth0 --dport 21 -j ACCEPT 
     
    當然,您可以設定的更嚴密,請參考簡易防火牆一文來設定 iptables 喔!此外,您的 TCP Wrappers 如果想要抵擋 192.168.1.2 這個 IP 來源的話,可以這樣做:
     
    [root@test root]# vi /etc/hosts.deny
    vsftpd: 192.168.1.2
     
    這個應該沒有問題吧! ^_^
     

    Super daemon 的管理
     
    Super daemon 可以用來管理 Client 端的登入權限呢,這個重點沒有忘記吧! ^_^ !那麼我們如何設定呢?!舉個簡單的例子好了:假設我們的 vsftpd 只允許同一個 IP 來源可以擁有五個登入權限,而同一時間最多可以有 200 個 vsftpd 的連線,當超過 200 個 vsftpd 的連線時,將在 Client 端的畫面當中顯示『很抱歉,伺服器忙碌中』的字樣,該如何設定?
     
    [root@test root]# vi /etc/xinetd.d/vsftpd
    # vsftpd is the secure FTP server.
    service ftp
    {
            disable                 = no
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/local/sbin/vsftpd
            server_args             = /etc/vsftpd.conf 
    # 上面這個 server 的設定請依照您的主機環境來設定!
    # 至於 server_args 則請寫入您的 vsftpd 的設定檔完整檔名即可!
            per_source              = 5     # 與同一 IP 的連線數目有關
            instances               = 200   # 同一時間最多的連線數目
            no_access               = 192.168.1.3
            banner_fail             = /etc/vsftpd.busy_banner
    # 上面這個檔案就是當主機忙碌中,則在 Client 端顯示的內容!
            log_on_success          += PID HOST DURATION
            log_on_failure          += HOST
    }
     
    [root@test root]# vi /etc/vsftpd.busy.banner
    421 很抱歉,伺服器忙碌中!
     
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    這樣設定就可以啦!很簡單的一個設定動作,就可以讓您的 vsftpd 變的更安全一些喔!
     

    問題解決方案
     
    如果發生 vsftpd 的問題怎麼辦?!有幾個可能的解決方案喔:
     
    • 如果在 Client 端上面發現無法連線成功,請檢查:
      1. iptables 防火牆的規則當中,是否開放了 client 端的 port 21 登入?
      2. 在 /etc/hosts.deny 當中,是否將 client 的登入權限擋住了?
      3. 在 /etc/xinetd.d/vsftpd 當中,是否設定錯誤,導致 client 的登入權限被取消了?
       
    • 如果 Client 已經連上 vsftpd 伺服器,但是卻顯示『 XXX file can't be opend 』的字樣,請檢查:
      1. 最主要的原因還是在於在 vsftpd.conf 當中設定了檢查某個檔案,但是您卻沒有將該檔案設定起來,所以,請檢查 vsftpd.conf 裡面所有設定的檔案檔名,使用 touch 這個指令將該檔案建立起來即可!
       
    • 如果 Client 已經連上 vsftpd 伺服器,卻無法使用某個帳號登入,請檢查:
      1. 在 vsftpd.conf 裡面是否設定了使用 pam 模組來檢驗帳號,以及利用 userlist_file 來管理帳號?
      2. 請檢查 /etc/vsftpd.ftpusers 以及 /etc/vsftpd.user_list 檔案內是否將該帳號寫入了?!
       
    • 如果 Client 無法上傳檔案,該如何是好?
      1. 最可能發生的原因就是在 vsftpd.conf 裡面忘記加上這個設定『write_enable=YES』這個設定,請加入;
      2. 是否所要上傳的目錄『權限』不對,請以 chmod 或 chown 來修訂;
      3. 是否 anonymous 的設定裡面忘記加上了底下三個參數:
        • anon_other_write_enable=YES
        • anon_mkdir_write_enable=YES
        • anon_upload_enable=YES
      4. 是否因為設定了 email 抵擋機制,又將 email address 寫入該檔案中了!?請檢查!
      5. 是否設定了不許 ASCII 格式傳送,但 Client 端卻以 ASCII 傳送呢?請在 client 端以 binary 格式來傳送檔案!
     
    上面是蠻常發現的錯誤,如果還是無法解決您的問題,請您務必分析一下這兩個檔案:/var/log/vsftpd.log 與 /var/log/messages ,裡面有相當多的重要資料,可以提供給您進行除錯喔!

對於 FTP 伺服器軟體選擇的建議

    在玩過了 Wu FTP, ProFTPD 以及 vsFTPD 之後,發現其實三個伺服器各有優缺點啦!沒有說哪一個特別的好,因為各有其利用的主機環境說!不過,其實我們還是有選擇的思考方向啦。
     
    • 考慮較為單純的 FTP 設計,而且要求安全性:如果我們不要個別控制每個目錄的流量、不必控制上傳/下載比例、不必針對不同的實體用戶或者是訪客進行不同的權限設定,僅分 anonymous 與 real user 兩種身份來讓使用者登入主機的話,那麼上上之選應該是 vsftpd 這個伺服器才對!因為他設定上真的比較簡單,而且在整體套件的設計上又比較安全喔!

    •  
    • 多樣化的設計,安全性要求亦不低:雖然 Wu FTP 與 Proftpd 可以達到的 FTP 伺服器設定是一樣的,不過 Proftpd 的設定又比 Wu FTP 簡單一些,有點類似 Apache 的目錄管理設定,此外, Proftpd 也可以達到控制上/下傳比例、流量控制、針對不同的目錄設定不一樣的權限等設計,也比 Wu FTP 安全一些,所以,在多樣化的 FTP 設計考量下,可以選擇 Proftpd 喔!

    •  
    • 考慮主機的要求:某些主機本來就是含有 Wu FTP 或者是 vsftpd 等不同的 FTP 伺服器軟體,您又不想重新安裝其他的伺服器軟體,那麼使用您的 Linux distributions 所提供的 FTP 軟體來架設您的 FTP 即可啊!不需要考慮其他的 FTP 軟體咯。不過,請記得將您的 FTP 軟體更新到最新版喔!避免被惡意攻擊說!
     
    事實上,也就是說,以 vsftpd 為主要的考慮依據,但是如果覺得 vsftpd 無法滿足您的 FTP 伺服器設計需求,就改以 Proftpd 來設計,最後,如果您也是懶人一族,使用 Wu FTP 就算了吧! ^_^

參考資源:

修改歷史:
2003/09/03:首次完成
2003/09/04:加入 FTP 伺服器軟體的選擇建議
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

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