如何建立安全的ProFTPD应用经验谈(全)

来源:互联网 发布:上虞区干部网络 编辑:程序博客网 时间:2024/05/29 15:04
文章作者:曹江华 


ProFTPD是针对Wu-FTP的弱项而开发的,除了改进的安全性,还具备许多Wu-FTP没有的特点,能以Stand-alone、xinetd模式运行等。ProFTP已经成为继Wu-FTP之后最为流行的FTP服务器软件,越来越多的站点选用它构筑安全高效的FTP站点,ProFTP配置方便,并有MySQL和Quota模块可供选择,利用它们的完美结合可以实现非系统账号的管理和用户磁盘的限制。

一、 ProFTPD服务面临的安全隐患

ProFTPD服务面临的安全隐患主要包括:缓冲区溢出攻击(Buffer Overflow)、数据嗅探和匿名访问缺陷。

1、缓冲区溢出攻击

长期以来,缓冲区溢出已经成为计算机系统的一个问题。利用计算机缓冲区溢出漏洞进行攻击的最著名的案例是莫里斯蠕虫,发生在1988年11月。但即使其危害人所共知,缓冲区溢出仍然是现在入侵的一个重要手段。缓冲区溢出的概念:缓冲区溢出好比是将一百公斤货物放进一个只能装十公斤的容器里。

缓冲区溢出漏洞是一个困扰了安全专家30多年的难题。简单来说,它是由于编程机制而导致的、在软件中出现的内存错误。这样的内存错误使得黑客可以运行一段恶意代码来破坏系统正常地运行,甚至获得整个系统的控制权。

2、数据嗅探

FTP是传统的网络服务程序,在本质上是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到"中间人"(man-in-the-middle)这种方式的攻击。

所谓"中间人"的攻击方式,就是"中间人"冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被"中间人"转手后做了手脚之后,就会出现很严重的问题。 截获这些口令的方式主要为暴力破解。另外使用sniffer程序监视网络封包捕捉FTP开始的会话信息,便可顺手截获root密码。

3. 匿名访问缺陷

匿名访问方式在FTP服务当中被广泛的支持,但是由于匿名FTP不需要真正的身份验证,因此很容易为入侵者提供一个访问通道,配合缓冲区溢出攻击,会造成很严重的后果。

4. 拒绝服务攻击

拒绝服务是一种技术含量低,但攻击效果明显的攻击方式,受到这种攻击时,服务器或网络设备长时间不能正常提供服务,并且由于某些网络通讯协议本身固有的缺陷,难以提出一个行之有效的解决办法。防范拒绝服务攻击需要我们从全局去部署防御拒绝服务攻击策略,多种策略联动防范,将拒绝服务攻击的危害降至最低。

二、 加固ProFTPD服务端

1.升级版本

升级陈旧的ProFTPD版本,因为早期的ProFTPD版本存在的安全漏洞。对于一个新配置的ProFTPD服务器来说使用最新稳定版本是最明智的选择,可以在其官方网站下载其源代码进行编译。ProFTPD最新版本是1.2.10,官方网址:http://www.ProFTPD.org

2.使用xinetd方式运行ProFTPD

ProFTPD能以Stand-alone、xinetd两种模式运行,当用户账号比较少又经常需要连接到ProFTPD服务器时推荐使用xinetd模式运行。使用xinetd方式运行ProFTPD可以有效防范DoS攻击。

从传统的守护进程的概念可以看出,对于系统所要通过的每一种服务,都必须运行一个监听某个端口连接所发生的守护进程,这通常意味着资源浪费。为了解决这个问题,一些Linux引进了"网络守护进程服务程序"的概念。

Redhat Linux 8.0以后的版本使用的网络守护进程是xinted(eXtended InterNET daemon)。和stand-alone模式相比xinted模式也称 Internet Super-Server(超级服务器)。xinetd能够同时监听多个指定的端口,在接受用户请求时,他能够根据用户请求的端口不同,启动不同的网络服务进程来处理这些用户请求。

可以把xinetd看做一个管理启动服务的管理服务器,它决定把一个客户请求交给那个程序处理,然后启动相应的守护进程。xinetd模式工作原理见图1。






图1 xinetd模式网络服务


和stand-alone工作模式相比,系统不想要每一个网络服务进程都监听其服务端口。运行单个xinetd就可以同时监听所有服务端口,这样就降低了系统开销,保护系统资源。但是对于访问量大、经常出现并发访问时,xinetd想要频繁启动对应的网络服务进程,反而会导致系统性能下降。察看系统为Linux服务提供那种模式方法在Linux命令行可以使用pstree命令可以看到两种不同方式启动的网络服务。

xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。能有效的防止拒绝服务攻击(Denial of Services):

1、限制同时运行的进程数。

通过设置instances选项设定同时运行的并发进程数:

instances=20

当服务器被请求连接的进程数达到20个时,xinetd将停止接受多出部分的连接请求。直到请求连接数低于设定值为止。

2.限制一个IP地址的最大连接数:

通过限制一个主机的最大连接数,从而防止某个主机独占某个服务。

per_source=5

这里每个IP地址可以连接单个IP地址的连接数是5个。

3.限制负载。

xinetd还可以使用限制负载的方法防范拒绝服务攻击。用一个浮点数作为负载系数,当负载达到这个数目的时候,该服务将暂停处理后续的连接:

max_load = 2.8

上面的例子中当一项系统负载达到2.8时,所有服务将暂时中止,直到系统负载下降到设定值以下。说明要使用这个选项,编译时要加入--with-loadavg ,xinetd将而已处理max-load配置选项。从而在系统负载过重时关闭某些服务进程,来实现某些拒绝服务攻击。

4.限制所有服务器数目(连接速率) 。

xinetd可以使用cps选项设定连接速率,下面的例子:

cps = 25 60

第一个参数表示每秒可以处理的连接数,如果超过了这个连接数之后进入的连接将被暂时停止处理;第二个参数表示停止处理多少秒后继续处理先前暂停处理的连接。即服务器最多启动25个连接,如果达到这个数目将停止启动新服务60秒。在此期间不接受任何请求。

使用xinetd方式运行ProFTPD的步骤:

(1)检查确省运行情况

确省情况下ProFTPD以stand-alone工作模式运行,可以使用"ps aux| grep proftpd"命令查看进程号,然后使用kill命令中止运行。

(2)修改配置文件

修改/etc/proftpd.conf文件的ServerType选项由"standalone"改为"inetd"。

(3)建立用户组

groupadd nogroup

(4)创建配置文件/etc/xinetd.d/proftpd,代码如下:
引用:
service ftp
{
flags = REUSE socket_type =
stream instances = 30 cps =
25 60max_load = 3.0wait =
no user = root server =
/usr/local/sbin/proftpd log_on_success =
HOST PID log_on_failure =
HOST RECORD disable = no
}
5)重新启动xinetd配置

killall -USR1 xinetd

(6)使用命令连接服务器

可以使用"ftp localhost"连接本地服务器,如果连接被拒绝,可以使用命令:

tail -f /var/log/messages

查看错误信息。

3.隐藏ProFTPD服务器版本信息

通常软件的BUG信息是和特定版本相关的,因此版本号是黑客寻求最有价值的信息。隐藏ProFTPD版本号比较简单,修改配置文件:
引用:
/etc/Proftpd.conf:
ServerIdent off
4.伪装ProFTPD服务器

Windows下的FTP服务多是Serv-U,可以把ProFTPD伪装为Serv-U,方法是修改配置文件proftpd.conf,添加如下内容:


ServerIdent on /"Serv-U FTP
Server v5.0 for WinSock ready.../"




存盘退出后,重新启动proftpd服务,登录到修改了提示信息的FTP服务器进行测试:
引用:
C://>ftp 192.168.0.1Connected to
192.168.0.1.220 Serv-U FTP Server
v5.0 for WinSock ready...
User (192.168.0.1:(none)):
331 Password required for (none).
Password: 530 Login incorrect.
Login failed.
ftp > quit 221 Goodbye.
这样从表面上看,服务器就是一个运行着Serv-U的Windows了。

5. 使用非root权限运行ProFTPD

以非root权限运行ProFTPD。修改配置文件:
引用:
/etc/Proftpd.conf:
User nobody
#设置FTP服务以nobody运行 Group nogroup

#注意:原来是"Group nobody",一定要改为"Group nogroup "

上面的配置表示以nobody用户身份运行ProFTPD服务器。使用nobody身份运行能够降低缓冲区溢出攻击所带来的危险。

6.监控ProFTPD服务器运行情况

通常新部署一个ProFTPD服务器之后需要进行一段时间的监控:记录FTP连接记录、谁连接到我的FTP服务器。Proftpd本身附带了几个命令可以使用。

(1)记录FTP连接数

使用usr/local/bin/ftpcout命令,可以显示FTP服务器连接用户数量信息。 我们还可以使用watch命令配合使用,运行下面命令:
引用:
watch -n 360 /usr/local/bin/ftpcount
这个命令每三百六十秒显示一次连接用户数量的信息。

(2)查找谁与FTP服务器连接

使用usr/local/bin/ftpwho命令可以显示谁连接到FTP服务器。一个简单的输出如下:
引用:
Master proftpd process 8322:
8387 0m1s proftpd: sheila -
reboot.intevo.com: IDLE 8341
3m59s proftpd: kabir -
k2.intevo.com: IDLE - - 2 users
以上输出显示有两个用户(sheila和kabir)从不同的计算机连接到FTP服务器,输出内容还包括:为这些用户服务的ProFTPD的进程和主ProFTPD的进程ID。

7.修改配置文件加固服务器

ProFTPD使用的配置文件和Apache类似:

单线指令:ServerName 和 ServerType

多线容器指令:和

如果以前配置过Apache的话,会很容易掌握。Proftpd服务器配置文件etc/Proftpd.conf中的许多选项可以加固服务器。

(1)通过IP地址限制FTP访问

假设要允许主机名称myhost.domain.com访问FTP服务器,首先使用命令:

Ping myhost.domain.com

假设等到IP地址是:216.112.169.138。下面修改配置文件,加入以下内容:
引用:
<Limit LOGIN>Order Allow,
DenyAllow from 216.112.169.138Deny
from all</Limit>
注意不要在Allow命令后直接使用主机名称,因为检查主机名称会降低服务器的运行速度。另外主机名称比IP地址更具有欺骗性。如果myhost.domain.com没有固定IP地址,主机用户在下一次从ISP获得一个IP地址时就无法和FTP服务器连接。这时必须给整个网络授予FTP访问的权限。命令如下:"Allow from 216.112.169." 。

(2)使用PAM作为ProFTPD授权用户的鉴别方法

ProFTPD可以加入嵌入式认证模块,成为PAM-aware的FTP服务器。PAM全称:Pluggable Authentication Module(嵌入式认证模块)。

它最初有SUN公司开发;很快被Linux社区的接受,并且开发了更多的模块。其目标是提供一套可用于验证用户身份的函数库,从而将认证从应用程序开发中独立出来。PAM工作原理见用SRP建立安全的Linux Telnet服务器(链接:http://tech.ccidnet.com/art/302/20050915/333529_1.html )一文。

下面手工建立一个/etc/pam.d/ftp文件包括以下内容:
引用:
%PAM-1.0 auth required
/lib/security/pam_listfile.so
item=user / sense=deny
file=/etc/ftpusers
onerr=succeed auth required
/lib/security/pam_stack.so
service=system-auth auth
required /lib/security/
pam_shells.so account required
/lib/security/pam_stack.so
service=system-auth session
required /lib/security/pam_stack.so
service=system-auth
每一行包括以下内容:

module-type(模块类型) control-flag(控制字) module-path(模块路径) module-args(模块参数)。以上四个选项我们主要介绍module-type(模块类型)和control-flag(控制字),见表-1、表-2:

表-1 PAM模块类型




(3)对FTP用户使用chroot

ProFTPD服务器要限制普通FTP用户可以访问的目录,配置很简单,如果限制skate组的skate用户登录时不能切换到其他目录,修改配置文件加入一行:

DefaultRoot ~ skate,skate

这样他只能呆在自己的home目录中。

(4)限制FTP命令特权

l 禁止一些用户创建和删除目录的特权

如果发现一些用户有威胁行为,可以把他放在一个特定组中(badusers)使用如下的配置:


<Directory /*>
<Limit MKD RMD>
Order deny,allowDenyGroup badusersAllowAll
</Limit></Directory>




这样除了那个特定的用户组之外,其他用户可以创建和删除目录。建立只能上载的FTP服务器,如果要建立一个只能上载的FTP服务器,在主服务器或者虚拟主容器中使用如下配置:


<Directory /*> <Limit RETE>
DenyAll
</Limit> </Directory>




限制对单个目录的访问。


<Directory /*> <Limit CWD>
DenyAll
</Limit> </Directory>




这样相应的FTP用户就不能更改目录。如果使用DenyGroup groupname代替DenyAll ,将配置范围限定在/etc/group文件中定义的groupname用户组中。

限制目录浏览特权


<Directory /my/mp3s>
<Limit DIRS>
DenyGroup newfriends
</Limit>
</Directory>




以上配置可以限制/my/mp3s目录中名为newfriends组的目录浏览特权。这样可以防止他得到/my/mp3s目录的列表。

(5)控制FTP命令缓冲区大小

许多黑客通过发送一个大尺寸的命令攻击FTP服务器,希望造成服务器缓冲区溢出。可以在使用CommandBufferSize命令可以限制客户端命令长度。通常设定为512。

(6)修改ProFTPD服务器使用端口

ProFTP如果使用Stand-alone模式,可以通过设置proftpd.conf来控制它。使用不同端口的设置也较为简单,只需在proftpd.conf中将"Port xx"改为需要的值即可。

(7)使不同用户之间相互隔离

通常访问ISP的FTP服务器时,会看到一些不应当的系统信息,因此隐藏这些信息是必要的,下面是一个配置:
引用:
DefaultRoot "/www"
<Directory /www>
HideNoAccess on
<Limit ALL>
IgnoreHidden on
</Limit> </Directory>
HideNoAccess指令将用户隐藏/www 目录下的所有条目,IgnoreHidden指令指示ProFTPD 服务器忽略用户所有指令。


8.建立一个安全的匿名ProFTPD站点

如果人们只需要从FTP服务器等到一些小文件(几兆),可以使用Apache web服务器代替匿名FTP站点。如果要通过一个匿名账号频繁上传、下载文件,就要建立一个安全的ProFTPD服务器。下面是配置文件/etc/proftpd.conf内容(其中incoming目录容许用户上传文件):
引用:
<Anonymous ~ftp>
User ftp Group ftp RequireValidShell
off UserAlias anonymous
ftp MaxClients 40
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
<Directory incoming>
<Limit WRITE>
AllowAll
</Limit>
<Limit READ>
DenyAll
</Limit>
</Directory>
</Anonymous>
根据以上内容建立的ProFTPD服务器会为自动连接到匿名ProFTPD服务器的用户创建一个chroot限制,用户的主目录为站点的根目录。下面解释主要配置指令的作用:

User 和 Group:这两个指令确保User ftp和Group ftp拥有所有匿名会话。

RequireValidShell:由于在/etc/passwd中没有用户FTP的有效列表,所以该指令说明ProFTPD允许User ftp的匿名会话。

UserAlias:该指令把anonymous赋予FTP账号,以便所有用户可以使用ftp和anonymous作为用户名登录匿名FTP服务器。

MaxClients:这里限制匿名连接数目是40,你可以根据系统负载设定连接数目。

容器:这些容器给定目录的各种限制:

第一个目录容器对每个用户和每个目录禁止写权限(包括上传、删除和修改)。

第二个目录容器在incoming子目录中给每个用户写权限。

最后一个Limit指令确保在incoming子目录中上传文件的用户不能查看和恢复目录中的文件。


三、安全使用客户端工具

以上已经安全加固了服务器端,要防范网络嗅探,即客户端向服务器传输数据过程的安全:防范网络嗅探的关键的文件传输过程,使用SSH上传数据到ProFTPD服务器可以把所有传输的数据进行加密,这样即使网络中的黑客能够劫持用户所传输的数据,如果不能解密的话,也不能对数据传输构成真正的威胁。

SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP提供一个安全的"传输通道"。在不安全的网路通信环境中,它提供了很强的验证(authentication)机制与非常安全的通信环境。Linux下基于SSH的工具有:命令行和图形界面两种。

1. 命令行

笔者是系统管理员所以喜欢前者主要工具是:用 sftp 命令,sftp工具可以用来打开一次安全互动的 FTP 会话。它与 ftp 相似, 只不过,它使用安全、加密的连接。它的一般语法是:sftp username@hostname.com。一旦通过 验证,你可以使用一组和使用 FTP 相似的命令。SFTP相关命令的使用方法如下:


  


2.图形界面工具:gFTP

如果你使用命令行感觉比较繁琐。这里我们介绍一个安全快捷的数据传输工具:gFTP,它可以和SSH整合在一齐,提供一个图形化的加密传输方案。gFTP是一个多线程的FTP客户端,用GTK+编写。它支持多个线程同时下载,支持断点续传,支持FTP、HTTP和SSH协议,支持FTP和HTTP代理,可以下载整个目录,支持文件队列,支持缓存,支持拖拽操作,是一个很好的FTP客户端管理器。

许多Linux发行版本都带有gFTP,也可以在其官方网址(http://www.gftp.org/ )下载。gFTP工作界面见图。使用方法在gftp登录界面上,选择gftp 下拉菜单 FTP-> Options(选项), 在弹出的窗口中,选择SSH选项卡,在SSH2 sftp-server path框中填写/usr/libexec/openssh;并勾选Need SSH User/Pass;点击Save(保存)按钮,保存设置。 设置好后,在gftp登录界面上、登录密码后面的下拉菜单中选择SSH2。

此时,输入远程主机名(或IP地址)、端口(22)、用户名、密码,按左侧的连接按钮,即可登录成功。这种方式对于登录匿名ftp服务服务器很有用。






图 gFTP工作界面


另外如果使用Windows的话推荐使用Filezilla ,它是客户端使用SFTP的一款不错的开源软件,对中文支持很好。最新版本2.2.16,官方网址:http://filezilla.sourceforge.net/ 。使用它可以安全方便的向ProFTPD服务器上传下载数据。

总结:在众多网络应用中,FTP(文件传输协议)有着非常重要的地位。互联网一个十分重要的资源就是软件资源,而各种各样的软件资源大多数都放在FTP服务器中。系统管理员应当使安全保护方法对用户尽可能的简单。网络管理员要建立合理的用户痛苦量(痛苦量是指安全限制引起的抵制的函数)。以上从服务器到客户端介绍如何加固FTP应用。
原创粉丝点击