概述
文件传输协议(FTP)的目的是在互联网上进行平台无关的数据传输,它基于一个客户机/服务器架构。RFC 959[1] 规定 FTP 将通过两个信道(端口)传输,一个传输数据(TCP 端口 20),另一个传输控制信息(TCP 端口 21)。在控制信道之上,双方(客户机和服务器)交换用于发起数据传输的命令。
一个 FTP 连接包含4个步骤:
用户鉴权
建立控制信道
建立数据信道
关闭连接
FTP 的连接控制使用 TCP (Transmission Control Protocol, 传输控制协议),它保障了数据的可靠传输。因此,FTP 在数据传输中不需要关心分组丢失和数据错误检测。因为 TCP 保障了每个分组都按照顺序的、没有错误的、无重复的到达。
FTP 中根据发送方式的不同分为有三种不同的传输类型,流(stream)模式以 end-of-file (EOF) 标志传输的结束,另两种传输模式以 end-of-record (EOR) 来标志传输的结束
流 (Stream)
块 (Block)
压缩 (Compressed)
另外还有两种不同的传输模式:
ASCII
Binary(二进制)
ASCII 模式用于文本文件的传输,而二进制模式用于程序和类似的数据的传输。用户不需要选择特定的传输模式,现在所有的客户端都可以识别传输的文件的类型自动切换模式。
鉴权用的用户名和密码都是使用明文传输的,这是一个非常严重的安全隐患。这也是一些有关FTP的安全的考虑的出发点。1997 年10月,RFC2228[2] 终于发布了,它定义了 FTP 的安全性补充规范。
vsftpd
vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。比如:
非常高的安全性需求
带宽限制
良好的可伸缩性
创建虚拟用户的可能性
IPnG(译注:IPv6)支持
中等偏上的性能
分配虚拟 IP 的可能性
高速
vsftpd 的名字代表"very secure FTP daemon", 安全是它的开发者 Chris Evans 考虑的首要问题之一。在这个 FTP 服务器设计开发的最开始的时候,高安全性就是一个目标。
一个例子就是 vsftpd 是在 chroot 模式下工作的,chroot 模式就是为程序(这里就是 vsftpd 了)单独指定一个新的目录,它也就不能访问那个目录之外的程序和文件了 --- 所以这也称为“被锁上的”。一个可能被潜在的攻击者破坏的 FTP 服务器将被从系统的其他部分独立开来,从而避免了更大的损失。有关 chroot 的更多信息可以在下边的文章[3]中得到。如果您对于 vsftpd 的其他安全机制有兴趣,推荐阅读文章 [4]。
由于有了如此多的特性,其中 FTP 服务的安全性应该是最重要的,vsftpd 比其他 FTP 服务器更加优越。WU-FTPD[5] 在这里可以被视作一个反面的例子,因为它在过去的几年中出现了太多的安全缺陷。
安装
vsftpd 守护程序的安装相当简单,在每个主要发行版中你都可以找到 vsftpd 的 RPM 包,很多情况下,它已经被装上了。如果没有的话,源代码可以在 [6] 找到,然后手工安装。
得到源代码并解开 tarball 后,进入新建的目录目录并运行 make。下面是必要的命令的示例:
neo5k@phobos> tar xzvf vsftpd-x.x.x.tar.gz
neo5k@phobos> cd vsftpd-x.x.x
neo5k@phobos> make
这之前我们应该看看用户 "nobody" 和目录 "/usr/share/empty" 是否存在,如果需要的话我们就新建这个用户和这个目录。如果我们允许用户匿名访问,用户 "ftp" 和目录"/var/ftp" 也需要创建。这可以用如下两个命令完成:
neo5k@phobos> mkdir /var/ftp
neo5k@phobos> useradd -d /var/ftp ftp
由于安全原因,目录 "/var/ftp" 不应该属于用户 "ftp",也不应该有写权限。如果用户已经存在了的话,用下面的两个命令,我们可以改变目录的所有者并去掉其他用户的写权限:
neo5k@phobos> chown root.root /var/ftp
neo5k@phobos> chmod og-w /var/ftp
达到了所有的先决条件后,我们可以安装 vsftp-daemon 了:
neo5k@phobos> make install
程序和 manpage 应该已经被拷贝到系统中的正确的位置了。如果出现了异常情况,麻烦一点的手工拷贝也可以完成这项工作。
neo5k@phobos> cp vsftpd /usr/sbin/vsftpd
neo5k@phobos> cp vsftpd.conf.5 /usr/share/man/man5
neo5k@phobos> cp vsftpd.8 /usr/share/man/man8
现在我们的配置文件的例子还没有拷贝呢 --- 它会让我们的介绍更简单一些 --- 我们需要手工拷贝:
neo5k@phobos> cp vsftpd.conf /etc
配置
配置文件可以在"/etc/vsftpd.conf"找到。和大多数配置文件一样,vsftpd 的配置文件中以 # 开始注释。
# Comment line
一个配置的例子是这样的:
# Anonymus FTP-access permitted? YES/NO
anonymous_enable=NO
# Permit anonymus upload? YES/NO
anon_upload_enable=NO
# Permission for anonymus users to make new directories? YES/NO
anon_mkdir_write_enable=NO
# Permission for anonymus users to do other write operations - like renaming or deleting? YES/NO
anon_other_write_enable=NO
# Log on by local users permitted? YES/NO
local_enable=YES
# Shall local users be locked into their home directory? YES/NO
chroot_local_user=YES
# Highest permitted data transfer rate in bytes per second for local logged on users. Default = 0 (unlimited)
local_max_rate=7200
# General write permission? YES/NO
write_enable=YES
# Enable messages when changing directories? YES/NO
dirmessage_enable=YES
# Welcome banner at users logon.
ftpd_banner="Welcome to neo5k's FTP service."
# Activate logging? YES/NO
xferlog_enable=YES
# Logging of all FTP activities? YES/NO
# Careful! This can generate large quantities of data.
log_ftp_protocol=NO
# Confirm connections are established on port 20 (ftp data) only. YES/NO
connect_from_port_20=YES
# Timeout during idle sessions
idle_session_timeout=600
# Data connection timeout
data_connection_timeout=120
# Access through Pluggable Authentication Modules (PAM)
pam_service_name=vsftpd
# Standalone operation? YES/NO - depending on operation mode (inetd, xinetd, Standalone)
# The author's FTP service is being startet with xinetd, therefore the value here is NO.
listen=NO
开始 FTP 服务
vsftpd 可以工作在三种方式。使用 inetd 或 xinetd,还有独立(standalone)工作模式。
inetd
要让 FTP 服务通过 inetd 操作,我们要使用一个编辑器打开配置文件 "/etc/inetd.conf":
neo5k@phobos> vi /etc/inetd.conf
我们找到关于 FTP 业务的那行,并去掉 vsftpd 这项前面的注释符号。如果没有这么一项的话,我们就加上这项。之后我们要重新启动 inetd。这项应该是这样的:
# ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd
ftp stream tcp nowait root /usr/sbin/tcpd vsftpd
xinetd
建议使用 xinetd 启动 vsftp daemon ,它比 inetd 更加现代。包括诸如请求记录、访问控制、将业务与网络接口绑定等改进。[7] 是一个非常不错的关于 xinetd 的介绍。修改之后,重启xinetd 是必要的。xinetd 的配置应该是这个样子的:
# vsftp daemon.
service ftp
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
per_source = 5
instances = 200
no_access = 192.168.1.3
banner_fail = /etc/vsftpd.busy_banner
log_on_success += PID HOST DURATION
log_on_failure += HOST
nice = 10
}
Standalone Operation
vsftp也可以工作在独立工作模式下。这样,我们需要再次打开 "/etc/vsftpd.conf" 做如下改动:
# Shall the vsftp daemon run in standalone operation? YES/NO
listen=YES
在这项设置之后,守护进程可以用如下方式启动
neo5k@phobos> /usr/sbin/vsftpd &
如果程序运行路径的设置是正确的,下面的命令就可以启动服务器了
neo5k@phobos> vsftpd &
对于后一种方式,我们可以这样看路径设置是否正确
neo5k@phobos> echo $PATH
/usr/sbin:/bin:/usr/bin:/sbin:/usr/X11R6/bin
在独立工作模式,我们必须保证 vsftp daemon 没有被inetd 或 xinetd 启动。
操作测试
在成功地安装和配置之后,我们可以第一次访问这个 FTP 服务器了。
neo5k@phobos> ftp phobos
Connected to phobos
220 "Welcome to neo5k's FTP service."
Name (phobos:neo5k): testuser
331 Please specify the password.
Password:
230 Login successful
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -l
229 Entering Extended Passive Mode
150 Here comes the directory listing
drwxr-xr-x 11 500 100 400 May 07 16:22 docs
drwxr-xr-x 9 500 100 464 Feb 01 23:05 hlds
drwxr-xr-x 39 500 100 4168 May 10 09:15 projects
226 Directory send OK.
ftp>
结论
我们注意到,vsftp daemon 的安装和配置都很简单,但它提供了很多特性和很高的安全性。
当然,这个介绍仅仅是对 vsftpd 提供的环境的一瞥,这个 FTP 服务器还提供了大量的可供设置的选项。如果你想要更进一步研究 vsftpd 的话,应该访问项目的主页[6]并阅读更进一步的文档。
链接
[1] ftp://ftp.rfc-editor.org/in-notes/rfc959.txt [RFC 959 - File Transfer Protocol]
[2] ftp://ftp.rfc-editor.org/in-notes/rfc2228.txt [RFC 2228 - FTP Security Extensions]
[3] linuxfocus.org: article225, January2002 [chroot]
[4] http://vsftpd.beasts.org/DESIGN [Security vsftpd]
[5] http://www.wu-ftpd.org/ [WU-FTPD]
[6] http://www.vsftpd.beasts.org/ [Home of vsftpd]
[7] linuxfocus.org: article 175, November2000 [xinetd]