由于拒绝服务攻击工具的泛滥,及所针对的协议层的缺陷短时无法改变的事实,拒绝服务攻击也就成为流传广泛、极难防范的一种攻击方式。虽然到目前为止,没有一个绝对的方法可以制止这类攻击;但对于不同的攻击方式,还是有一些解决方法的。本文以Redhat Linux 9.0为例,介绍如何分类防范DoS。
Linux服务器的两种守护进程
1.stand-alone模式
stand-alone方式是Unix传统的C/S模式的访问模式。服务器监听(Listen)在一个特点的端口上等待客户端的联机。如果客户端产生一个连接请求,守护进程就创建(Fork)一个子服务器响应这个连接,而主服务器继续监听,以保持多个子服务器池等待下一个客户端请求。Stand-alone模式的工作原理如图1所示。
工作在stand-alone模式下的网络服务有route、gated。大家比较熟悉的Web服务器是Apache和邮件服务器Sendmail。在Apache这种负载很大的服务器上,预先创子服务器可以提高客户的服务速度。
在Linux系统中通过stand-alone工作模式启动的服务由/etc/rc.d/下面对应的运行级别当中的符号链接启动。
2.xinetd模式
从守护进程的概念可以看出,对于系统所要通过的每一种服务都必须运行一个监听某个端口连接所发生的守护进程,这通常意味着资源浪费。为了解决这个问题,Linux引进了“网络守护进程服务程序”的概念。
Redhat Linux 9.0使用的网络守护进程是xinetd(eXtended InterNET daemon)。和stand-alone模式相比,xinetd模式也称Internet Super-Server(超级服务器)。xinetd能够同时监听多个指定的端口,在接受用户请求时能根据用户请求端口的不同,启动不同的网络服务进程来处理这些用户请求。我们可以把xinetd看成一个管理启动服务的管理服务器,它决定把一个客户请求交给哪个程序处理,然后启动相应的守护进程。xinetd模式的工作原理如图2所示。
和stand-alone工作模式相比,系统不想要每一个网络服务进程都监听其服务端口,运行单个xinetd就可以同时监听所有服务端口,这样就降低了系统开销,保护了系统资源。但是对于访问量大、经常出现并发访问时,xinetd想要频繁启动对应的网络服务进程,反而会导致系统性能下降。
察看系统为Linux服务提供哪种模式方法,在Linux命令行下使用pstree命令,可以看到两种不同方式启动的网络服务。一般来说系统一些负载高的服务,如Sendmail、Apache服务是单独启动的,而其他服务类型都可以使用xinetd超级服务器管理,系统默认使用xinetd的服务可以分为如下几类:
标准互联网服务:telnet、ftp
信息服务:finger、netstat、systat
RPC服务:rquotad、rstatd、rusersd、sprayd、walld
BSD服务:comsat、exec、login、ntalk、shell、talk
内部服务:chargen、daytime、echo、servers、services time
安全服务:irc
其他服务:name、tftp、uucp
小提示:从原理上Apache、sendmail也可以使用xinetd模式启动,但是您需要硬件档次非常高的服务器。
针对xinetd模式的DoS防范
xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全,能有效防止DoS:
1.限制同时运行的进程数
通过设置instances选项设定同时运行的并发进程数。例如:
instances=20
说明:当服务器被请求连接的进程数达到20个时,xinetd将停止接受多出部分的连接请求,直到请求连接数低于设定值为止。
2.限制一个IP地址的最大连接数
通过限制一个主机的最大连接数来防止某个主机独占某个服务。例如:
per_source=5
说明:单个IP地址的连接数是5个。
3.限制日志文件大小,防止磁盘空间被填满
许多攻击者知道大多数服务需要写入日志。入侵者可以构造大量的错误信息发送出来,服务器记录这些错误,很可能就造成日志文件非常庞大,甚至会塞满硬盘。管理员面对大量的日志,也很难发现入侵者真正的入侵途径。因此,限制日志文件大小是防范DoS的一个方法。例如:
log_type FILE.1 /var/log/myservice.log 8388608 15728640
说明:这里设置的日志文件FILE.1临界值为8MB,到达此值时syslog文件中会出现警告,到达15兆,系统会停止所有使用这个日志系统的服务。
4.限制负载
xinetd还可以使用限制负载的方法防范DoS。用一个浮点数作为负载系数,当负载达到这个数目时,该服务将暂停处理后续的连接。例如:
max_load=2.8
说明:当一项系统负载达到2.8时,所有服务将暂时终止,直到系统负载下降到设定值以下。
当然,要使用这个选项,编译时要加入-with-loadavg,xinetd将处理max-load配置选项,从而在系统负载过重时关闭某些服务进程,来实现某些拒绝服务攻击。
5.限制所有服务器数目(连接速率)
xinetd可以使用cps选项设定连接速率。例如:
cps=25 60
说明:第一个参数表示每秒可以处理的连接数,如果超过了这个连接数,进入的连接将被暂时停止处理;第二个参数表示停止处理多少秒后继续处理先前暂停处理的连接。即服务器最多启动25个连接,如果达到这个数目将停止启动新服务60秒。在此期间不接受任何请求。
6.限制对硬件资源的利用
通过rlimit_as和rlimit_cpu两个选项可以有效限制一种服务对内存、中央处理器的资源占用。例如:
rlimit_as=8M
rlimit_cpu=20
说明:此设定限制了对服务器硬件资源的占用,最多可用内存为8M,CPU每秒处理20个进程。
总结:xinetd的一个重要功能是它能够控制从属服务可以利用的资源量,通过以上设置可以达到这个目的,有助于防止某个xinetd服务大量占用系统,从而导致“拒绝服务”情况的出现。
针对stand-alone的DoS防范
Linux下以stand-alone模式运行的服务器主要是Apache、Sendmail。
1.Apache服务器防范DoS措施
Apache服务器对拒绝攻击的防范主要通过软件Apache DoS Evasive Maneuvers Module来实现。它是一款mod_access的替代软件,可以对抗DoS攻击。该软件可以快速拒绝来自相同地址对同一URL的重复请求,这是通过内部一张各子进程的哈希表查询来实现的。软件下载链接:http://online.securityfocus.com/data/tools/dospatch.tar.gz,软件安装的配置可以查看相关页面。
另外,在Apache配置文件中,有一些安全相关的指令可以使用。http://httpd.apache.org/docs/mod/directives.html。使用以下指令可以帮助您减小DoS的威胁:
LimitRequestBody:数字参数,控制HTTP请求的大小。
LimitRequestFields:数字参数,控制请求头的数目。
KeepAlive:设置连接的生存期。
KeepAliveTimeout:限制等待请求的时间。
使用以下指令可以帮助您减少缓冲区溢出的危险:
LimitRequestFieldSize:限制每个请求头的大小。
LimitRequestLine:限制每个请求行的大小。
此外,Apache服务器管理员还应该经常去http://www.apache.org/dist/httpd/查看、下载补丁程序,以确保Web服务器的安全。
2.Sendmail服务器防范DoS措施
由于电子邮件的性质,一个要攻击邮件服务器的攻击者可以轻易地使用邮件来充斥服务器,从而导致DoS。通过设置/etc/mail/sendmail.mc以下目录的限度,这类攻击的有效性就会大受限制。
confCONNECTION_RATE_THROTTLE:服务器每秒能够接受的连接数量。按照默认设置,Sendmail是不限制连接数量。如果连接数量达到限度,以后的连接就会被延迟。推荐值:40。
confMAX_DAEMON_CHILDREN:服务器能够Fork出的子进程的最大数量。按照默认设置,Sendmail不限制子进程的数量。如果限度被设置,达到限度后的连接就会被延迟。推荐根据内存容量设置:128M内存建议值为40。
confMIN_FREE_BLOCKS:文件系统用来接受标准SMTP(简单邮件传输协议)邮件的队列中的最少自由块数,越小越容易被攻击致命。默认为100块,推荐值为4000或者更大。
confMAX_HEADERS_LENGTH:消息头可接受的最大限度(以字节为单位)。默认为不限制,推荐值是64。
confMAX_MESSAGE_SIZE:单个消息可接受大小的最大限度(以字节为单位)。越大越容易被攻击致命。默认为不限制,推荐值为5242880。
另外,不要把邮件假脱机目录/var/spool/mail/放在NFS共享文件卷上。因为NFS对用户组群ID没有控制,几个UID相同的用户可以收到和阅读彼此的邮件。
限制整体资源的占用
还可以对系统资源做限制,使得系统增强抗DoS能力。
编辑/etc/security/limits.conf文件,添加下面几行:
* hard core 0
* hard rss 10000
* hard nproc 30
说明:“core 0”表示禁止创建core文件;“nproc 30”把最多进程数限制到30;“rss 10000”表示除了root之外,其他用户都最多只能用10MB内存。 “*”表示的是所有登录到系统中的用户。
上面这些对登录到系统中的用户有效。通过这些限制,就能更好地控制系统中的用户对进程、core文件和内存的使用情况。最后编辑“/etc/pam.d/login”文件,在文件末尾加入:
session required /lib/security/pam_limits.so
来源:赛迪网