红联Linux门户
Linux帮助

建立安全的wu-ftpd服务器

发布时间:2006-05-24 09:05:55来源:红联作者:Vs
在Linux下,我们可以用wu-ftp、tftp-server、proftpd、vsftp等FTP服务程序来构建FTP服务器。由于wu-ftp(Washington University Ft
p)广泛使用在各种Linux发行版本和多种的Unix(其中包括了IBM AIX、FreeBSD、HP-UX、各种BSD、Solaris等)中,同时它在因特网中的占有量超过了50%,并且现在Linux发行版本中都带有不同版本的wu-ftp。Wu-ftpd菜单可以帮助您轻松地实现对FTP服务器的配置:支持构造安全方式的匿名FTP的访问,可以控制同时访问的用户的数量,限制可以允许访问的IP网段,并可以在一台主机上设置多个虚拟目录。Wu-ftpd有三种注册方式:匿名FTP、实际用户FTP、guest FTP。匿名FTP使用用户名'anonymous'和一个email类型的口令进行注册。 Wu-ftpd发布较早,Server的组织较为零散,安全性较Proftpd差,但稳定性较好,尤其同时联机人数一多,很明显的,Wu-ftpd要比Proftpd来的好,不过,在Wu-ftpd Server上内定是不提供匿名服务的,若要提供匿名ftp服务还需加装anonftp。 在最新版里(2.6.1)已经对最为人病垢的系统安全性问题做一完善的修正,因此还是Ftp 服务器中的主流。下列是Wu-Ftpd的一些功能:

1.可对不同网域做不同存取权限和可存取时段。

2.提供user在下载档案的时,可自动压缩或解压。

3.可记录FTP Server使用情形。

4.可限定最多联机人数,以符合整体运作效能。

5.显示相关讯息,让使用者了解接收状态。

6.可将FTP Server暂停,便于系统维护。

7.支持虚拟FTP主机(Virtual FTP Servers)

一、wu-ftpd服务面临的安全隐患

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

1、缓冲区溢出攻击

长期以来,缓冲区溢出已经成为计算机系统的一个问题。利用计算机缓冲区溢出漏洞进行攻击的最著名的案例是莫里斯蠕虫,发生在1988年11月。但即使其危害人所共知,缓冲区溢出仍然是现在入侵的一个重要手段。缓冲区溢出的概念:缓冲区溢出好比是将一百公斤货物放进一个只能装十公斤的容器里。缓冲区溢出漏洞是一个困扰了安全专家30多年的难题。简单来说,它是由于编程机制而导致的、在软件中出现的内存错误。这样的内存错误使得黑客可以运行一段恶意代码来破坏系统正常地运行,甚至获得整个系统的控制权。

2、数据嗅探

FTP是传统的网络服务程序,在本质上是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”转手后做了手脚之后,就会出现很严重的问题。 截获这些口令的方式主要为暴力破解。另外使用sniffer程序监视网络封包捕捉FTP开始的会话信息,便可顺手截获root密码。

3. 系统漏洞

匿名访问方式在FTP服务当中被广泛的支持,但是由于匿名FTP不需要真正的身份验证,因此很容易为入侵者提供一个访问通道,配合缓冲区溢出攻击,会造成很严重的后果。世界第一个Linux Ramen病毒是利用了Linux某些版本(Redhat6.2和7.0)的rpc.statd和wu-ftpd这两个安全漏洞进行传播的。

4. 拒绝服务攻击

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

二、 加固wu-ftpd服务端

1.版本升级和安全自定义

升级陈旧的wu-ftpd版本,因为早期的wu-ftpd版本(2.6.1以前)存在的安全漏洞。例如,Linux下第一个病毒:Ramen蠕虫就是利用匿名访问漏洞和缓冲区溢出攻击对著名的wu--ftpd服务器造成了极大的威胁。

特别是对于一个新配置的wu-ftpd服务器来说使用最新稳定版本是最明智的选择,可以在其官方网站下载其源代码进行编译。编译命令是:./configure option1 option2, 其中 option1 是第一个选项,option2是第二个选项,依此类推可以包括多个选项。

2.使用/etc/ftpaccess文件中的选项保护wu-ftpd

etc/ftpaccess文件中提供了一些选项,可以提高wu-ftpd的安全性。

(1)增强日志系统

尽量记录所有日志,一般情况wu-ftpd会记录所有用户类别(real:真实、anonymous:匿名、guest:来宾)的上传(inbound)和下载(outbound)情况。下面是常用的日志设定方法,如果希望了解所有数据传输情况,可以在/etc/ftpaccess加入一行:

log transfers anonymous,real,guest inbound,outbound

(2)限制对敏感文件和目录的访问

可以在/etc/ftpaccess文件中使用noretrieve目录限制对敏感文件和目录的访问。如果希望禁止用户修改核心目录:/etc下任何文件,可以在/etc/ftpaccess加入一行:

noretrieve /etc

另外如果wu-ftpd服务器同时运行Apache服务器,同样要确保其配置文件不能被匿名用户下载,可以在/etc/ftpaccess加入一行:

noretrieve noretrieve .htaccess .htpasswd class=anonymous


(3)限制匿名FTP用户的上传权限

在网络上,匿名FTP是一个很常用的服务,常用于软件下载网站,软件交流网站等,为了提高匿名FTP服务开放的过程中的安全性,我们希望修改匿名FTP用户的上传权限。匿名ftp的根目录(~ftp)和其子目录的拥有者不能为ftp帐号,或与ftp相同群组的帐号。这是 一般常见的设定问题。假如这些目录被ftp或与ftp相同群组的帐号所拥有,又没有做好防止写入的保护,入侵者便可能在其中增加文件(例如:.rhosts)或修改其它文件。方法如下:

upload /var/ftp * no

upload /var/ftp/incoming yes nobody ftp 0440 nodirs

noretrieve /var/ftp/incoming

说明:第一个命令首先禁止匿名FTP账户向所有目录上传,接着建立一个目录:/var/ftp/incoming。然后设定这个目录的文件属于nobody用户的ftp用户组。文件权限设置为:0440(-r--r-----),这样匿名用户就不能创建任何目录。最后设定/var/ftp/incoming目录中文件不可恢复。

(4)限制普通FTP用户可以访问的目录

通常我们希望普通FTP用户在自己的目录下操作,但是一些FTP用户总是喜欢到其他目录(特别是在根目录、系统目录、其他用户的目录中)读取一些不该他读取的文件。下面我们需要把这些用户限制在自己目录中:

a.创建一个组,用groupadd命令,一般可以就用ftpuser组:

groupadd ftpuser

b.创建一个用户如mytestuser,建立用户可用adduser命令:

Adduser mytestuser

c.修改/etc/ftpaccess文件,加入guestgroup的定义:

chmod yes guest

delete yes guest

overwrite yes guest

rename yes guest

guestgroup ftpuser

除了加 guestgroup ftpuser 这行,其他4行也要加上,否则用户登陆后,虽然可以达到用户不能返回上级目录的目的,结果是却只能上传,不能覆盖、删除自己的文件。

d.向这个用户的根目录下拷贝必要的文件:

cp -rf /home/ftp/lib /home/mytestuser

cp -rf /home/ftp/bin /home/mytestuser

通常把 /home/ftp/下的bin,lib两个目录拷贝到这个用户的根目录下,因为一些命令(例如ls命令)需要Lib库支持,否则不能列目录。

e.关闭用户的telnet权限:

adduser mytestuser -g ftpuser -s /dev/null

经过以上设置,mytestuser这个用户的所有FTP操作将限制在他自己的/home/mytestuser目录中。

(5)通过ip地址进行限制访问

另外我们要经常监控/var/log/secure日志,并且注意那些来路不明的FTP连接,可以使用命令:“/usr/bin/host IP_address”解析可疑IP地址,使用命令“/usr/sbin/traceroute IP_address”获取该IP地址的网络路径。如果你在一个地区根本没有一个用户,使用命令“/usr/sbin/traceroute IP_address”却发现它来自这个地区,可以使用命令阻止它的FTP连接企图,在/etc/ftpaccess加入一行:

deny 10.1.2.125

这样来自10.1.2.125的主机不能进行FTP连接。

3.通过用户名称限制FTP访问

wu-ftpd可以加入嵌入式认证模块,成为PAM-aware的FTP服务器。PAM和PAM-aware相关知识和配置请察看笔者得:动手加
固OpenSSH服务器琏接:http://www.ccw.com.cn/server/yyjq/htm2005/20051108_09KRE.htm 。这样用户连接到FTP服务器时都由PAM使用/etc/pam.d/ftp文件进行认证。PAM具体使用方法:下面手工建立一个/etc/pam.d/ftp文件包括以下内容:

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

(1)使用黑名单方法

如果要禁止某个用户连接FTP服务器,只有将他的用户名称加入/etc/ftpusers文件中即可。当一个被禁止访问FTP服务器的用户cjh1试图访问FTP服务器时,日志文件/var/log/messages会发出错误信息:

Dec 1 13:11:36 k2 ftpd[1988]: PAM-listfile: Refused user cjh1 for service ftp

(2)使用白名单方法

这种方法更加安全,它不会发生遗漏现象。你只要把允许访问FTP服务器的用户列出即可。其他用户一律不能访问。方法如下,在/etc/pam.d/ftp中加入一行:

auth required /lib/security/pam_listfile.so item=user \

sense=allow file=/etc/userlist.ftp onerr=fail

然后创建一个文本文件:/etc/userlist.ftp。文件格式非常如下:每行包括一个用户名称即可。

高级应用:

如果允许访问FTP服务器的用户比较多,手工建立/etc/userlist.ftp比较麻烦,可以使用命令:

awk -F: ‘{print $1}’ /etc/passwd > /etc/userlist.ftp

这个命令会产生基于/etc/passwd的/etc/userlist.ftp用户列表,然后进行一些修改即可。

4.修改Wu-FTPD口

Wu-FTPD用xinetd守护进程来控制服务,可以通过xinetd进行相应管理,例如可以通过修改/etc/services控制其端口。标准FTP主要使用的端口为21(通信端口)和20(数据端口)。如果在/etc/services中将这两个端口改为20000和20001,并重新启动xinetd服务,Wu-FTP进程将工作在这两个端口。这样即便有人扫描到这些端口,也很难猜到这些端口的用途,也就无法采取进一步的攻击行动了。

5.使用防火墙保护Wu-FTPD服务器

(1)初试化配置方案

要使用iptables,还必须载入相关模块,使用以下命令载入相关模块:

#modprobe iptable_tables

/sbin/iptables -t filter -F

/sbin/iptables -t nat -F

/sbin/iptables -t mangle -F #清除现有的规则

modprobe命令会自动载入指定模块及其相关模块;iptables_filter模块会在运行时自动载入。

# /sbin/iptables -P FORWARD DROP #设置默认策略,丢弃所有除允许之外的从内网来的包

(2)保障防火墙自身安全

不回应 ICMP 封包

/sbin/iptables -t filter -A INPUT -p icmp --icmp-type echo-requested -j DROP

/sbin/iptables -t filter -A OUTPUT -p icmp --icmp-type echo-reply -j DROP

/sbin/iptables -t filter -A FORWARD -p icmp --icmp-type echo-requested -j DROP

/sbin/iptables -t filter -A FORWARD -p icmp --icmp-type echo-reply -j DROP

防止 IP Spoofing

IP Spoofing 是把外来的封包假装成是内部网络所发出的, 试途让防火墙误认而允许其进入内部网络。而要防止 IP Spoofing, 我们只须要过滤那些从 Internet 进入而声称来源地址是内部网络的封包便可。

/sbin/iptables -t filter -A INPUT -i $EXTERNAL_NIC -s $INTERNAL_NET -j DROP

/sbin/iptables -t filter -A FORWARD -i $EXTERNAL_NIC -s $INTERNAL_NET -j DROP

防止网络扫描

网络扫描是利用一些不正常而又合法的封包去检测服务器所提供的服务和取得一些系统信息。亦有入侵者用这些封包企途绕过防火墙去入侵内部网络, 所以必需过滤。

/sbin/iptables -t filter -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

/sbin/iptables -t filter -A FORWARD -p tcp --tcp-flags ALL ALL -j DROP

/sbin/iptables -t filter -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

/sbin/iptables -t filter -A FORWARD -p tcp --tcp-flags ALL NONE -j DROP

/sbin/iptables -t filter -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

/sbin/iptables -t filter -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

/sbin/iptables -t filter -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

/sbin/iptables -t filter -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

允许管理员以 SSH 方式连接到防火墙修改设定

最后,开设一个信道给管理员以 SSH 联机到防火墙修改设定。 不然的话, 每当有设定要修改时, 管理员便要亲身登入防火墙修改了。

/sbin/iptables -t filter -A INPUT -i $INTERNAL_NIC -s $INTERNAL_NET --dport 22 -j ACCEPT

6. 不能存取 shell

如果您选择拒绝让使用者通过telnet 或 ssh 存取 shell,您需要做的就是建立一个假的 shell,改名为NoAccess ,并将它放在 /etc/目录下。

touch /etc/NoAccess

添加以下内容:

/etc/NoAccess

#!/bin/sh

#

echo " Shell Access denied! "

echo " "

echo " You don't have a valid login for this server "

exit 0

储存文件并修改shell权限:

chmod +x /etc/NoAccess.

完成后,修改/etc/shells 档案,并加入刚建立的 shell。

/ etc/shells 档案如下:

/etc/shells

/bin/bash2

/bin/bash

/bin/sh

/bin/ash

/bin/bsh

/bin/tcsh

/etc/NoAccess

完成后而手动新增使用者,可用以下指令将使用者新增至适当的 shell:

adduser -g FTPgroup -s /etc/NoAcces "username"

三、安全使用客户端工具

以上已经安全加固了服务器端,要防范网络嗅探,即客户端向服务器传输数据过程的安全:防范网络嗅探的关键的文件传输过程,使用SSH上传数据到ProFTPD服务器可以把所有传输的数据进行加密,这样即使网络中的黑客能够劫持用户所传输的数据,如果不能解密的话,也不能对数据传输构成真正的威胁。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP提供一个安全的“传输通道”。在不安全的网路通信环境中,它提供了很强的验证(authentication)机制与非常安全的通信环境。Linux下基于SSH的工具有:命令行和图形界面两种。

1.命令行

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

表2 SFTP相关命令

子命令名称 说明
cd 变换目录
mkdir 建立子目录
ls 显示文件名称
pwd 列当前目录名称
rm 删除文件
ln 建立文件链接
charp 修改文件组属性
chmod 修改文件权限
rename 修改文件或目录名称
lpwd 显示当前位置
lmkdir 建立本地目录
put 上传文件
get 下载文件
exit 离开远程服务器


2.图形界面工具:gFTP

如果你使用命令行感觉比较繁琐。这里我们介绍一个安全快捷的数据传输工具:gFTP,它可以和SSH整合在一齐,提供一个图形化的加密传输方案。gFTP是一个多线程的FTP客户端,用GTK+编写。它支持多个线程同时下载,支持断点续传,支持FTP、HTTP和SSH协议,支持FTP和HTTP代理,可以下载整个目录,支持文件队列,支持缓存,支持拖拽操作,是一个很好的FTP客户端管理器。许多Linux发行版本都带有gFTP,也可以在其官方网址(http://www.gftp.org/ )下载。使用方法在gftp登录界面上,选择gftp 下拉菜单 FTP-> Options(选项), 在弹出的窗口中,选择SSH选项卡,在SSH2 sftp-server path框中填写/usr/libexec/openssh;并勾选Need SSH User/Pass;点击Save(保存)按钮,保存设置。 设置好后,在gftp登录界面上、登录密码后面的下拉菜单中选择SSH2。此时,输入远程主机名(或IP地址)、端口(22)、用户名、密码,按左侧的连接按钮,即可登录成功。这种方式对于登录匿名ftp服务服务器很有用。

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

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

共有 0 条评论