作者:陳柏菁 E-mail:pachingko@ms96.url.com.tw
第十八章 架 設 FTP Server

索引:
18.1 何謂 FTP 及 FTP 的連線流程
  18.1.1 FTP 簡介
  18.1.2 FTP 的連線流程
18.2 架設 Pure-ftpd Server
  18.2.1 查詢套件安裝及檢視套件內容
  18.2.2 設定 Pure-ftpd Server
  18.2.3 設定虛擬帳號
18.3 架設 vsftpd Server
  18.3.1 查詢套件安裝及檢視套件內容
  18.3.2 設定 vsftpd Server
  18.3.3 vsftpd 的綜合範例說明



18.1 何謂 FTP 及 FTP 的連線流程

18.1.1 FTP 簡介

 FTP (File Transfer Protocol) 是在網際網路上已行之多年的檔案傳輸協定,透過這個通訊協定,可以將遠端電腦的檔案資料傳送回本機端 (下載),也可以把本機的檔案資料傳輸至遠端電腦 (上傳) ﹔而所謂的 FTP Server,就是一部專門提供給用戶端進行檔案上傳與下載服務的伺服器。

 我們都知道 Web Server 是用 http 來做資料傳輸的協定,其除了可讓 Client 端瀏覽網頁外,同時也提供檔案上傳與下載的服務,不過它比較適用於小檔案的傳輸,而在對大檔案傳輸時,所表現的穩定度及傳輸效率就不那麼高了。所以想改善 http 傳輸檔案上的缺失及效能,最好的方式就是架設一台 FTP Server 了。

 用來架設 FTP Server 的軟體有好幾種,其中最老牌的算是 wu-ftpd,不過也由於其樹大招風的關係,使得在安全性方面會有比較大的隱憂。不過還好後來又陸續發展出一些安全性較佳的伺服器軟體,比方像 proftpd、vsftpd 及 pure-ftpd 等,而本章將會針對 pure-ftpd 及 vsftpd 這兩個伺服器軟體來做介紹。

18.1.2 FTP 的連線流程

 在還沒開始介紹流程之前,要先來了解一下兩台電腦間 TCP 連線建立的過程:

  

 當 Client 向 Server 提出主動連線請求時,會送出連線過程的第一個 TCP 封包給對方,而此時 TCP 封包中的 SYN (同步旗標) 位元值設定為 1,代表的是一個連線的啟動 ﹔接著 Server 端也必須啟動自己的連線並做回應的確認,因此會向 Client 端送出連線過程的第二個封包,此時該封包的 SYN 及 ACK (回應確認旗標) 位元值皆設定為 1 ﹔最後在 Client 端收到對方的封包後,必須做回應確認的動作,因此會送出連線過程的第三個封包給 Server,此時封包的 ACK 位元值設定為 1。至此雙方的連線才正式建立起來,這就是所謂的 TCP Three-Way Handshake ( TCP 三段式交握 )。

 了解了 TCP 連線建立的觀念後,底下就來說明 FTP 連線的過程。不過在此之前,要先了解的是,FTP Client 能採取的連線模式有兩種,分別是主動模式 (Active mode) 及被動模式 (Passive mode),所以接著會以這兩種不同模式來敘述連線過程。

  主動模式下的 FTP 連線
    當 FTP Client 一開始要連上 FTP Server 時,會先隨機產生一個大於 1024 的 port ( 假設 3000 port ),來主動對 FTP Server 的 21 port 做連線,等完成了 TCP 三段式交握後,連線才正式建立起來,而這個 3000 port 與 21 port 所建立的連線通道,就叫做命令通道 (command channel )。之所以會稱其為命令通道,當然是只能執行一些基本指令而已囉。

現在若是 Client 端想要下載或上傳資料時,還要另外建立起一條資料通道 (data channel ) 來作為資料傳輸使用。由於 Client 是採取主動模式 (可以想像 Client 要求 Server 做主動連線,也就是 Server 主動連 Client ),因此本身會再開啟另一個大於 1024 的 port ( 假設 5000 port ),然後透過命令通道通知 Server 已準備好這個 data channel 的連接埠,接著 Server 就以 20 port 來主動與 Client 端的 5000 port 建立連線,就在完成了另一次的三段式交握後,此 data channel 便建立起來,至此 Client 方可開始做資料傳輸。
     
  被動模式下的 FTP 連線
    一開始 command channel 的建立,與上面所述相同,不再重複,這裡只針對 data channel 的建立做說明。由於此時 Client 是希望採取被動模式 (可以想像 Client 要求 Server 做被動連線,也就是 Client 主動連 Server),所以會先透過 command channel 來通知 Server 這個訊息,Sever 收到後就隨機開啟一個大於 1024 的 port (假設 8000 port),並經由 command channel 知會 Client 已準備好 data channel 的連接埠,接著 Client 也隨機開啟一個大於 1024 的 port (假設 9000 port) 來主動與 Server 建立連線,而完成的三段式交握後,此 8000 port 與 9000 port 之間的 data channel 便建立起來了。


18.2 架設 Pure-ftpd Server

18.2.1 安裝套件及檢視套件內容

Pure-ftpd 所需套件

套 件 名 稱
簡 單 描 述
pure-ftpd
pure-ftpd Server 的主要套件。

檢視套件內容

suse:~ # rpm -ql pure-ftpd

/etc/init.d/pure-ftpd 管理 FTP 服務的 script。
/etc/pure-ftpd/pure-ftpd.conf pure-ftpd 的主要設定檔。
/etc/xinetd.d/pure-ftpd pure-ftpd 可以使用 xinetd 的方式來啟動噢。
/usr/bin/pure-pw 管理虛擬帳號時,所使用的指令。
/usr/sbin/pure-ftpd FTP 服務的主要執行程式,就是那個監聽 21 port 的 daemon 囉。
/usr/sbin/pure-ftpwho 這個指令可以用來查詢目前誰在線上。
/usr/sbin/rcpure-ftpd 連結至 /etc/init.d/pure-ftpd 的符號連結檔。

設定開機時啟動 pure-ftpd 服務

suse:~ # chkconfig pure-ftpd 35


18.2.2 設定 Pure-ftpd Server

 一般登入 FTP 最常見的兩種身分,一為匿名 (Anonymous) 登入,一為使用真實帳號 (Real User) 登入。

 如果以匿名使用者來說,其登入 FTP 時的預設根目錄位置,就是自己的家目錄,您可以觀察在 /etc/passwd 中 ftp (anonymous) 帳號的家目錄在哪,查到了嗎,沒錯,就是 /srv/ftp 啦。

 那 Real User 又如何呢 ? 由於 SuSE 預設是不允許使用真實帳號來登入系統的,因此就算您透過認證的方式來登入 FTP 也沒用,因為最後還是會變成以匿名身分來登入的 ﹔當然也可以藉由修改設定檔來讓 Real User 登入,不過記得還是要把 Real User 限定在根目錄 (預設為自己的家目錄)下活動噢,比如使用者 barry 連線進來後,他就只能對 /home/barry 做存取,而無法存取其他的目錄 。

 那為何要限制使用者所能存取的目錄呢 ? 理由很簡單,因為您不能保證 Real User 對其他目錄不會亂搞一通啊,當您取消了這個限制之後,就等於讓使用者可以自由存取系統上的任何目錄,這樣在無形之中,也會對系統安全構成一大威脅。

 有了以上的基本認知之後,接著就來設定 Pure-ftpd 了。

設定 pure-ftpd.conf

suse:~ # vi /etc/pure-ftpd/pure-ftpd.conf

# Cage in every user in his home directory
ChrootEveryone    yes
# 限定每一個使用者都只能在自己家目錄下活動。當設定成 no 時,則 Real User 就能對
# 其他的目錄做存取,不過還要搭配 "AnonymousOnly no" 來使用才行。


# If the previous option is set to "no", members of the following group
# won't be caged. Others will be.If you don't want chroot()ing anyone,
# just comment out ChrootEveryone and TrustedGID.

# TrustedGID     100
# 當您將註解拿掉後,GID 100 的群組成員,會被視為信任的使用者,因此可以存取家目錄
# 以外的其他目錄。此時無論 ChrootEveryone 設定為何,都是一樣的結果。


# Maximum number of simultaneous users
MaxClientsNumber   10
# 限定最大連線數為 10。

# Maximum number of sim clients with the same IP address
MaxClientsPerIP     3
# 限定同一來源端位址的最大連線數為 3。

# List dot-files even when the client doesn't send "-a".
DisplayDotFiles     yes
# 這個參數設定成 yes 時,則 Client 可以看到檔名是以 "." 作開始的隱藏檔。

# Don't allow authenticated users - have a public anonymous FTP only.
AnonymousOnly    yes
# 是否只允許匿名登入。當您希望 Real User 也能登入時,就設定成 no。

# Disallow anonymous connections. Only allow authenticated users.
NoAnonymous     no
# 是否不允許匿名登入。當設定成 no,表示允許匿名登入,但如果希望只有
# Real User 能經由認證登入時,這裡就設定成 yes 吧。


# Syslog facility (auth, authpriv, daemon, ftp, security, user, local*)
# The default facility is "ftp". "none" disables logging.

SyslogFacility     ftp
# 您可以在 /etc/syslog.conf 裡使用 ftp 這個 facility,來告知 syslogd 要將 ftp 的
 
# 相關訊息紀錄到哪裡


# Don't resolve host names in log files. Logs are less verbose, but it
# uses less bandwidth. Set this to "yes" on very busy servers or

# if you don't have a working DNS.
DontResolve      yes
# 紀錄檔內容是否不需解析來源端 ip 所對應的主機名稱。

# Maximum idle time in minutes (default = 15 minutes)
MaxIdleTime      15
# 設定 FTP Client 端的閒置時間為 15 分鐘。

# PureDB user database (see README.Virtual-Users)
# PureDB   /etc/pure-ftpd/pureftpd.pdb
# 這是使用虛擬帳號登入時,所依據的認證資料庫。


# If you want to enable PAM authentication, uncomment the following line.
PAMAuthentication    yes
# 是否使用 PAM 認證模組,來對使用者作認證。

# If you want simple Unix (/etc/passwd) authentication, uncomment this.
# UnixAuthentication  yes
# 是否依照 UNIX 傳統的 /etc/passwd 來做認證。

# Are anonymous users allowed to create new directories ?
AnonymousCanCreateDirs  no
# 是否允許 anonymous 建立目錄。

# Port range for passive connections replies. - for firewalling.
# PassivePortRange 30000 50000
# 當 Client 端採用被動模式來建立資料通道時,FTP Server 預計所要使用 data channel
# 連接埠的範圍。


# Upload/download ratio for anonymous users.
# AnonymousRatio   1 10
# 設定 anonymous 上傳/下載比率。
# 如以 1:10 而言,當 anonymous 上傳了 1MB 的資料後,就能夠下載 10MB 的資料。


# Upload/download ratio for all users. This directive superscedes
# the previous one.
# UserRatio      1 10
# 設定 All User 上傳/下載比率。當 AnonymousRatio 及 UserRatio 都做設定時,
# 是以 UserRatio 為主。


# Disallow downloading of files owned by "ftp", ie.
# files that were uploaded but not validated by a local admin.

AntiWarez       yes
# 匿名使用者要下載檔案時,如檔案擁有者是 ftp 的話,則不允許被下載。
# 當 FTP 站台開放 anonymous 上傳時 (上傳之後的檔案擁有者為 ftp),為了防止有些人
# 可能會上傳一些有問題的檔案來供人下載,所以才會使用這個參數來做控管 ; 而在管理者
# 確認上傳的檔案沒問題後,就可以把此檔的擁有者做個改變,這樣就能提供正常下載了,
# 當然相關權限還是要設定好就是了。


# IP address/port to listen to (default=all IP and port 21).
# Bind       127.0.0.1,21
# 設定 FTP Server 要在哪個介面位址監聽哪個 port。預設是允許在所有介面位址監聽 21 port。

# Maximum bandwidth for anonymous users in KB/s
# AnonymousBandwidth 8
# 設定 anonymous 最大上傳、下載頻寬,單位為KB/s。

# Maximum bandwidth for *all* users (including anonymous) in KB/s.
# Use AnonymousBandwidth *or* UserBandwidth, both makes no sense.

# UserBandwidth    8
# 設定 All User 最大上傳、下載頻寬。當 AnonymousBandwidth 及 UserBandwidth
# 都做設定時,是以 UserBandwidth 為主。


# File creation mask. <umask for files>:<umask for dirs> .
# 177:077 if you feel paranoid.

Umask        177:077
# 設定使用者所上傳檔案、目錄 (含建立新目錄) 的預設權限。
# 177:077 表示檔案的預設權限為 600,目錄為 700。


# Minimum UID for an authenticated user to log in.
MinUID        40
# 設定能允許 Real User 認證登入的最小 UID 為 40,也就是說 UID 40 以上 (含40)
# 的使用者方可認證登入。
# 如果您想要允許 root 登入的話,那這個地方請先註解起來,並且在 /etc/ftpusers 檔案
# ,將 root 帳號移除。/etc/ftpusers 是用來設定拒絕登入 FTP 的使用者名單。


# Users can't delete/write files beginning with a dot ('.')
# even if they own them. If TrustedGID is enabled, this group
# will have access to dot-files, though.

ProhibitDotFilesWrite   yes
# 是否要禁止使用者刪除或修改隱藏檔,即使使用者就是該隱藏檔的擁有者。
# 設定 yes 就表示要禁止啦。


# Prohibit *reading* of files beginning with a dot (.history, .ssh...)
ProhibitDotFilesRead  no
# 是否要禁止使用者讀取隱藏檔內容。


# Never overwrite files. When a file whoose name already exist is uploaded,
# it get automatically renamed to file.1, file.2, file.3, ...

AutoRename       yes
# 是否開啟自動更名的功能。當設定成 yes ,表示上傳檔案時,若對方目錄內已經存在
# 一個同檔名的檔案,則會將上傳的那個檔案,作自動更名的動作。


# Disallow anonymous users to upload new files (no = upload is allowed)
AnonymousCantUpload yes
# 是否要拒絕 anonymous 上傳。如要開放匿名使用者上傳檔案的話,就設定成 no。
# 另外要允許上傳目錄時,除了這裡要設定成 no 以外,AnonymousCanCreateDirs 參數
# 需設定成 yes 才行。


# Disallow the CHMOD command. Users can't change perms of their files.
# NoChmod       yes
# 是否要拒絕使用者執行 chmod 指令來修改權限。

# Allow users to resume and upload files, but *NOT* to delete them.
# KeepAllFiles     yes
# 當設定成 yes 時,表示使用者無法刪除伺服器上的檔案

# Automatically create home directories if they are missing
# CreateHomeDir    yes
# 當使用者家目錄不存在時,是否要自動建立起來。

# This option is useful with servers where anonymous upload is
# allowed. As /var/ftp is in /var, it save some space and protect
# the log files. When the partition is more that X percent full,
# new uploads are disallowed.

MaxDiskUsage     99
# 假使我們將 anonymous 的家目錄改成 /var/ftp (修改 /etc/passwd ),然後又設定允許
# 匿名使用者上傳,那這個參數就很好用了,因為當 /var partition 的使用空間達 99% 時,
# 就不允許匿名使用者再上傳資料,不然 /var/log 目錄下的那些記錄檔可就無法持續
# 記錄一些重要資訊了。


# Set to 'yes' if you don't want your users to rename files.
NoRename        yes
# 是否要拒絕使用者對檔案重新命名。

 由於這裡我們是打算以 standalone 的方式來啟動 pure-ftpd,因此設定完成後,第一次啟動 FTP Server,請執行:

suse:~ # rcpure-ftpd start

 以後設定檔如有做任何的修改,請記得重新啟動 pure-ftpd。另外您也可嘗試使用 xinetd 的方式來啟動 FTP,請讀者自行練習。


 
18.2.3 設定虛擬帳號
(Virtual User)


 您可以為 pure-ftpd 的用戶端建立虛擬帳號,這個帳號有別於一般使用者登入系統的帳號。而設立虛擬帳號的好處是,除了可與一般帳號做個區隔外,還可以針對每個虛擬帳號設定其個別的上下載頻寬、可使用檔案數、使用空間大小、限制連線時間及來源端控管等等,有意思吧。

 接著就開始來設定虛擬帳號,請參考以下的步驟。

步驟一:設定 pure-ftpd.conf

suse:~ # vi /etc/pure-ftpd/pure-ftpd.conf
# 找到以下兩個參數,並確定前面的註解符號有拿掉。
PureDB     /etc/pure-ftpd/pureftpd.pdb
CreateHomeDir      yes

# 重新啟動 pure-ftpd 服務:
suse:~ # rcpure-ftpd restart

步驟二:建立虛擬帳號所共用的 ftp 專屬帳號

# 先新增專屬帳號的主要群組:
suse:~ # groupadd virtualgrp

# 建立 ftp 專屬帳號:
suse:~ # useradd -g virtualgrp -m virtualuser

步驟三:使用 pure-pw 指令來建立虛擬帳號

suse:~ # pure-pw useradd tina -u virtualuser -d /home/virtualuser/tina
Password:
Enter it again:
#
一開始先新增一個 tina 的虛擬帳號,並指定其家目錄位置。新增完畢後,您應可以
#
/etc/pure-ftpd/ 目錄下找到一個叫 pureftpd.passwd 的檔案,而這個檔案就類似於
#
/etc/passwd 啦,只不過它是屬於虛擬帳號的 password file。

suse:~ # pure-pw mkdb
#
依據 pureftpd.passwd 來建立認證資料庫 /etc/pure-ftpd/pureftpd.pdb。
# 將來要是 pureftpd.passwd 有異動,須執行 "pure-pw mkdb",以更新資料庫內容。

# 其實您在建立虛擬帳號的同時,就可以使用 -m 參數來把 pureftpd.pdb 給順便建立起來:
suse:~ # pure-pw useradd tina -u virtualuser -d /home/virtualuser/tina -m
#
-m 參數會幫我們自動更新資料庫,因此使用了這個參數後,即不必再執行 "pure-pw mkdb" 了。

 設定完成後,趕快用 tina 這個虛擬帳號來登入看看。如果沒問題的話,再來看 pure-pw 指令的其他用法:

suse:~ # pure-pw usermod tina -t 100 -T 50 -q 1 -Q 10 -n 30 -N 2 \
> -z 1400-2230 -r 192.168.5.0/24,192.168.1.0/24 -m
#
參數說明:
# -t、-T:設定下載及上傳頻寬。
# -q、-Q:設定上傳/下載比率。
# -n:限定可使用的檔案數
# -N:限制可使用的空間大小(MB)。
# -z:限定連線時間。
# -r:允許存取的來源端。

# 檢驗一下設定後的結果:
suse:~ # pure-pw show tina
Login       : tina
Password      : $2a$07$m72FgmY91h39TISEorGy3sotL5ufknZ2O
UID        : 1010 (virtualuser)
GID        : 2001 (virtualgrp)
Directory     : /home/virtualuser/tina/./
Full name     :
Download bandwidth : 100 Kb (enabled)
Upload bandwidth  : 50 Kb (enabled)
Max files     : 30 (enabled)
Max size      : 2 Mb (enabled)
Ratio       : 1:10 (enabled:enabled)
Allowed client IPs : 192.168.5.0/24,192.168.1.0/24
Time restrictions : 1400-2230 (enabled)

# 修改 tina 的密碼:
suse:~ # pure-pw passwd tina -m
Password:
Enter it again:

# 刪除 tina 帳號:
suse:~ # pure-pw userdel tina -m

 最後要跟各位補充一點,當啟用虛擬帳號的功能後,平常存在於 /etc/passwd 中的帳號還是可以正常登入 FTP,但若虛擬帳號設定成與一般登入帳號相同時,則是會以虛擬帳號為主的。

18.3 架設 vsftpd Server

18.3.1 所需套件及檢視套件內容

vsftpd 所需套件

套 件 名 稱
簡 單 描 述
vsftpd
vsftpd Server 的主要套件。

檢視套件內容

suse:~ #  rpm -ql vsftpd 

/etc/init.d/vsftpd 管理 FTP 服務的 script。 
/etc/logrotate.d/vsftpd 設定紀錄檔輪替的檔案。
/etc/pam.d/vsftpd vsftpd 的 PAM 認證模組設定檔。
/etc/vsftpd.conf vsftpd 的主要設定檔。
/etc/xinetd.d/vsftpd vsftpd 也可以使用 xinetd 的方式來啟動。
/usr/sbin/rcvsftpd 連結至 /etc/init.d/vsftpd 的符號連結檔。
/usr/sbin/vsftpd vsftpd 的執行主程式 (daemon)。

18.3.2 設定 vsftpd Server

 這裡我們打算以 xinetd 的方式來啟動 vsftpd,因此請先至 /etc/xinetd.d/vsftpd 檔案去做修改:

suse:~ # vi /etc/xinetd.d/vsftpd

service ftp
{
    socket_type  = stream
    protocol    = tcp
    wait      = no
    user      = root
    server     = /usr/sbin/vsftpd
    
disable    = no ← 把 yes 改成 no 即可。
}

 接著請重新啟動 xinetd:  

suse:~ # rcxinetd restart
Shutting down xinetd:            done
Starting INET services. (xinetd)       done

 這樣 vsftpd 的服務就已經啟動了。再來開始進一步探討 vsftpd.conf 的設定內容。

設定 vsftpd.conf

suse:~ # vi /etc/vsftpd.conf

###### General Settings ######

# Uncomment this to enable any form of FTP write command.
# write_enable=YES
# 預設為 NO。是否讓使用者擁有寫入的權限。
# 當指定為 YES 時,才能讓 anon_upload_enable、anon_mkdir_write_enable、
# anon_other_write_enable 這些參數設定成 YES 時生效。另外這裡若設定成 NO,
# 則連 realuser 在自己家目錄下也不具有寫入的權限。


# Activate directory messages - messages given to remote users when they
# go into a certain directory.

dirmessage_enable=YES
# 預設為 NO。當使用者切換至某個目錄時,是否要顯示該目錄下 .message (預設) 檔案內的
# 當然您也可以透過以下 message_file 參數,來指定不同的檔案。

# message_file=.message
# 預設為 .message。當上一個參數指定為 YES 時,如不想使用預設的 .message 檔案,就可以
# 利用這個參數來指定另一個檔名。


# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
# nopriv_user=ftpsecure
# 預設為 nobody。這是設定以哪個帳號來執行 vsftpd 的服務。

# You may fully customise the login banner string:
# ftpd_banner="Welcome to FOOBAR FTP service."
# 預設不顯示。設定使用者登入 ftp 時,所看到的登入訊息。

# 如果要提供的訊息內容很多時,則可事先將這些訊息寫入某個檔案,然後再利用
# banner_file 參數去指定這個檔案的所在位置,如下:
# banner_file=/etc/welcomefile

# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.

# deny_email_enable=YES
# 預設為 NO。是否要拒絕匿名使用者輸入特定的 E-Mail 密碼。
# 當設定成 yes 時,以下 banned_email_file 參數所指定的檔案必須存在,否則會造成
# 所有人都無法登入。

# (default follows)
# banned_email_file=/etc/vsftpd.banned_emails
#
當 deny_email_enable =YES 時,可以把所要拒絕登入的 E-Mail 密碼設定在預設的
# /etc/vsftpd.banned_emails 檔案內。

# use_localtime=YES
#
預設為 NO。是否使用本地時間。由於 vsftpd 預設是使用 GMT 時間,因此在您
# 上傳檔案或目錄後,用長格式去檢查這些檔案目錄時間欄位,會發覺與本地端
# 時間不同。而在您設定這個參數後,就可以解決這方面的問題。

###### Local FTP user Settings ######

# Uncomment this to allow local users to log in.
# local_enable=YES
# 預設為 NO。是否允許在本機擁有真實帳號 (realuser) 的使用者登入。

# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)

# local_umask=022
# 預設為 077。這是設定 realuser 上傳檔案目錄時的預設權限。如以 local_umask=022 而言,
# 則上傳建立目錄時的預設權限就是 755,上傳檔案則為 644


# Uncomment to put local users in a chroot( ) jail in their home directory
# after login.

# chroot_local_user=YES
#
預設為 NO。是否限定 realuser 登入後,以其家目錄作為預設的根目錄位置。當設定成 YES,
# 則 realuser 就只能在自己家目錄下活動,而無法切換到家目錄以外的範圍。 

# You may specify an explicit list of local users to chroot( ) to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot( ).

# chroot_list_enable=YES
#
預設為 NO。當 chroot_local_user=NO、chroot_list_enable=YES 時,可搭配下一個
# 要介紹的參數 chroot_list_file ,來把一些使用者帳號寫入預設的
# /etc/vsftpd.chroot_list 檔案之中,這樣一來,這些使用者就只能在自己家目錄下活動。
# 但反過來,當 chroot_local_user=YES、chroot_list_enable=YES 時,則在
# /etc/vsftpd.chroot_list 之中的帳號,就可以在家目錄外活動,而沒設定在此檔之中的
# 使用者,就只能以家目錄作為預設的根目錄。

# (default follows)
# chroot_list_file=/etc/vsftpd.chroot_list
#
參考以上說明。至於檔案設定格式是一個帳號佔用一行。

# This option represents a directory which vsftpd will try to change into
#
after a local login.
# local_root=/srv/ftp/realdir

# 預設為不啟用。當您想讓所有 realuser 登入時,
皆以同一個目錄作為其預設登入的
# 根目錄,就啟用這個參數。

# userlist_enable=YES
# 預設為 NO。設定成 YES 時,表示 vsftpd 會載入 userlist_file 參數所指定的檔案,
# 以讀取其內的使者名單。

# userlist_deny=YES
# 預設為 YES。當 userlist_enable=YES、userlist_deny=YES 時,則被設定在以下
# userlist_file 參數所指案內的使用者,將會被拒絕登入。
# 若 userlist_enable=YES、userlist_deny=NO 時,則只有設定在 userlist_file 參數
# 指定檔案內的使用者,能被允許登入,其他人則會被拒絕,包括 ftp 帳號在內。

# userlist_file=/etc/vsftpd.user_list
# 預設為 /etc/vsftpd.user_list。可將被允許或拒絕的使用者帳號寫入,至於這些帳號是
# 被允許或拒絕,則端看 userlist_deny 怎麼設定 (參考上一個參數的說明)。
# 不過還要注意另一個檔案 /etc/ftpusers,一般我們會將一些拒絕登入的帳號寫入此檔,
# 比如
想讓 root 帳號登入 ftp 時,就需先把 root 從 ftpusers 檔案中移除才行。

# The maximum data transfer rate permitted, in bytes per second, for
# local authenticated users. The default is 0 (unlimited).

# local_max_rate=7200
# 預設為 0。設定 realuser 上傳及下載的傳輸速率,單位為 bytes/sec。而預設值 0 表示不設限。


# user_config_dir=/etc/vsftpd/limitdir
# 可以利用這個參數來個別設定使用者的傳輸頻寬,比如想限定使用者 barry 的上傳下載頻寬,
# 可以至 /etc/vsftpd/limitdir 目錄下去建立一個 barry 檔案 ,然後再把 local_max_rate
# 參數設定進去就行了。

# guest_enable=YES
# 預設為 NO。當 realuser 登入時,是否要將其身份轉換成訪客。若設定成 YES 時,則可以
# 利用 guest_username 參數來指定訪客的身份,如未指定,則預設為 ftp。

# guest_username=guest
# 預設為 ftp。當 guest_username=YES 時才有作用。


###### Anonymus FTP user Settings ######


# Allow anonymous FTP?
anonymous_enable=YES
# 預設為 YES。是否允許匿名使用者 (anonymous) 登入。

# Anonymous users will only be allowed to download files which are
# world readable.
#

anon_world_readable_only=yes
# 預設為 YES當設定成 yes,表示匿名使用者下載檔案時,如果 others 對此檔案具有
# 可讀的權限,則允許下載。
# 舉個例子,假使您的 FTP 允許 anonymous 上傳,且上傳後該檔案權限為 600 ( 此時 others
# 對此檔案不具有可讀權限 ),則此參數設定為 yes 的情況下, anonymous 是不允許對這些
# 檔案進行下載的。

# This option represents a directory which vsftpd will try to change into
# after an anonymous login.

# anon_root=/ftp/anondir
# 預設為不啟用。想改變 anonymous 預設登入的根目錄位置,就設定這個參數吧 !

# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.

# anon_upload_enable=YES
# 預設為 NO。是否允許匿名使用者上傳檔案。如果設定允許的話,則在 Server 上,
# 您必須事先建立一個可以讓 anonymous 擁有寫入權限的目錄才行。


# Default umask for anonymus users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)

# anon_umask=022
# 預設為 077。設定 anonymous 上傳檔案目錄時的預設權限。

# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
# anon_mkdir_write_enable=YES

# 預設為 NO。是否允許匿名使用者上傳或建立目錄。

# Uncomment this to enable anonymus FTP users to perform other write operations
# like deletion and renaming.

# anon_other_write_enable=YES
# 預設為 NO。是否允許匿名使用者具備其他的寫入權限,比如刪除檔案目錄,或對檔案目錄
# 重新命名等。


# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!

# chown_uploads=YES
# 預設為 NO。匿名使用者上傳檔案後,是否允許安排檔案的擁有者為另一個使用者而非 ftp。
# 設定成 YES,可搭配 chown_username 參數,去指定該檔案的擁有者是誰,如沒指定,則預
# root。請注意這裡是只針對上傳的檔案而言,目錄在這個地方並不適用。

# chown_username=whoever
# 預設為 root。需搭配 chown_uploads=YES 來設定。

# The maximum data transfer rate permitted, in bytes per second, for anonymous
# authenticated users. The default is 0 (unlimited).

# anon_max_rate=7200
# 預設為 0。設定 anonymous 上傳及下載的傳輸速率, 0 表示不設限。

###### Log Settings ######

# Log to the syslog daemon instead of using an logfile.
syslog_enable=YES
# 預設為 NO。當設定成 YES 時,會把原本要紀錄到 /var/log/vsftpd.log 中的 ftp 資訊,
# 改依 syslogd daemon 所主要參考的檔案 syslog.conf,來決定把 ftp 相關訊息
# 紀錄到哪裡,以 SUSE 而言,就是指 /var/log/messages。

# Uncomment this to log all FTP requests and responses.
# log_ftp_protocol=YES
# 預設為 NO。是否要將所有 ftp 的需求及回應都紀錄下來。

# Activate logging of uploads/downloads.
# xferlog_enable=YES
# 預設為 NO。是否要將 ftp 的上傳/下載資訊記錄下來。
# 若設定 YES,則預設會紀錄在 /var/log/vsftpd.log 檔案中。

# You may override where the log file goes if you like. The default is shown
# below.

# vsftpd_log_file=/var/log/vsftpd.log
# 這是 vsftpd 預設的紀錄檔。

# If you want, you can have your log file in standard ftpd xferlog format
# Note: This disables the normal logging unless you enable dual_log_enable below.
# xferlog_std_format=YES
# 預設為 NO。是否以 wu-ftpd 標準的 xferlog 格式,來作為記錄檔的紀錄格式。當設定成 YES
# 時,預設的紀錄檔為 /var/log/xferlog

# You may override where the log file goes if you like. The default is shown
# below.

# xferlog_file=/var/log/xferlog
# 當 xferlog_std_format=YES 時,預設就是記錄在這個檔案。

# Enable this to have booth logfiles. Standard xferlog and vsftpd's
# own style log.
# dual_log_enable=YES
# 預設為 NO。當設定為 YES 時,會同時將 ftp 資訊紀錄在 /var/log/xferlog 及 /var/log/vsftpd.log 中。

###### Transfer Settings ######

# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
# 預設為 NO。在主動模式下建立資料通道時,是否啟用 20 port。

# You may change the default value for timing out an idle session.
# idle_session_timeout=600
# 預設為 300 秒。設定閒置時間為何。若設定 100 秒,就表示使用者在 100 秒內
# 都沒執行任何命令動作時,將會被斷線。


# You may change the default value for timing out a data connection.
# data_connection_timeout=120

# 預設為 300 秒設定資料傳輸時所能閒置的秒數。

# ascii_upload_enable=YES
# 預設為 NO。是否允許以 ASCII 格式來上傳資料。

# ascii_download_enable=YES

# 預設為 NO是否允許以 ASCII 格式來下載資料。

# Set to NO if you want to disallow the PASV method of obtaining a data
# connection.

# pasv_enable=YES
# port_enable=YES

# 預設皆為 YES。是否允許 client 端使用主動模式或被動模式來建立連線。


# PAM setting. Do NOT change this unless you know what you do!
pam_service_name=vsftpd
# 預設為 ftp。這裡是指定 vsftpd 所使用 pam 模組服務的名稱,其路徑為 /etc/pam.d/vsftpd。


# Set listen=YES if you want vsftpd to run standalone
listen=NO
# 預設為 NO。是否以 standalone 的方式來啟動 vsftpd 服務。由於我們當初是規劃使用
# xinetd 的方式,因此需確定 listen 設定為 NO。


# listen_port=21
# 預設為 21 port設定於建立命令通道時所使用的 port number。


# tcp_wrappers=YES
# 預設為 NO。是否讓 /usr/sbin/vsftpd 支援 tcp_wrappers。若設定成 YES,則連線進來的
# 封包將會 /etc/hosts.allow 及 /etc/hosts.deny 的過濾。
# 這個參數是特別針對以 standalone 方式來啟動 vsftpd 服務而計的,若您是使用 xinetd
# 來啟動的話,則不管 tcp_warppers 參數設定為何,都會使用到 tcpd 的過濾機制。

# max_clients=20
# 預設為 0。以 standalone 來啟動 vsftpd 前提下,限定 client 端的最大連線數為何。
# 預設值 0, 表示不限制連線數。


# pasv_min_port=8000

# pasv_max_port=9000
# 預設皆為 0。設定被動模式下建立資料通道時,所啟用的 data port number 的範圍。
# 預設值 0 ,表示 any port 之意。

 設定檔修改過後,請記得重新啟動 xinetd。

 以上只是列舉部分設定參數來做說明而已,如讀者對其他 vsftpd 的參數有興趣的話,可 " man vsftpd.conf " 來自行查閱。

18.3.3 vsftpd 的綜合範例練習

  以下舉個實際的設定範例給大家參考。所要求的事項如下:

  1. 一般設定部分
    ˙ 當使用者登入 FTP 站台時,會看到如下的歡迎訊息:

    ############################################
    ########## Welcome to barry's FTP Site ###########
    ############################################
    ˙ 請讓 vsftpd 使用本地端的時間。

  2. Realuser 設定部分
    ˙ 允許 realuser 能登入 FTP,且除了使用者 barry 及 david 外,其他 realuser 都只能以自己的家目錄作為登入時預設的根目錄位置。
    ˙ 拒絕 tina 及 mary 這兩個帳號登入 FTP。
    ˙ 設定使用者 barry 及 david 的上傳/下載頻寬為 200 KB/sec,其他 realuser 則為 80 KB/sec。

  3. Anonymous 設定部分
    ˙ 允許 anonymous 可以上傳檔案 (請事先建立 /srv/ftp/upload 目錄,來提供給 anonymous 上傳檔案用) 及下載 ,而上傳後的檔案,無法馬上提供給其他人下載,亦無法被刪除。
    ˙ 設定 anonymous 的上傳/下載頻寬為 50 KB/sec。

  4. Log 設定部分

    將使用者上傳/下載的資訊,同時紀錄在 /var/log/vsftpd.log 及 /var/log/xferlog 中。

  5. 檔案傳輸設定部分
    ˙ 使用者閒置三分鐘沒執行任何命令動作,將會被斷線。另外在做資料傳輸時,如果閒置時間超過兩分鐘,也會被斷線。
    ˙ 不允許使用 ASCII 格式來上傳/下載資料。
    ˙ 以 xinetd 方式來啟動 vsftpd。
設定範例
suse:~ # vi /etc/vsftpd.conf 

###### 一般設定 ######

write_enable=YES
banner_file=/etc/welcomefile
use_localtime=YES

###### RealUser 相關設定 ######

local_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
local_max_rate=80000
user_config_dir=/etc/limitdir

###### Anonymous 相關設定 ######

anonymous_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES

anon_umask=077
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_max_rate=50000

###### Log 相關設定 ######

xferlog_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
xferlog_std_format=YES
xferlog_file=/var/log/xferlog
dual_log_enable=YES 

###### 檔案傳輸設定 ######

idle_session_timeout=180

data_connection_timeout=120
ascii_upload_enable=NO
ascii_download_enable=NO
pam_service_name=vsftpd
listen=NO

 完成後請重新啟動 xinetd:

suse:~ #  rcxinetd restart
Shutting down xinetd:           done
Starting INET services. (xinetd)      done

 接著就開始針對相關參數所指定的檔案目錄做相關設定囉:
  
1. 設定登入 FTP 時的顯示訊息:
suse:~ # vi /etc/welcomefile
###########################################
########## Welcome to barry's FTP Site ##########
###########################################

2. 設定只有 barry 及 david 登入後,不會被侷限在家目錄下活動:
suse:~ # vi /etc/vsftpd.chroot_list
barry
david

3. 拒絕 mary 及 tina 登入 FTP 站台:
suse:~ # vi /etc/ftpusers
mary
tina
# 要讓 /etc/ftpusers 這個檔案產生效用,須確定在 vsftpd.conf 中的 pam_service_name 參數
# 指定為 vsftpd 才行。由於這裡牽涉到 PAM 模組設定的問題,所以就先不提了。


4. 限定 barry 及 david 的最大傳輸速度
suse:~ # mkdir /etc/limitdir
suse:~ # vi /etc/limitdir/barry
local_max_rate=200000
# david 的做法,也請如法炮製一番。

5. 設定 anonymous 的上傳目錄:
suse:~ # mkdir /srv/ftp/upload
suse:~ # chown ftp /srv/ftp/upload
# 將上傳目錄的擁有者改為 ftp,不然 anonymous 是無法上傳資料的噢。

 到這裡,整個 FTP 的設定才算完成。接著您可以根據實際環境的需求,來嘗試設定適合自己環境了噢。

  

copyright © 2006 by barry ( 柏青哥 )