• 用OpenBSD 3.8 release自带的FTPD架设FTP服务器
  • 2018年04月22日
  • 网络收集

使用OpenBSD?3.8?release自带的FTPD架设FTP服务器

Author: MichaelBibby
Date: 2005/11/20

可以任意转载,但请保留以上信息,谢谢。

注:本文参考OpenBSD?3.8的官方FAQ文档和ftpd的man文档写成,更全面的信息请参看这两个文件。

官方FAQ:http://www.openbsd.org/faq/faq10.html#AnonFTP
ftpd的在线手册页:http://www.openbsd.org/cgi-bin/man.cgi?query=ftpd&apropos=0&sektion=0&manpath=OpenBSD+3.8&arch=i386&format=html

OpenBSD的ftpd程序没有配置文件,就靠 设置 运行参数进行配置。所有参数的含义都可以在ftpd
的man文档中获得详细信息:

$?man?ftpd

ftpd程序的启动有三种 微信红包80元免费领取 (inetd/"rc?file"/command?line):

1: inetd方式:

在"/etc/inetd.conf"文件中有这么一行:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd?-US

这里为"ftpd"传递了两个参数"-US"。当然你还可以组合自己想要的参数。(一些常用参数的含义
在下文给出)。
inetd方式还需要同时启动inetd服务,OpenBSD默认启动了inetd(可以看看/etc/rc.conf中的
"inetd_flags"变量的值)。

2: "rc"方式;

所谓"rc"方式,指的就是通过配置"/etc/rc.conf"或者"/etc/rc.conf.local"来启动 系统 服务
为"/etc/rc.conf"中的"ftpd_flags"变量 设置 参数,并确保该行没有被注释掉。
这种 微信红包80元免费领取 需要在重新启动 系统 后才会生效;

3: 直接在命令行下执行ftpd命令,这样就不需要重启 系统 了:

?

	#?/usr/libexec/ftpd?-4DllUS
              



ftpd程序的终止:

1: 如果不需要提供ftp服务,则在/etc/rc.conf中将ftpd_flags变量注释掉(在该行最开头加一个"#"
符号);
2:使用ps查看ftpd的PID,然后"kill?PID"。

以下是ftpd常用的一些参数(这里列出的只是常用的,并不是全部。更多的参数请查看ftpd的man文档):

-4 如果指定了"-D"参数,则强制ftpd只使用IPv4地址。
-6 和"-4"的解释类似;如果指定了"-D"参数,则强制ftpd只使用IPv6地址。
-A 只允许匿名登录(除非指定了"-n"选项)。
-D 如果指定了该参数,ftpd将做为daemon运行,****ftp端口并且fork子进程对连接进行
处理。在繁忙的 服务 器上,这样可以减少 系统 负载,与使用inetd方式启动ftpd比起来,
这种方式使用更少的 系统 资源。
-d 使用LOG_FTP将Debug信息写入syslog。
-l 每个成功和失败的ftp?session都将由LOG_FTP工具通过syslog记录下日志。如果这个选
项被指定两次,所有get/put/append/delete/make?directory/remove?directory/rename
操作 以及所 操作 的文件都将被记录进日志。
-U 每个并发的ftp?session都被记录到日志文件/var/run/utmp,记录的格式就象who(1)命令
的输出一样。
-n 禁止匿名登录。通常是允许的。
-S 如果 设置 了这个参数,ftpd将会把所有匿名用户的下载情况记录在文件/var/log/ftpd中
(如果它存在的话)。
-T?maxtimeout
连接超时的时间限制。默认是2小时。
-u?mask
强制 设置 umask为指定的mask。而不是使用/etc/login.conf中的 设置 (login.conf中通常
设置 为022),并且不允许chmod。

看了这几个选项,你应该可以组合出合适的选项来满足自己的功能需求了。

1:只允许使用 系统 帐号登录FTP;

因为匿名用户登录需要使用到 系统 中的一个名为"ftp"的帐户(更多关于该帐户的讨论,请看本文下
半部分),而OpenBSD系统中没有该帐户,需要手动建立并且 设置 正确的权限,所以如果只允许用户
通过 系统 帐号登录FTP服务器,则只需要在/etc/rc.conf中将ftpd_flags的值简单地 设置 为"-D"即可
(虽然这时候的 设置 仍然允许匿名用户登录,但是因为 系统 中没有"ftp"用户,所以无法登录)。当
然你也可以多 设置 一些参数。比如:

?

	ftpd_flags="-4DllUSn"
              



参考上面几个常用选项的说明,你就会明白这是什么意思了。

2:允许匿名用户登录访问FTP资源;

因为匿名用户登录到FTP服务器后,实际上是一个"ftp"用户的身份进行所有 操作 ,所以出于安全考虑,
这个用户的权限通常被 设置 得很低。比如:

1:不为该用户提供一个可用的shell,使其无法登录 系统
2:没有一个可用的密码(即FAQ上说的"This?account?shouldn't?have?a?usable?password;");
3:登录 系统 后被chroot;
......

接下来我们要做的就是按照上面列出的三个要求来添加和 设置 这个低权限、处处受限的"ftp"用户。

2.1:添加"ftp"帐户以提供匿名访问;

2.1.1:在/etc/shells中添加一个无法实际使用的shell:

设置 "ftp"使用这个shell的目的,是不允许它通过shell登录到 系统 中。通常我们会有两种选择:

?

	/sbin/nologin
                
/usr/bin/false



为了在添加用户时可以使用这两个shell,我们可以这样做:

?

	#?echo?'/sbin/nologin'?>>/etc/shells
                
#?echo?'/usr/bin/false'?>>/etc/shells



2.1.2:在未将它们加入到/etc/shells的情况下,使用adduser添加帐户时加上"-shell"参数:

?

	#?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。如果不带这个参数,将无法使用它:

?

	#?adduser
                
Enter?username?[]:?ftp
Enter?full?name?[]:?anonymous?ftpd?user
Enter?shell?bash?csh?ksh?nologin?sh?[bash]:?/sbin/nologin
/sbin/nologin:?is?not?allowed!
Enter?shell?bash?csh?ksh?nologin?sh?[bash]:



这里就提示了不允许使用/sbin/nologin做为shell使用。

2.2:示例;

这里使用"adduser?-s?shell?/sbin/nologin"来添加一个这样的"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 #?在此直接按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!
#



到这里,添加用户的工作就完成了。还需要把从/etc/skel复制到$HOME目录的一些"dot?files"给删除,
以免暴露信息。"dot?files"的第一行通常会有一些 系统 的信息,比如"~/.cshrc"文件中就有这么一行:

#?$OpenBSD:?dot.cshrc,v?1.5?2005/02/16?06:56:57?matthieu?Exp?$

这至少就告诉了匿名登录的用户,这是个OpenBSD系统。所以把它们删除:

#?rm?-f?/var/ftp/.*

3:为/var/ftp目录 设置 正确的权限以保证安全性;

3.1:"~ftp"目录;

"~ftp"目录表示"ftp"用户的主目录,在本例中就是"/var/ftp"目录。
将它的owner设置为"root",权限 设置 为任何人都不可写(555):

#?chown?-R?root:wheel?/var/ftp
#?chmod?-R?555?/var/ftp

3.2:"~ftp/bin"目录;

这个目录并不是必须的。如果希望匿名用户登录到FTP后能够执行一些command,就可以将command
复制到这个目录下。所有的command的权限都应该 设置 为只允许执行(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"目录;

和"~ftp/bin"目录一样,这也是个可选的,并不推荐创建它。(更多关于该目录 设置 的信息请查看"ftpd"
的man文档)。

3.4:"~ftp/pub"目录:

这个目录用来存放你希望被匿名用户访问的文件。权限应该 设置 为555。

?

	#?chown?-R?root:ftp?/var/ftp/pub
                
#?chmod?-R?555?/var/ftp/pub



这里虽然提到了创建三个目录,但是实际上我们只需要创建"~ftp/pub"目录并 设置 好权限就可以了。

4:chroot匿名登录的用户;

"ftpd"会将"/etc/ftpchroot"文件中列出的用户都chroot。要使"ftp"用户在登录ftp后被chroot,只需要简单
地把用户名添加到这个文件中就可以了。这是一个示例文件:

#?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

"ftpd"在启动时会读取这个文件,如果"ftp"和"bibby"这两个用户登录ftp,将被分别chroot到自己的$HOME目录下。

5:其他一些相关文件;

/etc/ftpusers?--?列出了所有不受欢迎的用户。列在该文件中的用户都无法登录ftp。
/etc/ftpwelcome?--?欢迎信息。登录上ftp的用户都将在登录时看到这一信息。
/etc/motd?--?如果"/etc/ftpwelcome"文件不存在,则使用"/etc/motd"文件的内容做为欢迎信息。
".message"?--?这个文件可以被放置在"~ftp"目录下的任何一个子目录中。用户进入该目录时就会显示这个
文件中的内容。
?