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

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

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

      $ man ftpd

ftpd 程序的启动有三种 方法 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 "变量 设置 参数,并确保该行没有被注释掉。
            这种 方法 需要在重新启动 系统 后才会生效;
 
      3: 直接在命令行下执行ftpd命令,这样就不需要重启 系统 了:
 
            # /usr/libexec/ftpd -4DllUS

ftpd 程序的终止:

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

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

      -4  如果指定了"-D"参数,则强制 ftpd 只使用IPv4地址。
      -6  和"-4"的解释类似;如果指定了"-D"参数,则强制ftpd只使用IPv6地址。
      -A  只允许匿名登录(除非指定了"-n"选项)。
      -D  如果指定了该参数, ftpd 将做为daemon运行,**** ftpd 端口并且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 中的 设置 /etc/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

或者在未将它们加入到/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使用。

这里使用" 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"目录下的任何一个子目录中。用户进入该目录时就会显示这个文件中的内容。