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 tart
如果您要停止 FTPD 服务,则使用下列指令:
# /usr/local/etc/rc.d/ftpd.sh stop
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 时加上下列几个参数:
#!/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 |
上述的参数必须在启动 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 的设定是以使用者、群组的基础,以下是几个设定范例:
#!/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 |
上述范例中的第一行是设定使用者 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 服务时可以使用的参数:
#!/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 |
匿名使用者权限除上表中的几个参数外,一样可以使用 -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 并加入下列内容:
#!/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 |
接下来请执行下列指令重跑 inetd:
# kill -1 `cat /var/run/inetd.pid`
如果您要以独立的 Daemon 方式启动 SmbFTPD,请先在 /etc/rc.conf 加入下列这一行,以在开机时启动 SmbFTPD:
#!/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 |
接下来就可以使用下列指令看看是否能启动 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 后,即限制了某些系统使用者登入。我们来看一下该选项的内容:
#!/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 |
这个项目中,每个使用者或群组都是使用逗号分开。如果一个项目的开头是 "@" 表示群组名称。例如 @guest 表示群组 guest 不可以登入系统。
15.4.3 限制上下传频宽
SmbFTPD 支持针对不同的使用者设定不同的上下传频宽限制。smbftpd.conf 中的 MaxDownloadRate 及 MaxUploadRate 控制了使用者上下传的频宽。
这二个选项可以重复设定多次,以支持多个使用者及群组。MaxDownloadRate 及 MaxUploadRate 的格式如下:
MaxDownloadRate @group|user rate
其格式就是在选项后面加上群组或使用者名称,最后再加上频宽的限制,频宽是以 KB/s 为单位。如果是群组名称,其开头必须加上 "@"。我们来看看下列的设定范例:
#!/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 |
我们可以看到目前有三个控制下传频宽的项目。第一个项目表示群组为 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,并可以设定哪些使用者可以存取此数据夹、只读或可擦写、是否可以下载档案等等。
以下列数据夹设定文件为例:
#!/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 |
上述的范例中,我们有二个共享数据夹:「音乐」及「upload」。其中,path 为该数据夹位于系统中的真实目录。rw 为具有读写权限的使用者 清单,而 ro 为只读的使用者清单。在上述的设定下,使用者 alex 登入后,如果他在根目录中下「ls」指令,他将看到下列内容:
#!/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 |
我们可以看到使用者 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。每一个以中括号括起来的区段都是一个数据夹的设定,下列即为数据夹设定的范例:
#!/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 |
每一个资料夹的区段都有下列这几个关键词可用:
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 群组只具有只读的权限。
Welcome to My FTP Server. This is a welcome message Nice to see you. |
范例二:
我们设定一个数据夹名为「private」,其真实路径是 /home/movie。只有使用者 alex 具有读写的权限,而 friend 群组只能只读,另外,guest 群组的使用者无法下载该数据夹中的任何档案。
Welcome to My FTP Server. This is a welcome message Nice to see you. |
范例三:
我们设定一个数据夹名为「upload」,其真实路径是 /var/ftp/pub。只有使用者 alex 具有完整的读写权限,匿名使用者无法下载档案、看不到目录中的档案、无法修改目录中的档案、只能上传档案。
Welcome to My FTP Server. This is a welcome message Nice to see you. |
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。以下是几个设定范例:
Welcome to My FTP Server. This is a welcome message Nice to see you. |
上述范例中的第一行是设定所有匿名的使用者都以 /var/spool/ftp 为根目录。第二行表示只要是群组为 ftpgroup 的使用者都以自己的家目录为根目录。而第三行表示只要是群组为 webusers 的使用者都以自己家目录下的 public_html 为根目录。
在 ChrootSet 的选项中,群组名称开头都会有 "@" 符号。而目录名称 "~" 表示是使用者的家目录。
另外,如果只有一个 "@" 符号,表示所有使用者。下列范例即表示所有的使用者都以自己的家目录为根目录:
Welcome to My FTP Server. This is a welcome message Nice to see you. |
只要我们善用 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。
Welcome to My FTP Server. This is a welcome message Nice to see you. |
ListenOnAddress 设定要提供服务的 IP
当使用 -D 模式 (standalone) 启动 FTP 时,您可以指定只接受连到这个地址的联机。例如,假设您有二张网络卡,一个 IP 是 172.16.1.1,另一个是 61.62.63.64,您可以设定 ListenOnAddress 172.16.1.1 以表示只接受连到这个 IP 的联机。
如果您要接受所有联机,则请移除这个选项。
Welcome to My FTP Server. This is a welcome message Nice to see you. |
Port 设定连接埠
当使用 -D 模式 (standalone) 启动 FTP 时,您可以指定 SmbFTPD 所要使用的 Port。一般的 FTP port 为 21,您也可以使用 ftp 这个字符串表示,系统会自动去 /etc/service 中查到相对的 port。
Welcome to My FTP Server. This is a welcome message Nice to see you. |
Umask 设定新建档案的权限
当使用者建立档案或目录时,所要使用的 umask。例如,您想要让使用者新增档案时的权限为 644,则设 umask 为 022。详细关于 umask 的设定请 man 2 umask。这个选项的值必须为 8 进位的数字,如 022、027 等。
Welcome to My FTP Server. This is a welcome message Nice to see you. |
PidFile 设定存放 Process ID 的档案
这是您要存放 smbftpd pid 档的地方,当使用 daemon 模式时,我们会将 smbftpd 的 process id 写到这个档案中。
Welcome to My FTP Server. This is a welcome message Nice to see you. |
DebugMode 启用除错模式
是否要用 syslog 记录更多除错用的讯息。这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
LogCommand 记录使用者执行过的指令
是否要使用 syslog 的 LOG_FTP 记录使用者执行过的 FTP 指令。如果您将这个指令设为 Yes, 则使用者所执行的 retrieve(get)、store(put)、append、delete、mkdir、rmdir、rename 等都会被记录下来,并用记录该指令的文件名参数。在 FreeBSD 中,syslogd 会将这些记录在 /var/log/xferlog 中。 这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
DoWtmpLog 记录登入记录
是否要将 ftp 联机记录在 /var/log/wtmp 中。这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
DisableEPSV 停用指令 EPSV
是否要停用 EPSV 这个指令。如果您的服务器位于一些旧的防火墙后面,而一直无法联机,您可以设着停用 EPSV。这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
ShowSymlink 是否要显示符号连结文件
当 ShowSymlink 为 No ,我们在使用者 ls 时不会列出 symbolic link 的档案或目录。这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
RestrictedPorts 禁止使用小于 1024 的埠号
当这个选项设为 No 时,smbftpd 将不检查限制使用者使用的连结埠。我们预设限制使用者在使用 PORT 命令时,只能使用 unprivileged ports (> 1024),不过这样将违反 FTP protocol。
这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
RestrictedDataPorts 限制数据联机所使用的端口号
这个指令设成 NO 时,smbftpd 将只使用 port 定义范围在 IP_PORTRANGE_DEFAULT 的 port,而非 IP_PORTRANGE_HIGH 的 port。这个选项对于某些特殊的防火墙设定蛮有用的。请 man 4 ip 以得到更多信息。
这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
15.7.2 使用者登入控制
MaxConnection 设定最多联机数目
这个选项可以让您控制最多同时联机的数量。如果 MaxConnection 大于 0,则在联机数目到达您所设定的值时,使用者就无法再登入。如果值为 0,则表示不做任何限制。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
RequireValidShell 登入的使用者是否要有合法 Sheel
当 RequireValidShell 为 Yes 时,使用者必须有合法的 shell 才可以登入。合法的 shell 是以 getusershell(3) 这个函数取得,大多数的操作系统中,合法的 shell 都被定义在 /etc/shells 中。这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
EmptyPasswdLogin 是否允许空白密码
是否允许空密码的使用者登入。
这个选项的值可以是 Yes 或 No,默认值为 No。
参数 |
是否只能在 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 加上连接埠号以改变预设连接埠。 |
NoLoginList 设定禁止登入的使用者清单
设定您不想让其登入的使用者,在 NoLoginList 中的使用者或群组不可以登入。
NoLoginList 的参数可以是使用者或是群组,如果是设定群组,请在群组名称前加上 @。当要设定多个使用者或群组时,请使用逗号 , 分开。 匿名使用者「ftp」及「anonumous」会被对映到真实的使用者「ftp」,如果您要设定的是匿名的使用者「ftp」及「anonymous」,请使用「ftp」这个使用者。
例如:
NoLoginList user1,@group1,user2
表示不允许使用者 user1, user2 及群组 group1 登入。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
TimeOut 设定联机逾时秒数
当使用者超过这个时间没有任何动作时,则中断联机。单位为秒。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
MaxTimeOut 设定最大联机逾时秒数
使用者可以自行设定 timeout 的时间,但我们可以在这里设定最长 timeout 的时间。预设是 2 小时。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
15.7.3 FTP 目录权限控制
DefaultMode 预设的权限控制模式
SmbFTPD 有二种模式,一个是 SMB mode,另一个是 Normal mode。在 SMB 模式中,SmbFTPD 会使用类似 Samba 的共享数据夹权限设定,系统会读取 ShareConfPath 中的使用者目录权限控制来设定他对于数据夹的存取权限。而 Normal 模式中,SmbFTPD 就像一般 FTP Daemon 一样。
这个选项的值可以是 Normal 或 SMB,预设为 Normal。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
ExceptionList 设定不使用预设权限控制模式的使用者
您可以在 ExceptionList 中设定不要使用 DefaultMode 的使用者及群组。例如,您如果希望所有人都使用 SMB 模式,但群组 wheel 要使用一般模式,则请将 DefaultMode 设为 SMB,再在 ExceptionList 中设定 @wheel 即可。
ExceptionList 的参数可以是使用者或群组,如果是群组的话,请在群组名称前加上 @。例如:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
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 权限允许该使用者写入。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
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 @ ~
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
15.7.4 匿名使用者控制
AnonymousLogin 是否支持匿名使用者登入
是否允许匿名使用者登入。匿名的使用者账号为 ftp 或 anonymous。如果您要允许匿名使用者登入,您必须先新增一个 ftp 的系统使用者。
这个选项的值可以是 Yes 或 No,默认值为 No。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
AnonymousOnly 是否只允许匿名使用者登入
是否只允许匿名使用者登入。若设为 Yes,则一般使用者无法登入。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
15.7.5 档案传输控制
TransferLog 设定上下传记录文件位置
这个选项用来设定使用者上传及下载的档案记录。您可以设定当使用者下载或上传档案时,将它所上传或下载的档名、传输时间、大小等数据写在这个档案中。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d |
MaxDownloadRate 设定最大下传速度
您可以针对使用者及群组设定最大的下载频宽。频宽 rate 的单为是 KB/s。您也可以设定多条 MaxDownloadRate 规则。
这个选项的第一个参数可以是使用者或群组,如果是群组,则名称开头必须加上 @。而若只有一个 @ 符号,表示所有使用者都要套用到该规则。
#!/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 |
MaxUploadRate 设定最大上传速度
您可以针对使用者及群组设定最大的上传频宽。频宽 rate 的单为是 KB/s。您也可以设定多条 MaxDownloadRate 规则。
这个选项的第一个参数可以是使用者或群组,如果是群组,则名称开头必须加上 @。而若只有一个 @ 符号,表示所有使用者都要套用到该规则。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |
15.7.6 SSL/TLS 控制
SecurityPolicy 设定是否使用 SSL/TLS
这个选项可以让您设定是否要启用 SSL/TLS 加密。您可以 强制一定要使用加密联机,或是关闭加密功能,或是同时允许加密及非加密模式。各种模式的说明如下:
secure:只允许加密联机。 nosecure:只允许非加密联机。 both:同时允许加密及非加密联机。
您可以将 SecurityPolicy 设为 secure、nosecure、或 both,默认值是同时允许加密及非加密联机。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |
EncryptionType 设定加密类型
当您要使用加密联机时,您可以选择要支持哪一种加密模式。SmbFTPD 支持二种模式:SSL 及 TLS,您可以使用下列设定值以选择要使用另一种模式:
TLS:只使用 RFC 2228 所定义的 FTP-TLS 模式。 SSL:只支持 FTP-SSL 模式。 Both:同时支持 SSL 及 TLS。
默认值是同时支持 SSL 及 TLS。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |
NormalUserMustSecure 强制一般使用者使用加密联机
当 NormalUserMustSecure 设为「Yes」时,表示一般使用者登入时一定要使用加密的联机,否则无法登入。
我们在 FTP 服务中使用 SSL/TLS 的目的是为了避免使用者的机密数据在网络上以明码流传,为了强制所有使用者都使用比较安全的模式联机,您可以将这个选项设为「Yes」。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |
AnonymDisableSecure 设定不允许匿名使用者使用加密联机
当 AnonymDisableSecure 设为「Yes」时,系统将不允许匿名的使用者使用加密的联机。
既然 SSL/TLS 的目的是避免使用者数据在网络上流传,而匿名使用者是任何人都可以使用,保护匿名使用者的数据似乎比较不需要。所以您可以将这个选项设为「No」,以避免匿名使用者也使用加密联机登入,徒然耗费 CPU 的资源。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |
SSLCertFile 设定公开金钥位置
设定所要使用的凭证,这个凭证会被送到客户端做为加密用。如果您没有设定这个选项,预设会使用 /usr/local/etc/smbftpd/ssl.crt/server.crt。
您也可以和 Apache+SSL 共享凭证,Apache 的 SSL 凭证通常位于 /usr/local/etc/apache2/ssl.crt/server.crt。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |
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。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |
SSLDebugMode 是否启用 SSL 的除错模式
设定是否要启动 SSL 的除错模式,当设为「Yes」时,您还必须要设定记录文件位置 SSLDebugLog。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |
SSLDebugLog 设定除错记录文件位置
设定 SSL 除错模式的记录文件要放在什么地方。
#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags=" -D -l -l -d" ... |