oftpd:安全、现代的 FTP 守护进程
FTP 守护进程可能不太受关注,但它们确实受到的关注是以一个又一个安全公告的形式出现的。对于大多数人来说,支持像 FTP 这样老旧的东西并没有太多的黑客价值,因此这项技术的发展一直停滞不前——直到现在。本文将向您介绍 Shane Kerr 的 oftpd,这是一个极其简单的 FTP 守护进程,我们认为它将开始取代目前在各种 Linux 发行版上发布(并造成安全问题)的旧的、功能齐全的守护进程。
Rick Moen,一位 Linux 安全专家,以其在许多过时或不常见的系统上安装 Linux 的能力而闻名,他运行一个 FTP 服务器,主要作为 Linux 发行版的归档,以便通过网络安装。从软盘启动,选择“从 FTP 安装”,一切就搞定了。无需弄清楚如何 insmod 某人十年历史的 1 倍速 CD-ROM 驱动器的驱动程序。(请大家不要带着你们的 VIC-20 和 PDP-8 去敲 Rick 的门;他在定期的安装节和用户组会议中已经接受了足够的挑战。)
Rick 说,FTP 仍然有用的原因有三点。首先,FTP 提供自动的、信息丰富的目录列表,包括文件修改时间,以方便镜像。其次,在 FTP 中没有“index.html”来覆盖守护进程生成的目录列表,因此很容易镜像整个目录树或使用 snarf 抓取它们。
最后,Rick 发现你可以为旧版操作系统或 HTTP 客户端不适用的特殊情况找到小型 FTP 客户端。例如,Rick 使用 MacOS FTP 客户端将 Debian 软盘复制到一台没有 CD-ROM 且内存不足以运行 Web 浏览器的旧 Macintosh 电脑上。使用 Kickstart 软盘安装大量 Red Hat 或基于 Red Hat 的系统的人很快就会发现 FTP 安装速度快、方便,并且可以让你在 FTP 服务器上维护一个最新的软件归档。你可以使用 NFS(网络文件系统)安装做同样的事情,但 FTP 更快。
自从旧的守护进程被编写出来后,人们对 FTP 守护进程的需求已经发生了变化。首先,使用用户名和密码(通过网络以明文发送)登录 FTP 站点的日子已经一去不复返了。人们正在使用 ssh、scp 和其他加密工具来保护他们在网络上传输非公开文件时的密码,因此 FTP 守护进程不再需要验证用户身份。其次,性能很重要。人们不仅仅使用 FTP 来获取偶尔的软件或将工作传递给同事。FTP 服务器应该准备好被许多同时安装整个 Linux 发行版的客户端冲击。
因此,运行现代 FTP 服务器的两个目标是:为了安全,将您的策略和 FTP 守护进程都简化为“仅匿名 FTP”,并寻找一个提供良好性能的守护进程。这就是 oftpd 的由来。
为了安全起见,除了必要的设置任务外,oftpd 以非 root 用户身份运行。它“chrooted”到公共 FTP 目录。这些功能在安全性方面为您带来了很多好处,而传统的 FTP 守护进程允许用户使用用户名和密码登录,但无法与之匹敌。为了简单性和性能,oftpd 本身生成目录列表,而不是运行 ls。
设置 oftpd 的第一步是删除 inetd.conf 中旧的 ftp 条目。可能随您的 Linux 发行版一起提供的 FTP 守护进程由 inetd 运行,而 oftpd 为了速度而独立运行。只需在 ftp 行的开头用 # 注释掉它,使其看起来像这样
# ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
现在 killall -HUP inetd 以重启 inetd,使其知道不要响应 FTP 端口上的连接。如果您 ftp localhost,您应该得到 Connection refused(连接被拒绝)。
现在,我们准备继续介绍 oftpd 本身。首先,是简单的部分。要编译和安装,只需解压缩 tar 文件,cd 进入生成的目录,并使用 The One True GNU Way (./configure; make; make install)。为了将所有内容都放在适当的规范位置,请向 configure 脚本提供 bindir 参数,以便 make install 将 oftpd 可执行文件放在 /usr/local/sbin 中,这是本地构建的守护进程的适当目录
sh ./configure --bindir=/usr/local/sbin && make
然后 su root 并执行
make install安装非常通用,以至于我使用的 oftpd 版本中的 INSTALL 文档开头只是简单地写着“These are generic installation instructions”(这些是通用安装说明)。这是一件好事。当您读到这篇文章时,您最喜欢的发行版可能已经有了 RPM 或 deb 包,因此请首先在那里查找更简单的安装方法。
如果您从 RPM 或 deb 包安装 oftpd,则上述编译和安装步骤以及接下来的三个步骤将为您处理,但是如果您从源代码安装 oftpd,则必须完成这些步骤。
Linux 安全最重要的规则之一是“不要以 root 身份运行任何您不必运行的东西”。oftpd 像 Apache 和其他守护进程一样,遵循此规则,在它开始监听其标准、仅 root 端口后立即放弃 root 权限。如果您正在查看 oftpd 源代码,这可以在 src/oftpd.c 中找到,其中“create our main listener”(创建我们的主监听器)之后紧跟着“set user to be as inoffensive as possible”(将用户设置为尽可能无害)。因此,您将以 root 身份启动 oftpd,但您需要添加一个用户,以便它之后可以以该用户身份运行。运行 adduser 或 useradd(以您的发行版提供的为准)创建一个名为“oftpd”的新用户。
以 root 身份,像这样启动 oftpd
/usr/local/sbin/oftpd oftpd /home/httpd/html
这两个参数是:第一个,要以哪个用户身份运行;第二个,要使用的 FTP 目录。您可以将 Apache 和 oftpd 都指向同一个目录,以便您的所有内容都可以通过 HTTP 或 FTP 访问。将您自己的 Web 服务器的“DocumentRoot”目录替换为第二个参数。如果您愿意,您可以始终创建一个单独的 FTP 目录,但这种方式可以让人们在他们的防火墙配置错误,不允许 FTP 连接通过的情况下使用 HTTP 从您的服务器获取文件。
如果 oftpd 启动时没有错误,请尝试使用您最喜欢的 FTP 客户端或 Web 浏览器访问 localhost 或 ftp:///。您应该能够获得您选择的 FTP 目录的目录列表。如果可以,您就快完成了。喝一杯提神的饮料。上面的命令可能会发生两件坏事,但它们很容易处理。如果您收到“invalid user name”(无效用户名)错误,则说明您没有正确创建 oftpd 用户。如果您指定了一个不存在的目录,您不会立即看到错误消息,但是您将无法获得目录列表,并且 oftpd 将使用 syslog 记录错误。在我的 Debian 机器上,syslog 将 oftpd 的日志消息放在 daemon.log 中。您可以通过编辑 /etc/syslogd.conf 来更改它,但这又是另一篇文章了。
现在,以 root 身份,使用以下命令杀死 oftpd
killall oftpd
接下来,您需要创建一个 init 脚本来启动和停止 oftpd。以 root 身份,cd 进入您的 init.d 目录(Red Hat 上为 /etc/rc.d/init.d,Debian 上为 /etc/init.d),并挑选一个 init 脚本进行复制和编辑(我喜欢从 sshd 的 init 脚本复制新的 init 脚本,因为它非常简单)。需要注意两个小功能:oftpd(0.2.0 版本)目前不会在 /var/run 中写入 pidfile,并且正在运行的进程的 PID 与您启动的进程的 PID 不同,因为 oftpd 在启动时会 fork。因此,在 init 脚本的“stop”部分,您需要采取适当的步骤来按名称而不是按 PID 杀死 oftpd。在 Debian 上,使用 start-stop-dæmon 的 --exec 选项(参见列表 1)。但是,如果 killproc 函数在 Red Hat 上找不到 pidfile,它将自动按名称杀死进程。
如果您安装的是软件包而不是源代码,那么到目前为止的所有步骤都将为您完成。检查 init 脚本是否将 oftpd 指向了适当的目录,但仅此而已。现在,无论您是从源代码还是从软件包安装,只需 cd 进入您的 init.d 目录并执行
./oftpd start
然后检查 ftp:/// 以确保 oftpd 正在运行;使用您的发行版的运行级别管理工具将 oftpd 设置为在您进入默认运行级别时自动启动;并从外部 ftp 到您的服务器,以确保某些防火墙管理员没有从您的网络中过滤掉 FTP。现在您有了一个可用的、简单的 FTP 服务器,适用于各种软件归档。您可以镜像您最喜欢的 Linux 发行版,并邀请您认识的每个人都将他们的机器带过来进行快速网络安装。
