有美国情报部门在评论区节奏 發表於 2008-9-8 18:49:16

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

<p><strong>使用OpenBSD&nbsp;3.8&nbsp;release自带的FTPD架设FTP服务器</strong>
                <br />
<br />
Author: MichaelBibby <br />
Date: 2005/11/20 <br />
<br />
可以任意转载,但请保留以上信息,谢谢。 <br />
<br />
注:本文参考OpenBSD&nbsp;3.8的官方FAQ文档和ftpd的man文档写成,更全面的信息请参看这两个文件。 <br />
<br />
官方FAQ:http://www.openbsd.org/faq/faq10.html#AnonFTP <br />
ftpd的在线手册页:http://www.openbsd.org/cgi-bin/man.cgi?query=ftpd&apropos=0&sektion=0&manpath=OpenBSD+3.8&arch=i386&format=html <br />
<br />
OpenBSD的ftpd程序没有配置文件,就靠<a target="_blank" href="#" class="UBBWordLink">设置</a>运行参数进行配置。所有参数的含义都可以在ftpd <br />
的man文档中获得详细信息: <br />
<br />
$&nbsp;man&nbsp;ftpd <br />
<br />
ftpd程序的启动有三种<a target="_blank" href="#" class="UBBWordLink">方法</a>(inetd/&quot;rc&nbsp;file&quot;/command&nbsp;line): <br />
<br />
<b>1: inetd方式:</b>
                <br />
<br />
在&quot;/etc/inetd.conf&quot;文件中有这么一行: <br />
<br />
ftp stream tcp nowait root /usr/libexec/ftpd ftpd&nbsp;-US <br />
<br />
这里为&quot;ftpd&quot;传递了两个参数&quot;-US&quot;。当然你还可以组合自己想要的参数。(一些常用参数的含义 <br />
在下文给出)。 <br />
inetd方式还需要同时启动inetd服务,OpenBSD默认启动了inetd(可以看看/etc/rc.conf中的 <br />
&quot;inetd_flags&quot;变量的值)。 <br />
<br />
<b>2: &quot;rc&quot;方式;</b>
                <br />
<br />
所谓&quot;rc&quot;方式,指的就是通过配置&quot;/etc/rc.conf&quot;或者&quot;/etc/rc.conf.local&quot;来启动<a target="_blank" href="#" class="UBBWordLink">系统</a><a target="_blank" href="#" class="UBBWordLink">服务</a>。 <br />
为&quot;/etc/rc.conf&quot;中的&quot;ftpd_flags&quot;变量<a target="_blank" href="#" class="UBBWordLink">设置</a>参数,并确保该行没有被注释掉。 <br />
这种<a target="_blank" href="#" class="UBBWordLink">方法</a>需要在重新启动<a target="_blank" href="#" class="UBBWordLink">系统</a>后才会生效; <br />
<br />
<b>3: 直接在命令行下执行ftpd命令,这样就不需要重启<a target="_blank" href="#" class="UBBWordLink">系统</a>了:</b>
                <br />
<br />
&nbsp;</p>
<pre>
        #&nbsp;/usr/libexec/ftpd&nbsp;-4DllUS</pre>
<p><br />
<br />
ftpd程序的终止: <br />
<br />
1: 如果不需要提供ftp服务,则在/etc/rc.conf中将ftpd_flags变量注释掉(在该行最开头加一个&quot;#&quot; <br />
符号); <br />
2:使用ps查看ftpd的PID,然后&quot;kill&nbsp;PID&quot;。 <br />
<br />
以下是ftpd常用的一些参数(这里列出的只是常用的,并不是全部。更多的参数请查看ftpd的man文档): <br />
<br />
-4 如果指定了&quot;-D&quot;参数,则强制ftpd只使用IPv4地址。 <br />
-6 和&quot;-4&quot;的解释类似;如果指定了&quot;-D&quot;参数,则强制ftpd只使用IPv6地址。 <br />
-A 只允许匿名登录(除非指定了&quot;-n&quot;选项)。 <br />
-D 如果指定了该参数,ftpd将做为daemon运行,****ftp端口并且fork子进程对连接进行 <br />
处理。在繁忙的<a target="_blank" href="#" class="UBBWordLink">服务</a>器上,这样可以减少<a target="_blank" href="#" class="UBBWordLink">系统</a>负载,与使用inetd方式启动ftpd比起来, <br />
这种方式使用更少的<a target="_blank" href="#" class="UBBWordLink">系统</a>资源。 <br />
-d 使用LOG_FTP将Debug信息写入syslog。 <br />
-l 每个成功和失败的ftp&nbsp;session都将由LOG_FTP工具通过syslog记录下日志。如果这个选 <br />
项被指定两次,所有get/put/append/delete/make&nbsp;directory/remove&nbsp;directory/rename <br />
<a target="_blank" href="#" class="UBBWordLink">操作</a>以及所<a target="_blank" href="#" class="UBBWordLink">操作</a>的文件都将被记录进日志。 <br />
-U 每个并发的ftp&nbsp;session都被记录到日志文件/var/run/utmp,记录的格式就象who(1)命令 <br />
的输出一样。 <br />
-n 禁止匿名登录。通常是允许的。 <br />
-S 如果<a target="_blank" href="#" class="UBBWordLink">设置</a>了这个参数,ftpd将会把所有匿名用户的下载情况记录在文件/var/log/ftpd中 <br />
(如果它存在的话)。 <br />
-T&nbsp;maxtimeout <br />
连接超时的时间限制。默认是2小时。 <br />
-u&nbsp;mask <br />
强制<a target="_blank" href="#" class="UBBWordLink">设置</a>umask为指定的mask。而不是使用/etc/login.conf中的<a target="_blank" href="#" class="UBBWordLink">设置</a>(login.conf中通常 <br />
<a target="_blank" href="#" class="UBBWordLink">设置</a>为022),并且不允许chmod。 <br />
<br />
看了这几个选项,你应该可以组合出合适的选项来满足自己的功能需求了。 <br />
<br />
<b>1:只允许使用<a target="_blank" href="#" class="UBBWordLink">系统</a>帐号登录FTP;</b>
                <br />
<br />
因为匿名用户登录需要使用到<a target="_blank" href="#" class="UBBWordLink">系统</a>中的一个名为&quot;ftp&quot;的帐户(更多关于该帐户的讨论,请看本文下 <br />
半部分),而OpenBSD系统中没有该帐户,需要手动建立并且<a target="_blank" href="#" class="UBBWordLink">设置</a>正确的权限,所以如果只允许用户 <br />
通过<a target="_blank" href="#" class="UBBWordLink">系统</a>帐号登录FTP服务器,则只需要在/etc/rc.conf中将ftpd_flags的值简单地<a target="_blank" href="#" class="UBBWordLink">设置</a>为&quot;-D&quot;即可 <br />
(虽然这时候的<a target="_blank" href="#" class="UBBWordLink">设置</a>仍然允许匿名用户登录,但是因为<a target="_blank" href="#" class="UBBWordLink">系统</a>中没有&quot;ftp&quot;用户,所以无法登录)。当 <br />
然你也可以多<a target="_blank" href="#" class="UBBWordLink">设置</a>一些参数。比如: <br />
<br />
&nbsp;</p>
<pre>
        ftpd_flags=&quot;-4DllUSn&quot;</pre>
<p><br />
<br />
参考上面几个常用选项的说明,你就会明白这是什么意思了。 <br />
<br />
<b>2:允许匿名用户登录访问FTP资源; </b><br />
<br />
因为匿名用户登录到FTP服务器后,实际上是一个&quot;ftp&quot;用户的身份进行所有<a target="_blank" href="#" class="UBBWordLink">操作</a>,所以出于安全考虑, <br />
这个用户的权限通常被<a target="_blank" href="#" class="UBBWordLink">设置</a>得很低。比如: <br />
<br />
1:不为该用户提供一个可用的shell,使其无法登录<a target="_blank" href="#" class="UBBWordLink">系统</a>; <br />
2:没有一个可用的密码(即FAQ上说的&quot;This&nbsp;account&nbsp;shouldn't&nbsp;have&nbsp;a&nbsp;usable&nbsp;password;&quot;); <br />
3:登录<a target="_blank" href="#" class="UBBWordLink">系统</a>后被chroot; <br />
...... <br />
<br />
接下来我们要做的就是按照上面列出的三个要求来添加和<a target="_blank" href="#" class="UBBWordLink">设置</a>这个低权限、处处受限的&quot;ftp&quot;用户。 <br />
<br />
<b>2.1:添加&quot;ftp&quot;帐户以提供匿名访问;</b>
                <br />
<br />
2.1.1:在/etc/shells中添加一个无法实际使用的shell: <br />
<br />
<a target="_blank" href="#" class="UBBWordLink">设置</a>&quot;ftp&quot;使用这个shell的目的,是不允许它通过shell登录到<a target="_blank" href="#" class="UBBWordLink">系统</a>中。通常我们会有两种选择: <br />
<br />
&nbsp;</p>
<pre>
        /sbin/nologin
<br />        /usr/bin/false</pre>
<p><br />
<br />
为了在添加用户时可以使用这两个shell,我们可以这样做: <br />
<br />
&nbsp;</p>
<pre>
        #&nbsp;echo&nbsp;'/sbin/nologin'&nbsp;&gt;&gt;/etc/shells
<br />        #&nbsp;echo&nbsp;'/usr/bin/false'&nbsp;&gt;&gt;/etc/shells</pre>
<p><br />
<br />
2.1.2:在未将它们加入到/etc/shells的情况下,使用adduser添加帐户时加上&quot;-shell&quot;参数: <br />
<br />
&nbsp;</p>
<pre>
        #&nbsp;adduser&nbsp;-shell&nbsp;/sbin/nologin
<br />        Enter&nbsp;username&nbsp;[]:&nbsp;ftp
<br />        Enter&nbsp;full&nbsp;name&nbsp;[]:&nbsp;anonymous&nbsp;ftpd&nbsp;user
<br />        Enter&nbsp;shell&nbsp;bash&nbsp;csh&nbsp;ksh&nbsp;nologin&nbsp;sh&nbsp;:</pre>
<p><br />
...... <br />
<br />
这里在询问该用户使用何种shell时就出现了/sbin/nologin。如果不带这个参数,将无法使用它: <br />
<br />
&nbsp;</p>
<pre>
        #&nbsp;adduser
<br />        Enter&nbsp;username&nbsp;[]:&nbsp;ftp
<br />        Enter&nbsp;full&nbsp;name&nbsp;[]:&nbsp;anonymous&nbsp;ftpd&nbsp;user
<br />        Enter&nbsp;shell&nbsp;bash&nbsp;csh&nbsp;ksh&nbsp;nologin&nbsp;sh&nbsp;:&nbsp;/sbin/nologin
<br />        /sbin/nologin:&nbsp;is&nbsp;not&nbsp;allowed!
<br />        Enter&nbsp;shell&nbsp;bash&nbsp;csh&nbsp;ksh&nbsp;nologin&nbsp;sh&nbsp;:</pre>
<p><br />
<br />
这里就提示了不允许使用/sbin/nologin做为shell使用。 <br />
<br />
2.2:示例; <br />
<br />
这里使用&quot;adduser&nbsp;-s&nbsp;shell&nbsp;/sbin/nologin&quot;来添加一个这样的&quot;ftp&quot;帐户做为示例,并将该用户的 <br />
$HOME目录<a target="_blank" href="#" class="UBBWordLink">设置</a>为&quot;/var/ftp&quot;: <br />
<br />
&nbsp;</p>
<pre>
        #&nbsp;adduser&nbsp;-shell&nbsp;/sbin/nologin&nbsp;-home&nbsp;/var
<br />        Use&nbsp;option&nbsp;``-silent''&nbsp;if&nbsp;you&nbsp;don't&nbsp;want&nbsp;to&nbsp;see&nbsp;all&nbsp;warnings&nbsp;and&nbsp;questions.
<br />
<br />        Reading&nbsp;/etc/shells
<br />        Check&nbsp;/etc/master.passwd
<br />        Check&nbsp;/etc/group
<br />
<br />        Ok,&nbsp;let's&nbsp;go.
<br />        Don't&nbsp;worry&nbsp;about&nbsp;mistakes.&nbsp;I&nbsp;will&nbsp;give&nbsp;you&nbsp;the&nbsp;chance&nbsp;later&nbsp;to&nbsp;correct&nbsp;any&nbsp;input.
<br />        Enter&nbsp;username&nbsp;[]:&nbsp;ftp
<br />        Enter&nbsp;full&nbsp;name&nbsp;[]:&nbsp;anonymous&nbsp;ftpd&nbsp;user
<br />        Enter&nbsp;shell&nbsp;bash&nbsp;csh&nbsp;ksh&nbsp;nologin&nbsp;sh&nbsp;:ENTER
<br />        Uid&nbsp;:ENTER
<br />        Login&nbsp;group&nbsp;ftp&nbsp;:ENTER
<br />        Login&nbsp;group&nbsp;is&nbsp;``ftp''.&nbsp;Invite&nbsp;ftp&nbsp;into&nbsp;other&nbsp;groups:&nbsp;guest&nbsp;no
<br />        :ENTER
<br />        Login&nbsp;class&nbsp;daemon&nbsp;default&nbsp;staff&nbsp;:ENTER
<br />        Enter&nbsp;password&nbsp;[]:ENTER                #&nbsp;在此直接按ENTER键。这样就可以<a target="_blank" href="#" class="UBBWordLink">设置</a>一个不可用的密码。
<br />        Set&nbsp;the&nbsp;password&nbsp;so&nbsp;that&nbsp;user&nbsp;cannot&nbsp;logon?&nbsp;(y/n)&nbsp;:&nbsp;y
<br />
<br />        Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ftp
<br />        Password:&nbsp;&nbsp;&nbsp;&nbsp;****
<br />        Fullname:&nbsp;&nbsp;&nbsp;&nbsp;anonymous&nbsp;ftpd&nbsp;user
<br />        Uid:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1001
<br />        Gid:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1001&nbsp;(ftp)
<br />        Groups:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ftp
<br />        Login&nbsp;Class:&nbsp;default
<br />        HOME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/var/ftp
<br />        Shell:
<br />        OK?&nbsp;(y/n)&nbsp;:&nbsp;y
<br />        Added&nbsp;user&nbsp;``ftp''
<br />        Copy&nbsp;files&nbsp;from&nbsp;/etc/skel&nbsp;to&nbsp;/var/ftp
<br />        Add&nbsp;another&nbsp;user?&nbsp;(y/n)&nbsp;:&nbsp;n
<br />        Goodbye!
<br />        #</pre>
<p><br />
<br />
到这里,添加用户的工作就完成了。还需要把从/etc/skel复制到$HOME目录的一些&quot;dot&nbsp;files&quot;给删除, <br />
以免暴露信息。&quot;dot&nbsp;files&quot;的第一行通常会有一些<a target="_blank" href="#" class="UBBWordLink">系统</a>的信息,比如&quot;~/.cshrc&quot;文件中就有这么一行: <br />
<br />
#&nbsp;$OpenBSD:&nbsp;dot.cshrc,v&nbsp;1.5&nbsp;2005/02/16&nbsp;06:56:57&nbsp;matthieu&nbsp;Exp&nbsp;$ <br />
<br />
这至少就告诉了匿名登录的用户,这是个OpenBSD系统。所以把它们删除: <br />
<br />
#&nbsp;rm&nbsp;-f&nbsp;/var/ftp/.* <br />
<br />
<b>3:为/var/ftp目录<a target="_blank" href="#" class="UBBWordLink">设置</a>正确的权限以保证安全性;</b>
                <br />
<br />
3.1:&quot;~ftp&quot;目录; <br />
<br />
&quot;~ftp&quot;目录表示&quot;ftp&quot;用户的主目录,在本例中就是&quot;/var/ftp&quot;目录。 <br />
将它的owner设置为&quot;root&quot;,权限<a target="_blank" href="#" class="UBBWordLink">设置</a>为任何人都不可写(555): <br />
<br />
#&nbsp;chown&nbsp;-R&nbsp;root:wheel&nbsp;/var/ftp <br />
#&nbsp;chmod&nbsp;-R&nbsp;555&nbsp;/var/ftp <br />
<br />
3.2:&quot;~ftp/bin&quot;目录; <br />
<br />
这个目录并不是必须的。如果希望匿名用户登录到FTP后能够执行一些command,就可以将command <br />
复制到这个目录下。所有的command的权限都应该<a target="_blank" href="#" class="UBBWordLink">设置</a>为只允许执行(111)。 <br />
<br />
#&nbsp;mkdir&nbsp;/var/ftp/bin <br />
#&nbsp;chown&nbsp;-R&nbsp;root:ftp&nbsp;/var/ftp/bin <br />
#COPY&nbsp;YOUR&nbsp;PROGRAMS&nbsp;TO&nbsp;/var/ftp/bin,AND&nbsp;THEN: <br />
#&nbsp;chmod&nbsp;-R&nbsp;111&nbsp;/var/ftp/bin/* <br />
<br />
3.3:&quot;~ftp/etc&quot;目录; <br />
<br />
和&quot;~ftp/bin&quot;目录一样,这也是个可选的,并不推荐创建它。(更多关于该目录<a target="_blank" href="#" class="UBBWordLink">设置</a>的信息请查看&quot;ftpd&quot; <br />
的man文档)。 <br />
<br />
3.4:&quot;~ftp/pub&quot;目录: <br />
<br />
这个目录用来存放你希望被匿名用户访问的文件。权限应该<a target="_blank" href="#" class="UBBWordLink">设置</a>为555。 <br />
<br />
&nbsp;</p>
<pre>
        #&nbsp;chown&nbsp;-R&nbsp;root:ftp&nbsp;/var/ftp/pub
<br />        #&nbsp;chmod&nbsp;-R&nbsp;555&nbsp;/var/ftp/pub</pre>
<p><br />
<br />
这里虽然提到了创建三个目录,但是实际上我们只需要创建&quot;~ftp/pub&quot;目录并<a target="_blank" href="#" class="UBBWordLink">设置</a>好权限就可以了。 <br />
<br />
<b>4:chroot匿名登录的用户;</b>
                <br />
<br />
&quot;ftpd&quot;会将&quot;/etc/ftpchroot&quot;文件中列出的用户都chroot。要使&quot;ftp&quot;用户在登录ftp后被chroot,只需要简单 <br />
地把用户名添加到这个文件中就可以了。这是一个示例文件: <br />
<br />
#&nbsp;file&nbsp;:&nbsp;/etc/ftpchroot <br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$OpenBSD:&nbsp;ftpchroot,v&nbsp;1.3&nbsp;1996/07/18&nbsp;12:12:47&nbsp;deraadt&nbsp;Exp&nbsp;$ <br />
# <br />
#&nbsp;list&nbsp;of&nbsp;users&nbsp;(one&nbsp;per&nbsp;line)&nbsp;given&nbsp;ftp&nbsp;access&nbsp;to&nbsp;a&nbsp;chrooted&nbsp;area. <br />
#&nbsp;read&nbsp;by&nbsp;ftpd(8). <br />
ftp <br />
bibby <br />
<br />
&quot;ftpd&quot;在启动时会读取这个文件,如果&quot;ftp&quot;和&quot;bibby&quot;这两个用户登录ftp,将被分别chroot到自己的$HOME目录下。 <br />
<br />
<b>5:其他一些相关文件;</b>
                <br />
<br />
/etc/ftpusers&nbsp;--&nbsp;列出了所有不受欢迎的用户。列在该文件中的用户都无法登录ftp。 <br />
/etc/ftpwelcome&nbsp;--&nbsp;欢迎信息。登录上ftp的用户都将在登录时看到这一信息。 <br />
/etc/motd&nbsp;--&nbsp;如果&quot;/etc/ftpwelcome&quot;文件不存在,则使用&quot;/etc/motd&quot;文件的内容做为欢迎信息。 <br />
&quot;.message&quot;&nbsp;--&nbsp;这个文件可以被放置在&quot;~ftp&quot;目录下的任何一个子目录中。用户进入该目录时就会显示这个 <br />
文件中的内容。<br />
&nbsp;</p>
頁: [1]
查看完整版本: 用OpenBSD 3.8 release自带的FTPD架设FTP服务器