匿名 FTP
标准的 ftp 守护进程随最新的 Slackware 发行版一起提供,并被许多——也许是大多数——匿名 ftp 站点使用,它是来自圣路易斯华盛顿大学的 wu.ftpd。它提供了许多有用的功能,包括
对获取 filename.gz(当只有 filename 存在时)和获取 filename(当只有 filename.gz 存在时)的可扩展支持(自动 gzip 和自动 gunzip),以及对 .Z (compress) 类似的功能。
对获取 dir.tar (自动 tar) 的可扩展支持
广泛的日志记录
能够根据位置限制连接用户数
能够轻松更改配置
您可以从 sunsite.unc.edu 获取 wu.ftpd 的最新副本,路径为 /pub/Linux/system/Network file-transfer/wu-ftpd-2.4.linux.tar.gz。请务必不要获取那里存在的 wu-ftpd-2.4.patch.gz 文件——wu-ftpd-2.4.linux.tar.gz 文件已经打过补丁,应用 wu-ftpd-2.4.patch.gz 会移除这些补丁。
解压缩和解压 tar 文件后,您将拥有一个包含所有源文件的 wu-ftpd-2.4.linux 目录。wu.ftpd 的配置与您可能为 Linux 安装的大多数软件包略有不同。例如,您不使用 make。您使用 lnx 选项执行 build 脚本
trippy:~/wu-ftpd-2.4.linux> build lnx
在执行此操作之前,您可能需要更改配置文件。config.h 配置文件通常不需要更改。更重要的配置 src/pathnames.h 文件告诉守护进程各种文件的位置,包括二进制文件。源根目录中的 INSTALL 文件解释了配置文件中的每个条目。
在构建过程中,您可能会注意到来自 GCC 的许多警告。其中许多与 SIGBUS 被重新定义有关。第二个警告会告诉您它之前在哪里声明的。这没关系。这只是意味着 GCC 注意到两个头文件定义了相同的东西,在本例中是 SIGBUS。
构建完成后,您可能希望备份并删除旧的 ftpd 程序。使用大多数 Slackware 发行版附带的 /sbin/pkgtool 是一种简单的方法。您将需要查看 tcpip。记下包含 ftp 或 in.ftp 的文件的位置。之后,您可以备份并删除现有文件。这样,您可以确保您有一个干净的安装。
当您准备好安装时,请使用 su 切换到 root 状态,然后键入 build install,这将把二进制文件复制到正确的位置。默认情况下,守护进程本身位于 /usr/local/etc/ 中,支持文件位于 /usr/local/bin/ 中,man 页面位于 /usr/local/man/ 中。
最后,创建 ftp 用户,方法是手动编辑 root 用户的 /etc/passwd(小心!)或使用 useradd 命令。最佳情况下,ftp 应该使用“*”作为加密密码,位于其自己的组中(您可能需要为此创建一个 ftp 组,如果还没有的话);并将 /bin/true 作为登录 shell。将 /bin/true 作为 shell 意味着即使有人能够入侵该帐户,他们也会自动注销,因为 /bin/true 会立即退出(您也可以使用 /bin/false)。完成在 /etc/passwd 中编辑 ftp 用户后,它应该看起来像这样
ftp:*:401:50::/home/ftp:/bin/true
这两个数字可能不同,如果您的用户有其他路径来访问他们的主目录(如 /user/ftp),则 /home/ftp 也可能不同,但您明白了大致意思。
现在开始有趣的部分——设置配置文件。乍一看,这似乎是一项艰巨的任务,但一旦设置好配置,它只需要很少的维护——如果第一次设置正确的话。拥有许多配置文件的明显优势在于,您不必重新编译 wu.ftpd 即可添加或修改功能。
在我们深入研究配置文件之前,我必须从管理的角度解释匿名 ftp 的工作原理。为了保护系统合法用户的安全,ftpd 更改了其根目录,使其只能看到文件系统的一小部分。也就是说,当您在匿名 ftp 连接期间键入 cd / 时,您并没有真正转到真正的根目录,即普通用户看到的根目录。chroot(2) 函数调用将 ftpd 的根更改为 /etc/passwd 中用户 ftp 的主目录。在我的情况下,匿名用户的根目录相对于我这个系统的合法用户变成了 /home/ftp。从现在开始,我将匿名用户的根目录称为“ftp”根目录或“~ftp/”,而“/”或“根目录”将是您知道和喜爱的根目录。
首先,我们必须在我们的根目录中设置文件。~/wu-ftpd-2.4.linux/doc/examples 目录包含许多示例文件,这些文件适用于大多数情况。这些文件包括 ftpusers、ftpaccess 和 ftpconversions。它们应该在为您的本地设置修改后安装在 /etc 目录中。
ftpusers 文件包含不允许通过 ftp 连接的用户列表。这通过不允许诸如“root”之类的用户连接并可能覆盖诸如 /etc/passwd 之类的文件来提高安全性。用户每行列出一个。
ftpaccess 文件是主要的 ftpd 配置文件。它设置了用户的某些定义,配置了安全性的主要部分,以及以前的许多其他功能。示例目录中的 ftpaccess 文件对于大多数人来说应该足够好,但是如果您期望有大量人员连接以进行匿名 ftp 使用,则可以使用 ftpaccess.heavy 文件。以下是您需要查看的任何 ftpaccess 文件中的一些内容
loginfails int——设置 ftpd 断开连接前允许的不成功登录尝试次数。
class class typelist addrglob
[addrglob...]——这设置了用户的类。typelist 可以是系统的 real 用户、系统的 anonymous 匿名用户和 guest 访客帐户(与匿名用户不太一样)。addrglob 列出了某人来自何处,可以是 IP(或点 - 198.30.149.*)表示法,也可以是名称表示法 (*.satelnet.org)。这允许您将组设置为 local 本地用户(例如,与您位于同一子网上的匿名用户)和 remote 远程用户组,这些用户可能位于本地子网之外。一个设置可能如下所示
class local real,guest,anonymous 198.30.149.* class remote real,guest,anonymous *
limit class n time msg file——这设置了用户类的限制,限制在 time 时间内访问的用户数为 n。如果他们无法进入,则显示文件 ~ftp/msg file 中的文本。时间的定义与 UUCP 的 L.sys 文件中相同,但对于那些找不到该文件的人来说,时间相当容易理解。星期日表示为“Su”,星期一表示为“Mo”,依此类推。这些后面可以跟 24 小时格式的时间。因此,要限制远程用户数量为 5,但周末和晚上(限制变为 10)除外
limit remote 10 SaSu|Any1800-0600 /etc/msgs/msg.toomany limit remote 5 Any /etc/msgs/msg.toomany
默认的 ftpaccess.heavy 文件似乎与此相反。此外,如果限制无效(即您将 fubar 作为限制)或为 -1,则将其视为无限用户。
passwd-check none|trivial|rfc822 warn|enforce——这设置了当给定匿名登录密码时 ftpd 应如何响应。您可以使用三种方法来允许密码
none——我们不关心密码是什么(您可以作为访客登录)
trivial——名称中带有 @(您可以作为 komarimf@ 登录)
rfc822——必须是符合 RFC822 的地址(完整的用户名和主机)
如果您设置了 trivial 或 rfc822,并且用户不符合请求的密码格式,您可以做两件事
warn——告诉用户输入了无效密码,给出建议的密码,但允许用户仍然登录
enforce——告诉用户密码无效,给出建议的密码,然后注销用户。
readme file when——告诉用户务必在 when 期间读取 ~ftp/<file>。when 可以是登录时或在某些目录中。例如,条目
readme README* login readme README* cwd=*
将在登录时以及您每次更改目录时通知您所有 README 文件 (README*)。请注意,如果目录中有大量 README 文件,您可能希望将其更改为仅 README。
message file when——这几乎与上面的 readme 条目相同,只是 ~ftp/file 在 when 期间输出到用户的屏幕。
shutdown file——如果文件存在,ftpd 将不允许任何登录。这为您提供了一种关闭 ftp 的好方法,而无需编辑 /etc/inetd.conf 和重启 inetd,然后再反向操作使其全部再次工作。实际上,您只需要键入(在本例中)
touch /etc/shutdownftp
将不再允许登录。请注意,通过此方法不会自动断开已连接用户的连接。您将已连接的用户从系统中移除,我稍后会介绍。
最后,还有 ftpconversions 文件。wuftpd 的功能之一是它允许您以与远程端不同的格式下载文件。也就是说,您可以自动压缩文本文件,因为它会被发送给您,从而加快传输速度。或者您可以将整个目录捆绑到一个 .tar 文件中,以便放在软盘上。您应该对此进行一些修改,因为 .tar 和 .gz(用于 gzip)已经存在,允许您动态地 tar、压缩、解压 tar 和解压缩文件。这应该放在 /etc/ftpconversions 中。其他文件放在 ~ftp/ 下。例如,您必须安装 gzip 和 tar 二进制文件,以及运行命令所需的共享库。将目录更改为 ~ftp/bin(如果不存在,请先使用 mkdir 创建它)并执行以下操作
cp /bin/ls . cp /bin/gzip . chmod 0111 *
这将复制二进制文件,然后使它们都仅可执行。
接下来您需要库。进入 ~ftp/lib 目录(或创建它并执行以下操作:)
cp /lib/libc.so.4 .
是的,您可以创建硬链接,也可以使用静态链接的可执行文件。如果您对执行这两项操作的能力充满信心,则可以这样做。
您还可以拥有 /etc/passwd 的副本。如果没有它,当系统的普通用户向匿名 ftp 用户提供文件时,用户和组名(仅是它们存储在文件系统中的字面 UID 和 GID)将显示出来。因此,要将数字解析为名称,您需要在 ~ftp/etc/ 中同时拥有 /etc/passwd 和 /etc/group 的副本。但是,您不需要复制的 passwd 文件中的加密密码或其他信息,只需要 UID、GID 和用户名。因此,您可以将复制的 passwd 文件中的所有密码替换为星号 (*),然后删除 GID 之后的所有字段,只留下类似这样的条目
mark:*:401:100:::::
对于(极其注重安全的人)来说,这样做的缺点是远程用户现在可能知道合法用户的登录名。但是,您可以将系统有效用户的名称更改为其他名称。有什么比让破解者花费一整天的时间(没有成功,并且增加了被抓住的机会)试图破解您机器上名为“bob”的帐户更好的呢?他将 “bob” 视为匿名 ftp 上某个文件的所有者。
为了确保文件设置正确,请运行 ~\wu-ftpd-2.4.linux/bin/ckconfig 程序。它将验证运行所需的各种文件的位置。
说到安全性——现在是确保文件如其应有的样子的时候了。您不希望任何人随意访问您的系统,对吗?以下是 ~ftp/ 中的目录应如何布局
仅执行(chmod 中的模式 0111):~ftp/bin 和 ~ftp/etc
读取和执行(chmod 中的模式 0555):~ftp/pub、~ftp/usr 和 ~ftp/var(如果您需要它——或者它可以是指向 ~ftp/usr 的链接)
写入和执行(可选读取 - chmod 中的 0333 或 0777):/incoming
Incoming 是一个特殊目录,用户可以在其中放置传入文件。从这里,文件然后由 ftp 管理员移动到另一个位置。许多站点将其传入目录设置为,任何上传的文件都可以立即被另一个匿名用户下载。但是,不择手段的用户可以上传非法程序,供其他人立即下载。在 ftp 管理员发现文件并将其删除所需的时间内,数百人可能已经下载了它。通过拒绝目录的读取访问权限,用户可以将文件放在那里,但看不到它们。相反,您会收到关于“权限被拒绝”的消息。
仅执行目录也很特殊,因为虽然匿名用户可以运行该目录中的程序(通常是 tar 和 ls),但他们无法获取其中内容的目录,也无法在该目录中放置任何内容。这很好,因为它防止匿名用户发现有哪些类型的程序可用,并且还允许对 ~ftp/etc/passwd 和 ~ftp/etc/group 文件进行额外的安全保护。
现在您的 ftp 站点应该已准备好允许传入用户。如果您必须安装 wu.ftpd,请通过添加以下行来更改 /etc/inetd.conf
ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/ftpd
这假定您需要 tcpd(8) 包装器,并且 ftpd 二进制文件位于 /usr/local/bin 中。ftp 行可能已在该文件中,因此您可能只需要编辑它。使用 killall -HUP inetd 重启 inetd,然后坐下来放松一下。
如果您有兴趣了解您的 ftp 站点有多受欢迎,一些程序可以提供帮助。ftpcount 告诉您每类有多少用户连接到您的机器,以及最大值是多少。ftpwho 为您提供有关谁已登录的稍微更好的信息,ftpshut 用于在特定时间将已连接的用户移除。util 目录中的 xferstats 程序可以为您提供详细的报告,说明大多数人何时连接、下载了什么以及可能帮助您微调配置的其他信息。
wu.ftpd 具有比我在此处描述的更多的功能,例如创建“私有”目录和组的能力,以仅允许某些匿名 ftp 用户访问目录。还有通过 syslogd(8) 记录访问信息和将文件传输信息记录到 /var/adm/ftpd/xferlog 的规定。还有一个关于 xferlog(5) 的 man 页面。默认情况下,这两种日志记录方法都已设置。
如果您对在您的 linux 机器上设置 ftp 有任何疑问,或者对本文有任何疑问、意见甚至投诉,请发送电子邮件至 komarimf@craft.camp.clarkson.edu。
Mark Komarinski 毕业于克拉克森大学(位于非常寒冷的纽约州波茨坦),获得计算机科学和技术传播学位。他现在住在纽约州特洛伊,大部分空闲时间都在退伍军人事务部担任程序员。