匿名 FTP

作者:Mark Komarinski

标准的 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 毕业于克拉克森大学(位于非常寒冷的纽约州波茨坦),获得计算机科学和技术传播学位。他现在住在纽约州特洛伊,大部分空闲时间都在退伍军人事务部担任程序员。

加载 Disqus 评论