twbsd.org
 
  Select Language: Home  SmbFTPD Bug Tracker  Forum 

書籍資料

ch00 序.htm

ch01 FreeBSD 簡介.htm

ch02 安裝 FreeBSD.htm

ch03 UNIX 系統入門.htm

ch04 使用者管理.htm

ch05 網路設定.htm

ch06 檔案系統管理.htm

ch07 系統安全.htm

ch08 編譯核心.htm

ch09 系統調校.htm

ch10 軟體安裝.htm

ch11 X Window 的使用.htm

ch12 NAT 及防火牆.htm

ch13 網頁伺服器.htm

ch14 網頁伺服器進階應用.htm

ch15 FTP 伺服器.htm

ch16 郵件伺服器.htm

ch17 郵件伺服器進階應用.htm

ch18 DHCP伺服器.htm

ch19 資料庫系統.htm

ch20 Samba 網路芳鄰.htm

ch21 NFS.htm

ch22 DNS 伺服器.htm

ch23 指令應用.htm

ch24 Shell Script.htm

cha1 附錄A etc目錄下的檔案介紹.htm

cha2 附錄B 製作 FreeBSD 安裝光碟.htm

cha3 附錄C 版權宣告.htm

 


View printable page

第十五章 FTP 伺服器

FTP (File Transfer Protocol) 是常用的網路協定,主要的功能是用來傳輸檔案,我們時常從 FTP 站台下載檔案。本章將介紹如何使用 FreeBSD 架設 FTP 伺服器,並說明各種 FTP 伺服器的管理技巧。本章除了 FreeBSD 內附的 FTP 伺服器軟體外,並將介紹筆者開發的 SmbFTPD。讀完本章後,您將進一步了解下列主題:

  • FTP 協定的運作方法。
  • 如何使用 FreeBSD FTP。
  • 加強權限控制以建立安全的 FTP 伺服器。
  • 安裝設定 SmbFTPD。
  • 如何使用具 SSL 加密的 FTP。
  • 如何進行流量控制。

15.1 FTP 概論

FTP 是一個歷史悠久的網路通訊協定,和大多數的網路協定一樣,它採用 Client/Server 架構,各地的使用者可以經由網路連到伺服器上傳或下載檔案。FTP 協定比較特別的地方在於它在使用時必須建立二個連線:一個用來傳輸指令、一個用來傳輸檔案。

圖 15-1

當我們使用 FTP 軟體連到 FTP 伺服器時,客戶端會先連到伺服器的連接埠 21,並建立一條「控制連線」(Control Stream)。接下來,您會輸入帳號、密碼等指令,這些指令及 FTP 的回應都是使用都是使用「控制連線」。當您要下載檔案時,或者是執行 ls 以列出目錄中的檔案時,檔案或目錄列表的下載是經另一個連線「資料連線」(Data Stream)。「資料連線」和「控制連線」不同的是資料連線所傳輸的資料比較大,而控制連線只是用來傳輸指令及簡單的回應。

基本上,一個完整的 FTP 連線建立過程為:

  • 客戶端打開自已機器大於 1024 的連接埠,並連到伺服器的連接埠 21,建立「控制連線」。
  • 客戶端開始對伺服器下指令,告訴伺服器客戶端用來傳輸檔案的連接埠為何。
  • 伺服器從連接埠 20 連到客戶端所開放的埠號 (大於 1024),以建立「資料連線」。

上述這種連線建立的方式是由伺服器主動建立「資料連線」,我們稱之為「主動模式」(Active Mode)。基本上主動模式的運作在沒有防火牆或 NAT 的情形下沒有什麼問題,但若客戶端有防火牆,則可能會無法建立連線。

圖 15-2

因為「控制連線」是由客戶端主動連到伺服器,所以在客戶端有防火牆或 NAT 時,還是可以連到伺服器。接下來在建立「資料連線」時,客戶端會從「控制連線」中告訴伺服器它的 IP 及埠號,請伺服器連過來。但是由於客戶端有防火牆,所以伺服器要連到客戶端時會失敗,而無法建立連線。

基本上,如果客戶端使用的是 FreeBSD 的 NAT 不會有這種問題,FreeBSD 會自動做轉換,但若是使用其它的防火牆就不一定可以支援 FTP 的 Active Mode。

何謂 Passive Mode

要解決 FTP Active Mode 的問題,可以在連線時改用「被動模式」(Passive Mode)。所謂的被動模式就是由伺服器打開一個連接埠,被動地等客戶端連過來建立「資料連線」。被動模式的連線建立過程為:

  • 客戶端打開自已機器大於 1024 的連接埠,並連到伺服器的連接埠 21,建立「控制連線」。
  • 客戶端開始對伺服器下指令,告訴伺服器進入「被動模式」。
  • 伺服器打開一個大於 1024 的連接埠,等待客戶端的連線。
  • 客伺端打開自已機器大於 1024 的連接埠,並連到伺服器以建立「資料連線」。

圖 15-3

由於控制連線及資料連線都是由客戶端主動連過去伺服器,如此即可避開防火牆及 NAT 的問題。我們來看看如何判斷連線失敗是否因為主動模式的原因:

# ftp ftp.freebsd.org
Trying 204.152.184.73...
Connected to ftp.freebsd.org (204.152.184.73).
220 Welcome to freebsd.isc.org.
Name (ftp.freebsd.org:alex): anonymous
331 Please specify the password.
Password:
230-
230-You have reached the freebsd.isc.org FTP server, serving the
230-full FreeBSD FTP archive over IPv4 (204.152.184.73) and IPv6
230-(2001:4f8:0:2::e) networks. This server is also known as:
230-
230- ftp.freebsd.org
230- ftp4.freebsd.org
230- ftp4.us.freebsd.org
230-
230-This server is operated by Internet Systems Consortium (ISC),
230-on behalf of the FreeBSD Project, with hardware donations from
230-Apple, Intel and Iron Systems.
230-
230-Questions about this service can be sent to: freebsd@isc.org.
230-
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
^C
ftp> passive
Passive mode on
ftp> ls
227 Entering Passive Mode (204,152,184,73,54,200)
150 Here comes the directory listing.
drwxrwxr-x 3 0 0 512 Apr 17 2003 pub
226 Directory send OK.
ftp>

當您登入一台 FTP 伺服器後,如果您輸入 ls,卻等了很久都沒有回應,您可以輸入 <Ctrl>+C 以中斷命令。接著輸入 passive 以進入被動模式,再打 ls 就可以看到目錄內容,則無法連線的問題一定是主動模式的原故。

15.2 設定 FTP 伺服器

FreeBSD 內建有 FTP 伺服器的功能,如果您要使用內建的 ftpd,我們不需要特別進行任何安裝的動作,只要做好設定即可。本小節中,我們將介紹如何設定啟動 FTP 伺服器的功能,並進行一些基本的配置。

15.2.1 啟動 FTP 伺服器

我們有二種方式啟動 ftpd,一種是使用 standalone daemon,另一種是使用 inetd。inetd 是 UNIX 系統中一個強大的「超級伺服器」,我們可以使用它來管理許多系統服務,例如 telnet、ssh、ftp 等。大部份的系統服務都是使用 inetd 來啟動,使用它的好處在於可以統一管理各種服務,並經由它來設定服務規則,例如是否要阻擋某些 IP 來源等。不過,使用 inetd 的方式缺點是每次有連線要求時,inetd 的 daemon 必須依連線的種類去執行相對映的指令,所以速度比較慢。

另一種啟動 FTP 的方式是使用 standalone daemon,也就是直接執行 FTP daemon,當它接收到新的連線時,就 fork() 出來處理,這種方式連線建立的速度較快,比較適合專門的 FTP 伺服器。

使用 inetd

我們先來介紹如何使用 inetd 的方式啟動 FTP 伺服器。首先,請編輯 /etc/inetd.conf,將 ftp 設定開頭的 # 移除:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l
ftp     stream  tcp6    nowait  root    /usr/libexec/ftpd       ftpd -l

接下來,我們必須使用下列指令重跑 inetd:

# kill -1 `cat /var/run/inetd.pid`

現在您就可以開始使用 FreeBSD 的 FTP 服務了。

使用獨立 Daemon

如果您要以獨立的 daemon 方式啟動 FTP,請先確定在 inetd.conf 中沒有啟動 FTP 服務。接下來,請在新增一個檔案 /usr/local/etc/rc.d/ftpd.sh 內容如下:

#!/bin/sh

ftpd_program="/usr/libexec/ftpd"
ftpd_flags="-D -l"

case $1 in
start)
	echo "Starting FTPD"
	$ftpd_program $ftpd_flags
;;
stop)
	echo "Stopping FTPD"
	killall ftpd
;;
restart)
	$0 stop
	sleep 1
	$0 start
;;
esac

編輯完後,我們必須將該檔案變成可執行:

# chmod 755 /usr/local/etc/rc.d/ftpd.sh

接下來,您就可以使用下列指令啟動 FTPD 了:

# /usr/local/etc/rc.d/ftpd.sh start

如果您要停止 FTPD 服務,則使用下列指令:

# /usr/local/etc/rc.d/ftpd.sh start

15.2.2 編輯歡迎訊息

當我們連線到一個 FTP 站台時,我們可以看到二個歡迎訊息,一個是登入前的訊息,另一個是登入後的訊息。以下列訊息為例:

# ftp localhost
Trying ::1...
Connected to localhost.alexwang.com.
220- Welcome to My FTP Server.
220-
220- This is a welcome message
220-
220- Nice to see you.
220 vmware.alexwang.com FTP server (Version 6.00LS) ready.
Name (localhost:alex):
331 Password required for alex.
Password:
230- This is the message of the day.
230-
230- It will be shown after user login.
230 User alex logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

開頭為 220- 的就是登入前的訊息,我們稱它為歡迎訊息。以 230- 為開頭的是登入後的訊息,我們稱它為本日訊息 (Message of the day)。這二種訊息我們都可以自行設定。

如果您要設定的是登入前的訊息,請新增一個檔案 /etc/ftpwelcome,並將您的訊息寫入該檔中。以下為上述範例中的訊息內容:

Welcome to My FTP Server.

This is a welcome message

Nice to see you.

您不需要寫 220- 等資料,FTP 伺服器會自動幫您加上這種代碼。而登入後的訊息是存放在 /etc/ftpmotd,您可以編輯該檔以進行設定。

15.2.3 FTP 伺服器管理

在啟動 FTP 伺服器時,我們可以加入一些參數以調整伺服器的行為。例如,修改預設的連接埠、記錄使用者上傳、下載的檔案等等。有些參數必須要在使用獨立的 daemon 方式啟動時才有用,而有的參數在 inetd 模式下也可以使用。

下表為我們常用的參數:

參數 是否只能在 Daemon 模式下使用 意義
-a 當您有二張網路卡或是二個 IP 時,我們可以設定只接受連線到某一個 IP 的連線要求。例如:

ftpd -D -a 192.168.0.1

此範例表示只接受使用者連線到 192.168.0.1 這個 IP。

-d 記錄 FTP 的除錯訊息。除了加入這個參數外,您必須修改 /etc/syslog.conf,並加入下列內容以記錄 FTP 的訊息。

!ftpd
*.*                    /var/log/ftpd.log
-h 不要顯示 FTP 伺服器的主機名稱、軟體資訊、版本等。
-l 記錄 FTP 登入成功及失敗的訊息。如果您使用二次 -l,則使用者上傳、下載、刪除、建立目錄時都會留下記錄。預設的記錄會留在 /var/log/xferlog 中。
-P 我們知道 FTP 預設會監聽連接埠 21,以接受客戶端的連線要求。不過如果您是以獨立的 daemon 方式啟動 FTP,則 可以使用 -P 加上連接埠號以改變預設連接埠。

另外,還有很多用來控制使用者權限的參數,我們會在下一小節中說明。您也可以使用 man ftpd 以查看更多關於 ftpd 的參數。

如果您要修改 ftpd 啟動的參數,在 inetd 模式下,您可以修改 /etc/inetd.conf,並在 ftp 設定的最後面加入參數,如下列粗體字所示:

ftp  stream  tcp     nowait  root   /usr/libexec/ftpd    ftpd -l -l -d
ftp  stream  tcp6    nowait  root   /usr/libexec/ftpd    ftpd -l -l -d

上面的範例中,我們多加入了參數 -l -d,以記錄更多 ftpd 的訊息。

如果您是以獨立的 Daemon 方式啟動 ftpd,則請修改 /usr/local/etc/rc.d/ftpd.sh

#!/bin/sh

ftpd_program="/usr/libexec/ftpd"
ftpd_flags="-D -l -l -d"
...

我們只要修改 ftpd_flags 的部份,加入您所要的參數即可。

15.3 FTP 權限控制

預設的 FTP 啟動後,使用者可以上傳、下載任何他們有權存取的檔案。在登入後,使用者可以進到任何系統中的目錄 (如果目錄權限允許的話)。本小節將告訴您一些 FTP 讀寫權限的控制,讓您可以更進一步控制伺服器的系統安全。

15.3.1 限制帳號與連線來源

我們可以設定限制某些帳號不可以使用 FTP 登入。使用者在登入 FTP 伺服器時,有幾個規則會拒絕該帳號登入:

  • 如果 /var/run/nologin 存在,則所有帳號都不可以登入。這個檔案可以用來暫時停止 FTP 服務。
  • 使用者一定要有密碼才能登入,沒有密碼的使用者無法登入。
  • 使用者名稱不可以出現在 /etc/ftpusers 中。
  • 使用者群組不可以出現在 /etc/ftpusers 中。
  • 使用者所使用的 shell 必須要時合法的 shell。合法的 shell 會被定義在 /etc/shells 中。
  • 除了匿名模式外,使用者名稱不可以是 ftp 或 anonymous。關於匿名模式,我們會在下一小節中說明。

/etc/ftpusers 定義了不可以使用 FTP 服務的使用者及群組。我們來看一下該檔案的內容:

# $FreeBSD: src/etc/ftpusers,v 1.13 2004/06/30 16:47:08 maxim Exp $
#
# list of users disallowed any ftp access.
# read by ftpd(8).
root
toor
daemon
operator
bin
tty
kmem
games
news
@guest
...

我們可以看到該檔案中已經有一些使用者不可以登入 FTP。這些使用者都是系統預設的帳號,我們也可以經由修改它來加入其它使用者。

/etc/ftpusers 中,如果開頭是 "@" 表示群組名稱。例如上述檔案內容中的 @guest 表示群組 guest 不可以登入系統。

除了控制使用者帳號外,在「inetd」模式下,我們還可以控制連線來源。所有 FreeBSD 中由 inetd 所啟動的服務都可以經由修改 /etc/hosts.allow 以使用 TCP Wrappd 來限制連線來源。下列為預設的 /etc/hosts.allow 內容:

# Provide a small amount of protection for ftpd
ftpd : localhost : allow
ftpd : .nice.guy.example.com : allow
ftpd : .evil.cracker.example.com : deny
ftpd : ALL : allow

如果我們要限制某幾個 IP 或網域不能使用 FTP,可以使用下列範例:

# Provide a small amount of protection for ftpd
ftpd : localhost : allow
ftpd : 210.122.13.5 : deny
ftpd : .evil.cracker : deny
ftpd : ALL : allow

我們在上述範例中拒絕 IP 210.122.13.5 及 evil.cracker 網域的主機使用 FTP,並在最後一行設定其它來源都許可。

如果您要設定只有某些來源可以使用 FTP,而拒絕大多數的主機,則可以設定:

# Provide a small amount of protection for ftpd
ftpd : localhost : allow
ftpd : 192.168.0. : allow
ftpd : my.friend.com : allow
ftpd : ALL : deny

我們設定了只有本機 (localhost)、192.168.0.x、及 my.friend.com 才可以使用 FTP,其它連線都拒絕。

15.3.2 限制上傳下載權限

在使用者登入後,只要目錄、檔案權限許可,它們可以自由的上傳、下載檔案。如果您希望加以限制讀寫的權限,可以在啟動 FTP 時加上下列幾個參數:

參數 意義
-o 限制所有使用者只能上傳檔案,而無法下載任何檔案。
-r 限制所有使用者對於伺服器內所有檔案只能唯讀,不可以建立目錄、上傳、更改檔名、或任何會動到檔案目錄的指令。

上述的參數必須在啟動 FTP 伺服器時指定,請參考15.2.3 一節,針對 inetd 及獨立的 Daemon 有不同的設定方法。

15.3.3 chroot

一般使用者登入後,預設會進入自己的家目錄中。使用者可以改變工作路徑到系統的任何目錄中。如果您希望使用者登入後只能在自己的家目錄中活動,而不能進入其它系統目錄中,可以使用 chroot 的功能。

所謂的 chroot 就是將某一個目錄變成使用者看到的根目錄。例如,我們讓使用者 alex 登入後,將 /home/alex 變成根目錄。則 alex 在使用指令「cd /」時,還是會停留在 /home/alex。如果他使用指令「pwd」查看目前所在路徑,則會顯示 /。如此一來,我們就可以確保使用者不會到處亂跑,進入一些不該進入的地方。這個功能對於提升 FTP 的安全性有莫大的助益。

設定 chroot 的方法很簡單,只要修改 /etc/ftpchroot 即可。chroot 的設定是以使用者、群組的基礎,以下是幾個設定範例:

alex
@guest
john /var/ftp
@other /var/ftp

上述範例中的第一行是設定使用者 alex 登入後,以自己的家目錄為根目錄。第二行的 @guest 表示只要是群組為 guest 的使用者,都以自己的家目錄為根目錄。而第三、四行分別表示使用者 john 及群組 other 都以 /var/ftp 為根目錄。

只要我們善用 chroot 的功能,就可以加強保護系統其它目錄,讓沒有權利的使用者不可以進入系統目錄中。建議您在開放 FTP 服務時,將所有使用者都加入 /etc/ftpchroot 中。

15.3.4 匿名的 FTP

我們平常在登入 FreeBSD 的 FTP 站台時,可以使用 anonymous 或是 ftp 這二個使用者登入,而且在登入時,任何密碼都可以通過。這種可以使用 anonymous 登入的 FTP 就叫作匿名 FTP。anonymous 及 ftp 這二個帳號是預設的匿名帳號,當使用者以匿名登入時,伺服器會將匿名帳號對映到系統內的真實使用者 ftp。所以,如果您要提供匿名的 FTP 服務,請使用下列指令新增使用者帳號 ftp:

# pw adduser ftp
# mkdir /home/ftp
# chown ftp:ftp /home/ftp

我們建立了使用者 ftp 及其家目錄 /home/ftp。使用 pw 指令所建立的使用者在 /etc/master.passwd 中的密碼欄位預設為 *,表示不可以登入。這個使用者除了匿名 FTP 外,將不可以使用 telnet、SSH、或是其它服務。

在新增了使用者 ftp 之後,我們就已經支援匿名 FTP 的功能了。現在您可以使用 anonymous 或 ftp 帳號登入,而且不需任何密碼。由於開放了匿名 FTP 後,任何人都可以登入系統,所以匿名帳號登入後一定會使用 chroot,以將匿名使用者限制在家目錄中。

除了強制使用 chroot 外,我們還可以在啟動 FTP 時加上一些參數,以針對匿名使用者進行更多的限制。下表為啟動 FTP 服務時可以使用的參數:

參數 意義
-M 禁止匿名使用者建立新的目錄。
-m 允許匿名使用者覆寫一個存在的檔案。預設啟動 FTP 時,並不允許匿名使用者覆寫已經存在的檔案。當使用者上傳檔案時,如果已經有同檔名的檔案存在,系統會自動為上傳的檔案改名。
-O 讓匿名使用者只能上傳檔案,下載檔案的功能會被取消。

匿名使用者權限除上表中的幾個參數外,一樣可以使用 -r、-o 等用來控制一般使用者權限的參數來控制匿名使用者。

匿名的 FTP 伺服器可以說是危險的開始,如果您沒有對匿名的使用者進行權限控制,在開於匿名 FTP 後,將會產生許多安全性的問題。最常見的就是您的 FTP 伺服器會被做為檔案交流的跳板或是病毒的集散地。例如,當您的匿名 FTP 站台允許使用者上傳、下載檔案時,一定會有人將自己的檔案上傳到您的伺服器中,並告訴其它人可以到您的伺服器中下載檔案。此時,您的伺服器莫名其妙就會變成別人的伺服器,任何人都可以用您的伺服器、網路頻寬來分享檔案。所以,在匿名模式下,最好還是在啟動 FTP 時加上參數 -r 以取消上傳的功能吧。

15.4 SmbFTPD

SmbFTPD 是筆者從 FreeBSD 5.4 的 FTP daemon 修改而成的軟體。FreeBSD 內建的 FTP 伺服器比較簡單,它不支援流量控制、不支援 SSL 加密、對中文檔名的支援也比較差。例如,您無法使用「許」、「功」等中文字。SMbFTPD 除了擁有原本 FreeBSD ftpd 所有功能外,還有更多使用者權限控制、支援特殊中文字、整合設定檔路徑及更多功能。另外,它也支援 SSL/TLS 加密的功能,該功能是由 BSDftpd-ssl 移植而來。

SmbFTPD 和一般 FTP daemon 最大的不同在於它使用類似 Samba 的資料夾權限設定,您可以設定讓 FTP 使用者登入後所看到的目錄跟使用 Windows 登入 Samba 時一模一樣。也就是說 FTP 登入的使用者對於資料夾的存取權限和使用 Windows 登入 Samba 一模一樣。

而您也可以將 SmbFTPD 做為一般 FTP daemon 使用,或同時支援 Samba 模式。FreeBSD 的 FTP daemon 本來效能就很好,修改過的 SmbFTPD 效能也十分優越,而且程式檔本身體積很小。

  • 效能優越。
  • 檔案很小 (約 70KB),佔用記憶體空間小。
  • 支援 SSL/TLS 加密。
  • 可以更改 port。
  • 針對使用者、群組做流量控制。
  • 針對使用者、群組設定 chroot 的路徑。
  • 類似 Samba 的資料夾權限,可以針對目錄設定使用者的讀寫權限。
  • 限制 FTP 指令的使用,如上傳、下載等。
  • 匿名使用者登入。
  • 諸多匿名使用者的權限控制。
  • 同時支援 Samba 權限控制模式及一般 FTP 模式。
  • 可以拒絕某些使用者 "ls" 出某一個 share 下的檔案。
  • 可以拒絕某些使用者下載檔案或是修改已存在的檔案。
  • 可以讓某個資料夾處於只能上傳的模式。

15.4.1 安裝 SmbFTPD

您可以到 http://www.twbsd.org/cht/smbftpd/index.php 下載最新版的 SmbFTPD,下載 SmbFTPD 後,解壓縮後進行該目錄。接著您就可以執行下列指令進行編譯:

# ./configure
# make

configure 指令會偵測您的系統,並依您的環境以決定編譯時所要加入的功能。例如,是否支援 IPv6、SSL/TLS、TCP Wrapper、或是 PAM 等。

編譯完成後,如果您支援 SSL/TLS,您必須有 SSL 憑證。如果您有安裝 Apache+SSL,您也可以和 Apache 共用它的憑證。如果您要產生憑證,您必須再執行下列指令以產生憑證。

# make cert

執行上述指令後,我們會先產生一個根憑證,再產生 FTP 所使用的憑證,接著再用我們產生的根憑證為 FTP 用的憑證簽章。全部都完成後,我們就可以使用下列指令來安裝:

# make install

和 FreeBSD 內建的 FTP 伺服器一樣,SmbFTPD 可以使用 inetd 或是獨立的 Daemon 方式啟動。如果您要使用 inetd 的方式啟動 SmbFTPD,請修改 /etc/inetd.conf 並加入下列內容:

ftp     stream  tcp     nowait  root    /usr/local/sbin/smbftpd smbftpd 

接下來請執行下列指令重跑 inetd:

# kill -1 `cat /var/run/inetd.pid`

如果您要以獨立的 Daemon 方式啟動 SmbFTPD,請先在 /etc/rc.conf 加入下列這一行,以在開機時啟動 SmbFTPD:

smbftpd_enable="Yes"

接下來就可以使用下列指令看看是否能啟動 SmbFTPD:

# /usr/local/etc/rc.d/smbftpd.sh start

如果您要停止 SmbFTPD:

# /usr/local/etc/rc.d/smbftpd.sh stop

SmbFTPD 是由 FreeBSD 的 FTP Deamon 改寫而成,所以有些設定和 FreeBSD 的 FTPD 相同。例如登入前及登入後的訊息可以經由設定 /etc/ftpwelcome/etc/ftpmotd 這二個檔來達成。另外,您也可以設定 /etc/hosts.allow  以限制連線來源。不同的是,不管是以獨立的 Daemon 或是 inetd 方式啟動 SmbFTPD,都可以使用 hosts.allow 的功能。

另外,SmbFTPD 將所有設定項目放在 /usr/local/etc/smbftpd/smbftpd.conf 中,您可以經由修改它來客製化您的伺服器。經由修改 smbftpd.conf,您可以設定使用不同的連接埠、更改伺服器名稱、設定最大連線數目、目錄權限、流量控制、SSL 設定等等。

下列幾個小節中,我們將介紹一些比較特別的設定,關於更多選項及其詳細的設定請參考 smbftpd.conf 一章中的說明。

15.4.2 限制登入帳號

我們可以設定限制某些帳號不可以使用 FTP 登入。使用者在登入 FTP 伺服器時,除了帳號密碼要符合外,還有幾個規則會拒絕該帳號登入:

  • 如果 /var/run/nologin 存在,則所有帳號都不可以登入。這個檔案可以用來暫時停止 FTP 服務。
  • 如果 smbftpd.conf 中 EmptyPasswdLogin 沒有設為 Yes,則使用者一定要有密碼才能登入,沒有密碼的使用者無法登入。
  • 使用者名稱及群組不可以出現在 smbftpd.conf 中的 NoLoginList 中。
  • 如果 smbftpd.conf 中 RequireValidShell 設為 Yes,則使用者所使用的 shell 必須要時合法的 shell。合法的 shell 會被定義在 /etc/shells 中。

我們可以看到在 smbftpd.conf 中有三個選項控制了使用者可以登入與否:EmptyPasswdLogin、NoLoginList、RequrieValidShell。 其中,NoLoginList 這個項目可以讓我們設定不允許登入的使用者清單。

我們在安裝了 SmbFTPD 後,即限制了某些系統使用者登入。我們來看一下該選項的內容:

NoLoginList root,toor,daemon,operator,lp,bin,tty,shutdown,kmem,...

這個項目中,每個使用者或群組都是使用逗號分開。如果一個項目的開頭是 "@" 表示群組名稱。例如 @guest 表示群組 guest 不可以登入系統。

15.4.3 限制上下傳頻寬

SmbFTPD 支援針對不同的使用者設定不同的上下傳頻寬限制。smbftpd.conf 中的 MaxDownloadRate 及 MaxUploadRate 控制了使用者上下傳的頻寬。

這二個選項可以重覆設定多次,以支援多個使用者及群組。MaxDownloadRate 及 MaxUploadRate 的格式如下:

MaxDownloadRate @group|user rate

其格式就是在選項後面加上群組或使用者名稱,最後再加上頻寬的限制,頻寬是以 KB/s 為單位。如果是群組名稱,其開頭必須加上 "@"。我們來看看下列的設定範例:

MaxDownloadRate @group100 100
MaxDownloadRate ftp 20
MaxDownloadRate @friends 1000

我們可以看到目前有三個控制下傳頻寬的項目。第一個項目表示群組為 group100 的使用者,其下載頻寬為 100 KB/s。第二個項目表示使用者 ftp 的下載頻寬為 20 KB/s。如果您支援匿名的 FTP,匿名 FTP 使用者對於系統而言實質帳號是 ftp,您只要針對 ftp 使用者做設定即可套用在匿名使用者 anonymous 及 ftp 上。

15.4.4 匿名的 FTP

我們平常在登入 FreeBSD 的 FTP 站台時,可以使用 anonymous 或是 ftp 這二個使用者登入,而且在登入時,任何密碼都可以通過。這種可以使用 anonymous 登入的 FTP 就叫作匿名 FTP。anonymous 及 ftp 這二個帳號是預設的匿名帳號,當使用者以匿名登入時,伺服器會將匿名帳號對映到系統內的真實使用者 ftp。所以,如果您要提供匿名的 FTP 服務,必須先增加一個真實的使用者帳號 ftp。

在新增了使用者 ftp 之後,我們還必須設定一下 smbftpd.conf 中關於匿名登入的項目。在 smbftpd 中,關於匿名 FTP 的項目有:AnonymousLogin、AnonymousOnly。

AnonymousLogin 控制了是否要啟用匿名使用者登入的功能。如果 AnonymousLogin 設為 Yes,表示可以使用匿名使用者登入。另外,AnonymousOnly 控制了在允許匿名使用者登入後,是否還要允許一般使用者登入。如果 AnonymousOnly 設為 Yes,則只有匿名使用者才可以登入,一般使用者都不可以登入哦。

請注意,雖然匿名使用者登入的帳號有二個:anonymous 及 ftp。但我們不管是在設定流量、目錄權限時,都只要設定真實使用者 "ftp" 帳號即可。

15.5 SmbFTPD 的目錄權限控制

15.5.1 何謂 SMB Mode

SmbFTPD 和一般的 FTP 伺服器最大的不同在於它的目錄權限管理方式。SmbFTPD 有二種目錄權限管理方式:一般模式及 SMB 模式。一般模式下,SmbFTPD 的行為就和一般的 FTP 伺服器一樣,使用者登入後可以看到所有的系統目錄。

SMB 模式比較特別,它會依照您的設定產生一個虛擬的根目錄,在根目錄中,只會顯示該使用者可以使用的資料夾。如果您使用過 Samba,SmbFTPD 的 SMB 模式就和 Samba 的共用資料夾設定類似。例如,您可以設定一個資料夾名為「音樂」,它的真實目錄是在 /home/mp3,並可以設定哪些使用者可以存取此資料夾、唯讀或可讀寫、是否可以下載檔案等等。

以下列資料夾設定檔為例:

[音樂]
path = /home/mp3
rw = alex
ro = @guest, john
disable_download = ftp

[upload]
path = /var/ftp
rw = ftp,alex
disable_ls = ftp
disable_download = ftp

上述的範例中,我們有二個共用資料夾:「音樂」及「upload」。其中,path 為該資料夾位於系統中的真實目錄。rw 為具有讀寫權限的使用者 清單,而 ro 為唯讀的使用者清單。在上述的設定下,使用者 alex 登入後,如果他在根目錄中下「ls」指令,他將看到下列內容:

ftp> ls /
200 PORT command successful.
150 Opening ASCII mode data connection for 'file list'.
dr-x------ 1 root users 512  Feb  3 21:40 音樂
dr-x------ 1 root users 2048 Aug 28 03:18 upload
226 Transfer complete.
ftp>

我們可以看到使用者 alex 登入後,他所看到的根目錄只有二個資料夾:「音樂」及「upload」。他的活動範圍也將只限於這二個資料夾,而無法進入系統中的其它目錄。 也就是說,如果 alex 輸入指令「cd /upload」則會進入「upload」這個資料夾中 (在系統中的真正路徑是 /var/ftp)。

SMB 模式的好處在於您可以將不同目錄集中設定成位於虛擬的根目錄中,並針對這些目錄設定不同使用者的權限。使用者權限可以是唯讀、可讀寫、禁止下載檔案、禁止看到目錄中的檔案內容,您甚至可以設定其一個資料夾為隱藏,「ls」時看不到該目錄,但卻可以「cd」進入目錄中。

SMB 模式是一個比較有彈性的目錄權限管理方式,您可以經由設定 SMB 模式達到多種不同的目錄權限控制。

我們還可以讓某些使用者使用一般模式,某些使用者使用 SMB 模式。這些設定十分容易,我們將在下一小節中做說明。

15.5.2 如何設定 SMB Mode

smbftpd.conf 中有三個選項和 SMB 模式的目錄權限管理有關:DefaultMode、ExceptionList、ShareConfPath。

DefaultMode 設定了預設的目錄權限管理模式為何,而 ExecptionList 為例外的清單。如果 DefaultMode 為 Normal,而 ExceptionList 中有使用者 alex,則除了 alex 會使用 SMB 模式外,其它使用者都會使用一般模式。反之,如果 DefaultMode 為 SMB,則 ExceptionList 中的使用者或群組將使用一般模式,其它的使用者會使用 SMB 模式的目錄權限管理方式。

ShareConfPath 設定了共用資料夾設定檔的位置,預設為 /usr/local/etc/smbftpd/smbftpd_share.conf。每一個以中括號括起來的區段都是一個資料夾的設定,下列即為資料夾設定的範例:

[音樂]
path = /home/mp3
rw = alex
ro = @guest, john
disable_download = ftp

每一個資料夾的區段都有下列這幾個關鍵字可用:

  • path:設定資料夾的實際路徑。
  • rw:設定具有讀寫權限的使用者及群組。
  • ro:設定只能進行唯讀的使用者及群組。
  • disable_download:設定禁止使用下載功能的使用者及群組。
  • disable_ls:設定在資料夾中 ls 看不到資料夾內容的使用者及群組。
  • disable_modify:設定不可以修改此資料夾中已經在的檔案之使用者及群組。在此項目中的使用者或群組無法更名、刪除、修改已存在的檔案或目錄,只能上傳及建立新目錄。但前提是使用者必須具有 rw 的權限。
  • browseable:設定此資料夾在列出根目錄的所有資料夾時是否要顯示。這個項目只能設定 Yes 或 No,如果設定為 No,則使用者 「ls /」時將看不到此資料夾,但可以使用「cd」指令進入該資料夾內。

除了 path 及 browseable 外,每一個項目可以加上使用者及群組的設定。如果是群組名稱,其開頭必須加上 "@" 符號。例如,上述範例中,@guest 表示 guest 群組。

您必須要特別注意的是,當您設定了使用者對於資料夾的權限是唯讀或可讀寫後,該使用者或群組在系統中的 UNIX 權限也必須要符合設定才會有作用。例如,如果一個資料夾對使用者 alex 設定為可讀寫,您必須確定 alex 對於資料夾在系統中的權限是可讀寫,如果不是,您必須使用 chmod 的指令改變該目錄的屬性。

另外,我們有一個特別的資料夾名稱「homes」,如果有 homes 這個資料夾的設定,則使用者登入後會看到一個資料夾名為「home」,該資料夾即為使用者的家目錄。家目錄預設是該使用者具有讀寫的權限,所以您無法設定 rw、ro 這二個參數。而且,您也無法設定 path,使用者家目錄的所在路徑是由系統密碼檔中的設定而決定。您只能設定 browseable、disable_ls、disable_modify、及 disable_download。

如果您的 SmbFTPD 支援匿名使用者,匿名使用者 anonymous 及 ftp 會被對映到真實的使用者 ftp,您只要針對 ftp 使用者做設定即會套用在匿名使用者上。

在修改了 smbftpd_share.conf 後,您必須重新啟動 SmbFTPD 後設定才會生效。

15.5.3 設定範例

我們列舉幾個設定的範例讓您參考。

範例一:

我們設定一個資料夾名為「public」,其真實路徑是 /home/public。只有 wheel 群組的使用者具有讀寫權限,而匿名使用者及 guest 群組只具有唯讀的權限。

[public]
path = /home/public
rw = @wheel
ro = @guest, ftp

範例二:

我們設定一個資料夾名為「private」,其真實路徑是 /home/movie。只有使用者 alex 具有讀寫的權限,而 friend 群組只能唯讀,另外,guest 群組的使用者無法下載該資料夾中的任何檔案。

[public]
path = /home/movie
rw = alex
ro = @guest, @friend
disable_download = @guest

範例三:

我們設定一個資料夾名為「upload」,其真實路徑是 /var/ftp/pub。只有使用者 alex 具有完整的讀寫權限,匿名使用者無法下載檔案、看不到目錄中的檔案、無法修改目錄中的檔案、只能上傳檔案。

[upload]
path = /var/ftp/pub
rw = alex,ftp
disable_download = ftp
disable_modify = ftp
disable_ls = ftp

15.5.4 chroot

我們除了可以使用 SMB 模式以創造出虛擬的根目錄外,SmbFTPD 還支援 chroot 的功能。

所謂的 chroot 就是將某一個目錄變成使用者看到的根目錄。例如,我們讓使用者 alex 登入後,將 /home/alex 變成根目錄。則 alex 在使用指令「cd /」時,還是會停留在 /home/alex。如果他使用指令「pwd」查看目前所在路徑,則會顯示 /。如此一來,我們就可以確保使用者不會到處亂跑,進入一些不該進入的地方。這個功能對於提升 FTP 的安全性有莫大的助益。

當一個使用者同時屬於 SMB 模式及 chroot 時,我們會使用 chroot 而非 SMB 模式。

設定 chroot 的方法很簡單,只要修改 smbftpd.conf,將使用者加入 ChrootSet 即可。ChrootSet 選項的設定是以使用者、群組的基礎,我們可以同時設定多個 ChrootSet。以下是幾個設定範例:

ChrootSet ftp /var/spool/ftp
ChrootSet @ftpgroup ~
ChrootSet @webusers ~/public_html

上述範例中的第一行是設定所有匿名的使用者都以 /var/spool/ftp 為根目錄。第二行表示只要是群組為 ftpgroup 的使用者都以自己的家目錄為根目錄。而第三行表示只要是群組為 webusers 的使用者都以自己家目錄下的 public_html 為根目錄。

在 ChrootSet 的選項中,群組名稱開頭都會有 "@" 符號。而目錄名稱 "~" 表示是使用者的家目錄。

另外,如果只有一個 "@" 符號,表示所有使用者。下列範例即表示所有的使用者都以自己的家目錄為根目錄:

ChrootSet @ ~

只要我們善用 chroot 的功能,就可以加強保護系統其它目錄,讓沒有權利的使用者不可以進入系統目錄中。

15.6 SSL/TLS 連線加密

15.6.1 設定啟用 SSL/TLS

當我們使用網路服務時,經由網路傳送的資料都有可能被他人攔截竊聽。簡單的說,當您從網頁上輸入帳號密碼時,如果有人在您所使用的電腦和伺服器之間攔截,就可以輕易的從網路封包中竊聽到您所輸入的資料。

SSL 的加密方式是由伺服器端提供了一組加解密用的金鑰,在伺服器端所使用的是私密金鑰 (Private key),而客戶端所使用的是公開金鑰 (Public key)。在連線建立後,HTTP 伺服器會將公開金鑰傳給客戶端使用。公開金鑰加密過的資料只能由私密金鑰解密,在客戶端要送出資料之前,會先使用公開金鑰進行加密的動作,而伺服器收到資料後,會使用私密金鑰進行解密。

如果您的系統有安裝 OpenSSL,則 SmbFTPD 安裝後即支援 SSL 的功能。在下列 configure 的訊息中,「Check SSL support」為「YES」表示有支援 SSL。

# ./configure
opie..................  [YES]
libutil.h.............  [YES]
O_EXLOCK..............  [YES]
FD_COPY...............  [YES]
TCP Wrapper...........  [YES]
Have printflike.......  [YES]
pw_expire.............  [YES]
bsd glob..............  [YES]
MD5File...............  [YES]
user_from_uid.........  [YES]
Shadow passowd........  [NO]
Linux sendfile........  [NO]
FreeBSD sendfile......  [YES]
Use PAM...............  [YES]
Check setproctitle....  [YES]
Check fgetln..........  [YES]
Check sin_len.........  [YES]
Check IPv6 support....  [YES]
Check SSL support.....  [YES]

Finished configure.

在執行完 configure 及 make 之後,即完成編譯。在安裝前,我們會執行「make cert」以產生 SSL 憑證。最後「make install」會將 SSL 憑證安裝在 /usr/local/etc/smbftpd/ 目錄中。

在啟動 SmbFTPD 之前,您必須先設定 smbftpd.conf 以啟用 SSL 功能。smbftpd.conf 中所有 SSL 相關的選項說明請參考下一章的說明,我們這裡只說明幾個常用的項目。

首先是「SecurityPolicy」,這個項目用來控制是否要啟用 SSL 的功能。「secure」 為只允許使用 SSL 連線,「nosecure」 為不使用 SSL 連線,「both」 為二種連線都支援,預設為 「both」。

「NormalUserMustSecure」用來控制是否要強制一般使用者使用 SSL 連線。因為 SSL 主要是用來保護密碼、個人資料,如果您強制將「NormalUserMustSecure」設為 Yes,則一般使用者一定要使用 SSL 才能登入。

「AnonymDisableSecure」用以控制匿名使用者是否要使用 SSL。當 AnonymDisableSecure 設為「Yes」時,系統將不允許匿名的使用者使用加密的連線。既然 SSL/TLS 的目的是避免使用者資料在網路上流傳,而匿名使用者是任何人都可以使用,保護匿名使用者的資料似乎比較不需要。所以您可以將這個選項設為「No」,以避免匿名使用者也使用加密連線登入,徒然耗費 CPU 的資源。

15.6.2 安裝支援 SSL/TLS 的客戶端軟體

在支援 SSL/TLS 的客戶端軟體方面,如果您使用 Windows,建議您使用 Filezilla (http://filezilla.sourceforge.net/)。Filezilla 支援 SSL 及 TLS,而且 FTP client 的功能相當完整。它是一套免費、持續更新中的軟體。

如果您使用 FreeBSD,可以使用下列指令安裝 ftp-tls:

# cd /usr/ports/ftp/ftp-tls
# make install

接下來您就可以使用下列指令連到您的 FTP Server 了:

# /usr/bin/ftp-tls 192.168.0.1

15.7 smbftpd.conf

15.7.1 系統區段

ServerName 定義伺服器名稱

這個選項可以用來定義您的伺服器名稱,當使用者登入後將看到:

Connected to localhost.com.
220 Server Name FTP server (SmbFTPD Ver 0.9) ready.
Name (localhost:alex):

如果您沒有設定 ServerName,則 SmbFTPD 將顯示系統的 Hostname。

ServerName "Server Name"

ListenOnAddress 設定要提供服務的 IP

當使用 -D 模式 (standalone) 啟動 FTP 時,您可以指定只接受連到這個位址的連線。例如,假設您有二張網路卡,一個 IP 是 172.16.1.1,另一個是 61.62.63.64,您可以設定 ListenOnAddress 172.16.1.1 以表示只接受連到這個 IP 的連線。

如果您要接受所有連線,則請移除這個選項。

ListenOnAddress 192.168.0.1

Port 設定連接埠

當使用 -D 模式 (standalone) 啟動 FTP 時,您可以指定 SmbFTPD 所要使用的 Port。一般的 FTP port 為 21,您也可以使用 ftp 這個字串表示,系統會自動去 /etc/service 中查到相對的 port。

Port 21

Umask 設定新建檔案的權限

當使用者建立檔案或目錄時,所要使用的 umask。例如,您想要讓使用者新增檔案時的權限為 644,則設 umask 為 022。詳細關於 umask 的設定請 man 2 umask。這個選項的值必須為 8 進位的數字,如 022、027 等。

Umask 022

PidFile 設定存放 Process ID 的檔案

這是您要存放 smbftpd pid 檔的地方,當使用 daemon 模式時,我們會將 smbftpd 的 process id 寫到這個檔案中。

PidFile /var/run/smbftpd.pid

DebugMode 啟用除錯模式

是否要用 syslog 記錄更多除錯用的訊息。這個選項的值可以是 Yes 或 No,預設值為 No。

DebugMode No

LogCommand 記錄使用者執行過的指令

是否要使用 syslog 的 LOG_FTP 記錄使用者執行過的 FTP 指令。如果您將這個指令設為 Yes, 則使用者所執行的 retrieve(get)、store(put)、append、delete、mkdir、rmdir、rename 等都會被記錄下來,並用記錄該指令的檔名參數。在 FreeBSD 中,syslogd 會將這些記錄在 /var/log/xferlog 中。 這個選項的值可以是 Yes 或 No,預設值為 No。

LogCommand No

DoWtmpLog 記錄登入記錄

是否要將 ftp 連線記錄在 /var/log/wtmp 中。這個選項的值可以是 Yes 或 No,預設值為 No。

DoWtmpLog No

DisableEPSV 停用指令 EPSV

是否要停用 EPSV 這個指令。如果您的伺服器位於一些舊的防火牆後面,而一直無法連線,您可以設著停用 EPSV。這個選項的值可以是 Yes 或 No,預設值為 No。

DisableEPSV No

ShowSymlink 是否要顯示符號連結檔

當 ShowSymlink 為 No ,我們在使用者 ls 時不會列出 symbolic link 的檔案或目錄。這個選項的值可以是 Yes 或 No,預設值為 No。

ShowSymlink No

RestrictedPorts 禁止使用小於 1024 的埠號

當這個選項設為 No 時,smbftpd 將不檢查限制使用者使用的連結埠。我們預設限制使用者在使用 PORT 命令時,只能使用 unprivileged ports (> 1024),不過這樣將違反 FTP protocol。

這個選項的值可以是 Yes 或 No,預設值為 No。

RestrictedPorts Yes

RestrictedDataPorts 限制資料連線所使用的埠號

這個指令設成 NO 時,smbftpd 將只使用 port 定義範圍在 IP_PORTRANGE_DEFAULT 的 port,而非 IP_PORTRANGE_HIGH 的 port。這個選項對於某些特殊的防火牆設定蠻有用的。請 man 4 ip 以得到更多資訊。

這個選項的值可以是 Yes 或 No,預設值為 No。

RestrictedDataPorts Yes

 

15.7.2 使用者登入控制

MaxConnection 設定最多連線數目

這個選項可以讓您控制最多同時連線的數量。如果 MaxConnection 大於 0,則在連線數目到達您所設定的值時,使用者就無法再登入。如果值為 0,則表示不做任何限制。

MaxConnection 30

RequireValidShell 登入的使用者是否要有合法 Sheel

當 RequireValidShell 為 Yes 時,使用者必須有合法的 shell 才可以登入。合法的 shell 是以 getusershell(3) 這個函數取得,大多數的作業系統中,合法的 shell 都被定義在 /etc/shells 中。這個選項的值可以是 Yes 或 No,預設值為 No。

RequireValidShell No

EmptyPasswdLogin 是否允許空白密碼

是否允許空密碼的使用者登入。

這個選項的值可以是 Yes 或 No,預設值為 No。

EmptyPasswdLogin No

NoLoginList 設定禁止登入的使用者清單

設定您不想讓其登入的使用者,在 NoLoginList 中的使用者或群組不可以登入。

NoLoginList 的參數可以是使用者或是群組,如果是設定群組,請在群組名稱前加上 @。當要設定多個使用者或群組時,請使用逗號 , 分開。 匿名使用者「ftp」及「anonumous」會被對映到真實的使用者「ftp」,如果您要設定的是匿名的使用者「ftp」及「anonymous」,請使用「ftp」這個使用者。

例如:

NoLoginList user1,@group1,user2

表示不允許使用者 user1, user2 及群組 group1 登入。

NoLoginList user1,user2,@group1,@group2

TimeOut 設定連線逾時秒數

當使用者超過這個時間沒有任何動作時,則中斷連線。單位為秒。

TimeOut 900

MaxTimeOut 設定最大連線逾時秒數

使用者可以自行設定 timeout 的時間,但我們可以在這裡設定最長 timeout 的時間。預設是 2 小時。

MaxTimeOut 7200

 

15.7.3 FTP 目錄權限控制

DefaultMode 預設的權限控制模式

SmbFTPD 有二種模式,一個是 SMB mode,另一個是 Normal mode。在 SMB 模式中,SmbFTPD 會使用類似 Samba 的共用資料夾權限設定,系統會讀取 ShareConfPath 中的使用者目錄權限控制來設定他對於資料夾的存取權限。而 Normal 模式中,SmbFTPD 就像一般 FTP Daemon 一樣。

這個選項的值可以是 Normal 或 SMB,預設為 Normal。

DefaultMode Normal

ExceptionList 設定不使用預設權限控制模式的使用者

您可以在 ExceptionList 中設定不要使用 DefaultMode 的使用者及群組。例如,您如果希望所有人都使用 SMB 模式,但群組 wheel 要使用一般模式,則請將 DefaultMode 設為 SMB,再在 ExceptionList 中設定 @wheel 即可。

ExceptionList 的參數可以是使用者或群組,如果是群組的話,請在群組名稱前加上 @。例如:

ExceptionList user1,user2,@group1,@group2

ShareConfPath 設定資料夾權限設定檔位置

設定資料夾設定的 smbftpd_share.conf 所在路徑。如果您設定 DefaultMode 為 SMB,或是 DefaultMode 為 Normal 但有 ExceptionList,則一定要指定 smbftpd_share.conf 的所在路徑。

我們會檢查 smbftpd_share.conf 中的下列關鍵字設定:

  • path:資料夾的路徑。
  • rw:可以有寫入權限的使用者或群組。
  • ro:可以有唯讀權限的使用者或群組。
  • browseable:資料夾是否要設為隱藏。若設為 no,則使用者在根目錄 ls 時,將看不到該資料夾,但依然可以 cd 到該資料夾中。
  • disable_download:設定不可以下載的使用者。若使用者可以讀取該資料夾內容,您還可以設定讓它無法執行下載的動作。
  • disable_ls:設定在資料夾中執行 ls 時,不可以看到資料夾內容的使用者及群組。
  • disable_modify:設定不可以修改該資料夾中的檔案或目錄的使用者及群組。如果該使用者具有讀寫的權限,但又在此列表中,則該使用者只能上傳檔案或是建立新的目錄,而無法執行 rename、delete、rmdir、chmod 等指令。

範例一:

這個範例是有一個資料夾名為 public,其所在目錄為 /home/public,在 samba 群組中的使用者可以有唯讀的權限,而 root 可以有寫入的權限。

[public]
	path = /home/public
	rw = root
	ro = @samba

範例二:

資料夾名稱為 private,只有 wheel 群組的人可以寫入,而且這個資料夾是隱藏的,wheel 群組的人登入後使用 ls 看不到這個資料夾,但是可以 cd 進去資料夾中。

[private]
	path = /root/ftp
	rw = @wheel
	browseable = no

範例三:

資料夾名稱為 upload, 使用者「ftp」及「anonymous」只能上傳檔案或建立新目錄,但是無法看到該資料夾中的內容,也不可以下載或是修改現有的檔案。但在使用者「wheel」群組中的使用者可以具有全部的讀寫權限。

[upload]
	path=/home/upload"
	rw=ftp,@wheel
	disable_ls=ftp
	disable_modify=ftp
	disable_download=ftp

請注意,匿名使用者「ftp」及「anonumous」會被對映到真實的使用者「ftp」,如果您要設定的是匿名的使用者「ftp」及「anonymous」,請使用「ftp」這個使用者。

如果您設定某個使用者對於某個資料夾有寫入的權限,但該使用者卻無法寫入,因為除了 SmbFTPD 的權限控制外,您還必須對資料夾的 UNIX 權限做一些設定,讓該資料夾的 UNIX 權限允許該使用者寫入。

ShareConfPath /some/where/smbftpd_share.conf

ChrootSet 設定使用 chroot 的使用者

在這個列表中的使用者或群組會被 chroot 到您所指定的路徑中,也就是讓它將您所設定的路徑做為根目錄,使用者無法到該路徑以外的地方。如果有需要,您可以同時設定多條 ChrootSet 的規則。

這個參數的第一個欄位是使用者名稱或群組,如果在名稱之前加上 @,表示是群組,所有在該群組中的使用者都會被套用到群組的設定中。而另一個特別的用法是只有一個 @ 符號,表示所有使用者都會被套用到這個設定中。

請注意,被設定為 chroot 的使用者就算 DefaultMode 被歸類為 SMB mdoe 也一定會被強制使用 Normal mode。

這裡有幾個設定的範例:

範例一:

使用者 ftp 登入時,將它 chroot 到 /var/spool/ftp

ChrootSet ftp /var/spool/ftp

範例二:

所有群組為 ftpgroup 的使用者都使用他們的家目錄 (home) 做為根目錄。例如,使用者 alex 的家目錄為 /home/alex,則其根目錄為 /home/alex,而 jack 則是 /home/jack。我們以 ~ 符號表示家目錄,系統會自動轉換為真正的路徑。

ChrootSet @ftpgroup ~

範例三:

所有 webusers 這個群組的人都以其家目錄下的 public_html 為根目錄。這對於您要開放 FTP 給某些使用者,但又不想讓他們去存取系統中其它路徑時十分有用。

ChrootSet @webusers ~/public_html

範例四:

所有使用者都必須以其家目錄為根目錄。

ChrootSet @ ~
ChrootSet @webusers ~/public_html
ChrootSet @ ~

 

15.7.4 匿名使用者控制

AnonymousLogin 是否支援匿名使用者登入

是否允許匿名使用者登入。匿名的使用者帳號為 ftp 或 anonymous。如果您要允許匿名使用者登入,您必須先新增一個 ftp 的系統使用者。

這個選項的值可以是 Yes 或 No,預設值為 No。

AnonymousLogin No

AnonymousOnly 是否只允許匿名使用者登入

是否只允許匿名使用者登入。若設為 Yes,則一般使用者無法登入。

AnonymousOnly No

 

15.7.5 檔案傳輸控制

TransferLog 設定上下傳記錄檔位置

這個選項用來設定使用者上傳及下載的檔案記錄。您可以設定當使用者下載或上傳檔案時,將它所上傳或下載的檔名、傳輸時間、大小等資料寫在這個檔案中。

TransferLog /var/run/smbftpd.log

MaxDownloadRate 設定最大下傳速度

您可以針對使用者及群組設定最大的下載頻寬。頻寬 rate 的單為是 KB/s。您也可以設定多條 MaxDownloadRate 規則。

這個選項的第一個參數可以是使用者或群組,如果是群組,則名稱開頭必須加上 @。而若只有一個 @ 符號,表示所有使用者都要套用到該規則。

MaxDownloadRate @group100 100
MaxDownloadRate ftp 20
MaxDownloadRate @friends 1000

MaxUploadRate 設定最大上傳速度

您可以針對使用者及群組設定最大的上傳頻寬。頻寬 rate 的單為是 KB/s。您也可以設定多條 MaxDownloadRate 規則。

這個選項的第一個參數可以是使用者或群組,如果是群組,則名稱開頭必須加上 @。而若只有一個 @ 符號,表示所有使用者都要套用到該規則。

MaxUploadRate @group100 100
MaxUploadRate ftp 20
MaxUploadRate @friends 1000

 

15.7.6 SSL/TLS 控制

SecurityPolicy 設定是否使用 SSL/TLS

這個選項可以讓您設定是否要啟用 SSL/TLS 加密。您可以 強制一定要使用加密連線,或是關閉加密功能,或是同時允許加密及非加密模式。各種模式的說明如下:

  • secure:只允許加密連線。
  • nosecure:只允許非加密連線。
  • both:同時允許加密及非加密連線。

您可以將 SecurityPolicy 設為 secure、nosecure、或 both,預設值是同時允許加密及非加密連線。

SecurityPolicy both

EncryptionType 設定加密類型

當您要使用加密連線時,您可以選擇要支援哪一種加密模式。SmbFTPD 支援二種模式:SSL 及 TLS,您可以使用下列設定值以選擇要使用另一種模式:

  • TLS:只使用 RFC 2228 所定義的 FTP-TLS 模式。
  • SSL:只支援 FTP-SSL 模式。
  • Both:同時支援 SSL 及 TLS。

預設值是同時支援 SSL 及 TLS。

EncryptionType both

NormalUserMustSecure 強制一般使用者使用加密連線

當 NormalUserMustSecure 設為「Yes」時,表示一般使用者登入時一定要使用加密的連線,否則無法登入。

我們在 FTP 服務中使用 SSL/TLS 的目的是為了避免使用者的機密資料在網路上以明碼流傳,為了強制所有使用者都使用比較安全的模式連線,您可以將這個選項設為「Yes」。

NormalUserMustSecure No

AnonymDisableSecure 設定不允許匿名使用者使用加密連線

當 AnonymDisableSecure 設為「Yes」時,系統將不允許匿名的使用者使用加密的連線。

既然 SSL/TLS 的目的是避免使用者資料在網路上流傳,而匿名使用者是任何人都可以使用,保護匿名使用者的資料似乎比較不需要。所以您可以將這個選項設為「No」,以避免匿名使用者也使用加密連線登入,徒然耗費 CPU 的資源。

AnonymDisableSecure No

SSLCertFile 設定公開金鑰位置

設定所要使用的憑證,這個憑證會被送到客戶端做為加密用。如果您沒有設定這個選項,預設會使用 /usr/local/etc/smbftpd/ssl.crt/server.crt

您也可以和 Apache+SSL 共用憑證,Apache 的 SSL 憑證通常位於 /usr/local/etc/apache2/ssl.crt/server.crt

SSLCertFile /usr/local/etc/smbftpd/ssl.crt/server.crt

SSLKeyFile 設定私密金鑰位置

這個選項是用來設定您上述設定的憑證所對映的 private key。這個 private key 和憑證是成對的,預設是在 /usr/local/etc/smbftpd/ssl.key/server.key

如果您使用 Apache SSL 憑證,則這裡也必須設定使用 Apache 的 key,通常位於 /usr/local/etc/apache2/ssl.key/server.key

SSLKeyFile /usr/local/etc/smbftpd/ssl.key/server.key

SSLDebugMode 是否啟用 SSL 的除錯模式

設定是否要啟動 SSL 的除錯模式,當設為「Yes」時,您還必須要設定記錄檔位置 SSLDebugLog。

SSLDebugMode No

SSLDebugLog 設定除錯記錄檔位置

設定 SSL 除錯模式的記錄檔要放在什麼地方。

SSLDebugLog /var/log/smbftpd-ssl.log

 

Top Ths file was last modified: 2007 February 25 10:54:04.

Copyright © 2002-2017 Wang, Chun-Pin from www.twbsd.org. All rights reserved.