在OpenBSD系统中,自带的ftpd是一款轻量级且安全性高的FTP服务器方案。与大多数系统不同,它没有复杂的配置文件,所有行为均通过启动参数进行控制。换句话说,你只需在启动命令中指定相应的选项,即可定义其功能。详细信息可查阅man手册:
$ man ftpd
ftpd有三种启动方式:由inetd托管、通过rc文件随系统自启、或直接在命令行中运行。以下逐一说明。
三种启动方式详解
1. inetd 方式
在/etc/inetd.conf中,默认包含如下一行配置:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US
该行已为ftpd传递了两个参数-US,当然你也可以根据需求组合其他参数(常用参数含义将在后文列出)。使用inetd方式时,需确保inetd服务本身已启动——OpenBSD默认启动该服务,可在/etc/rc.conf中检查inetd_flags变量的值以确认。
2. rc 方式
所谓“rc”方式,即通过配置/etc/rc.conf或/etc/rc.conf.local来启动服务。具体做法:为ftpd_flags变量设置好参数,并确保该行未被注释。需要注意的是,这种方式需要重启系统才能生效。
3. 命令行方式
直接执行ftpd命令,即可立即生效,无需重启:
# /usr/libexec/ftpd -4DllUS
如何停止ftp服务
如需关闭服务,有两种方法:
- 在
/etc/rc.conf中将ftpd_flags行注释掉(行首添加#),这样下次重启后服务便不会启动。 - 立即终止当前运行的进程:先使用
ps查找ftpd的PID,或查看/var/run/ftpd.pid文件,然后执行kill PID。
常用参数速览
以下列出最常用的参数(完整列表请参见man文档):
- -4:与
-D配合使用时,强制ftpd仅监听IPv4地址。 - -6:类似,仅使用IPv6地址。
- -A:仅允许匿名登录(除非同时指定
-n)。 - -D:使ftpd以守护进程(daemon)方式运行,自行建立端口并fork子进程处理连接。在高并发场景下,此方式比通过inetd托管更节省系统资源。
- -d:将调试信息通过LOG_FTP写入syslog。
- -l:通过syslog记录每次成功和失败的ftp会话。若该选项重复两次(
-ll),则会记录所有get/put/append/delete/mkdir/rmdir/rename操作及所操作的文件。 - -U:每个并发的ftp会话都会被记录到
/var/run/utmp,格式与who(1)命令输出类似。 - -n:禁止匿名登录(默认允许)。
- -S:启用后,ftpd会将所有匿名用户的下载情况记录到
/var/log/ftpd(前提是该文件存在)。 - -T maxtimeout:连接超时时间,默认为2小时。
- -u mask:强制设置umask为指定值,覆盖
/etc/login.conf中的设置(通常为022),并且不允许客户端使用chmod。
了解这些参数后,你就可以根据实际需求组合出合适的启动选项。
1. 只允许使用系统帐号登录FTP
如果你只希望系统上的已有用户通过FTP访问,而不开放匿名访问,则操作非常简单。因为匿名用户登录需要系统中存在一个名为ftp的帐户,而OpenBSD默认并未创建该帐户。因此,即便你没有显式禁止匿名登录,只要该帐户不存在,匿名用户也无法进入。你只需在/etc/rc.conf中将ftpd_flags设置为类似以下内容:
ftpd_flags="-4DllUSn"
其中-n显式禁止匿名登录,实际上即使不加此选项,只要没有ftp用户,匿名也会失败。不过加上-n更符合安全规范。
2. 允许匿名用户登录访问FTP资源
若确实需要开放匿名访问,则需手动创建一个权限极低的ftp帐户。该帐户需满足以下安全要求:
- 没有可用的shell(无法通过ssh等方式登录系统);
- 没有可用的密码(FAQ中提及:“This account shouldn't have a usable password”);
- 登录后会被chroot到自己的home目录,限制在文件系统的一个子集中活动。
下面逐步设置这个“处处受限”的ftp用户。
2.1 添加“ftp”帐户
2.1.1 在/etc/shells中添加一个无法实际使用的shell
通常选择/sbin/nologin或/usr/bin/false作为该用户的shell。为了让adduser命令能识别它们,需先将其加入/etc/shells:
# echo '/sbin/nologin' >> /etc/shells
# echo '/usr/bin/false' >> /etc/shells
如果不先添加这些shell,也可以在adduser时使用-shell参数强制指定(这样会临时加入但不会永久修改/etc/shells):
# adduser -shell /sbin/nologin
Enter username []: ftp
Enter full name []: anonymous ftpd user
Enter shell bash csh ksh nologin sh [/sbin/nologin]:
......
注意,如果不带-shell参数,直接输入/sbin/nologin会被拒绝,提示“/sbin/nologin: is not allowed!”。
以下是一个完整的添加示例,将ftp用户的home目录设置为/var/ftp:
# adduser -shell /sbin/nologin -home /var
Use option ``-silent'' if you don't want to see all warnings and questions.
Reading /etc/shells
Check /etc/master.passwd
Check /etc/group
Ok, let's go.
Don't worry about mistakes. I will give you the chance later to correct any input.
Enter username []: ftp
Enter full name []: anonymous ftpd user
Enter shell bash csh ksh nologin sh [/sbin/nologin]: ENTER
Uid [1001]: ENTER
Login group ftp [ftp]: ENTER
Login group is ``ftp''. Invite ftp into other groups: guest no [no]: ENTER
Login class daemon default staff [default]: ENTER
Enter password []: ENTER # 直接回车,这样就能设置一个不可用的密码
Set the password so that user cannot logon? (y/n) [n]: y
Name: ftp
Password: ****
Fullname: anonymous ftpd user
Uid: 1001
Gid: 1001 (ftp)
Groups: ftp
Login Class: default
HOME: /var/ftp
Shell:
OK? (y/n) [y]: y
Added user ``ftp''
Copy files from /etc/skel to /var/ftp
Add another user? (y/n) [y]: n
Goodbye!
#
添加完成后,adduser会自动从/etc/skel复制一些“dot files”到新用户的home目录。这些文件可能暴露系统信息(例如~/.cshrc中会包含$OpenBSD: dot.cshrc,v 1.5这样的版本信息),因此最好将其删除:
# rm -f /var/ftp/.*
3. 为/var/ftp目录设置正确的权限
3.1 ~ftp目录(用户主目录)
将/var/ftp的owner设为root,权限设为所有人不可写(555):
# chown -R root:wheel /var/ftp
# chmod -R 555 /var/ftp
3.2 ~ftp/bin目录(可选)
若你希望匿名用户登录后能执行某些命令,可创建此目录,并将需要的命令复制进去,然后将所有命令的权限设为仅可执行(111)。
# mkdir /var/ftp/bin
# chown -R root:ftp /var/ftp/bin
# COPY YOUR PROGRAMS TO /var/ftp/bin, AND THEN:
# chmod -R 111 /var/ftp/bin/*
3.3 ~ftp/etc目录(可选,不推荐)
此目录通常不建议创建,具体原因请参考ftpd的man文档。
3.4 ~ftp/pub目录
这是真正存放匿名资源的位置。权限设为555:
# chown -R root:ftp /var/ftp/pub
# chmod -R 555 /var/ftp/pub
实际上,对于最简单的匿名FTP,只需创建~ftp/pub并设置好权限即可,其他目录并非必需。
4. chroot匿名登录的用户
OpenBSD的ftpd会将/etc/ftpchroot文件中列出的所有用户chroot到各自的家目录。为了让ftp用户被chroot,只需将用户名ftp写入该文件,每行一个用户:
# file : /etc/ftpchroot
# $OpenBSD: ftpchroot,v 1.3 1996/07/18 12:12:47 deraadt Exp $
#
# list of users (one per line) given ftp access to a chrooted area.
# read by ftpd(8).
ftp
bibby
这里ftp和bibby两个用户登录后都会被chroot到各自的家目录。
5. 其他相关文件
/etc/ftpusers:列出不受欢迎的用户,列在此处的用户无法登录FTP。/etc/ftpwelcome:登录时显示的欢迎信息。若该文件不存在,则使用/etc/motd的内容。~ftp目录下的.message文件:可放置在~ftp下的任何子目录中,用户进入该目录时会显示其内容。
以上是在OpenBSD 3.8 release上使用自带ftpd搭建FTP服务器的完整过程。从参数选择到匿名用户的创建,再到安全配置,每一步都直接关系到最终服务的可靠性与安全性。希望本指南能帮助你顺利运行FTP服务器。
