如何通过mod_qos(Apache2 Debian [Lenny])来保护slowloris DDoS
从Slowloris描述:
Slowloris的设计使得单个机器(可能是Windows的UNIX / UNIX机器似乎限制了在任何给定时间可以打开的套接字)可以通过锁定所有的线程来轻松地绑定典型的Web服务器或代理服务器因为他们耐心等待更多的数据。 某些服务器可能比其他服务器的延迟容忍度更小,但Slowloris可以通过自定义超时来补偿。 有一个额外的功能,以帮助您开始寻找适当大小的超时。 另外,Slowloris并没有消耗大量的资源,所以现代操作系统在遭受攻击的时候并不需要开始关闭套接字,这在某些情况下反而会使得Slowloris比典型的flooder更好。 将Slowloris认为是SYN洪水的HTTP等效物。
我最近不得不捍卫来自僵尸网络的slowloris-dos的现场攻击。 负载影响非常低,但是http退出服务速度非常快。 一个快速的方法是通过超时设置来处理,保护一个攻击者很好,但会导致新的问题(即客户端的大型NAT)。
mod_qos提供了一些细粒度的机会来缩放已使用的连接数,并根据带宽限制来防御攻击。 不幸的是,它只能作为源代码包使用,并且有很多可能的设置,可能很难为此特殊情况设置。 所以我提供了帮助我的方式。
获取源代码,构建和安装
mod_qos可以从sourceforge( http://sourceforge.net/projects/mod-qos/ )获得。 您将在这里找到文档http://mod-qos.sourceforge.net/ 。
cd /tmp/
wget http://downloads.sourceforge.net/sourceforge/mod-qos/mod_qos-8.13-src.tar.gz?use_mirror=freefr
tar xvfz mod_qos-8.13-src.tar.gz
您可能希望从sourceforge复制并粘贴直接链接。 当我们想使用apxs来编译mod_qos时,我们需要安装适当的dev包和gcc,当然也就是:
apt-get install apache2-threaded-dev gcc
现在构建和安装
cd mod_qos-8.13/apache2/
apxs2 -i -c mod_qos.c
如果一切顺利,你会得到这样的东西:
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/apache2/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 644 /usr/lib/apache2/modules/mod_qos.so
2.现在配置并激活
转到/ etc / apache2 / mods-available
并添加一个qos.load
和qos.conf
文件
cd /etc/apache2/mods-available/
vi qos.load
LoadModule qos_module /usr/lib/apache2/modules/mod_qos.so
vi qos.conf
## QoS Settings <IfModule mod_qos.c> # handles connections from up to 100000 different IPs QS_ClientEntries 100000 # will allow only 50 connections per IP QS_SrvMaxConnPerIP 50 # maximum number of active TCP connections is limited to 256 MaxClients 256 # disables keep-alive when 70% of the TCP connections are occupied: QS_SrvMaxConnClose 180 # minimum request/response speed (deny slow clients blocking the server, ie. slowloris keeping connections open without requesting anything): QS_SrvMinDataRate 150 1200 # and limit request header and body (carefull, that limits uploads and post requests too): # LimitRequestFields 30 # QS_LimitRequestBody 102400 </IfModule>
现在您需要启用该模块并重新启动apache:
a2enmod qos
/etc/init.d/apache2 restart
如果您能够通过https:// __ yourserver __ / server-status获取服务器状态
,则可以通过提供统计摘要来启用和运行mod_qos,如下所示:
mod_qos 8.13
|
|
前后
在服务器状态页面之上,您可以看到所有apache工作人员的摘要。 为了看看攻击之前和之后发生的情况,我使用了当地的环境。 所以这里的结果显示了不是现实世界的基本原理。
我们假设这样一个正常的服务器加载:
1 requests currently being processed, 5 idle workers
_.._W._...._...................................................
................................................................
当使用一台机器攻击这台服务器时,所有工作人员都被占用:
102 requests currently being processed, 0 idle workers
RRRRRRRRRRRRRWRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR..........................
正如你可以看到攻击采取apache服务器的所有可用线程,它本身保持在状态“R”(Keepalive(读))。 正常的apache将等待300秒关闭这样一个连接,并且攻击者不会发送任何真正的请求,只是保持所有打开的连接,不再有其他请求。
现在,启用了QoS模块,事情看起来不一样。 虽然apache启动了最大数量的童工,但它仍然可以服务于“真人请求”:
1 requests currently being processed, 97 idle workers
________W_______________________________________________________
__________________________________..............................
我们使用mod_qos配置apache以处理每个IP的有限数量的连接,并且喜欢提供“快速”请求。 攻击只是打开一个连接,而不发送真正的http-reqeuest(如GET /index.html HTTP 1.1)。 所以apache现在将其分类为“慢”请求,因为它必须等待很长时间才能获得攻击者的请求/响应。
真正的请求与更多的http-header一起发送“GET”更快。 所以如果所有的工作人员在遇到一个真正的请求时被攻击占用,那么apache就会丢失一个过时的连接,并以几乎正常的速度处理新的“严重”请求。
在现实世界的服务器上,您将获得这些图像(重新加载...重新加载...重新加载):
166 requests currently being processed, 0 idle workers
RRRRRCCCCRRRCRCRWRRRCRRCRCCRRCRRCCCRRRKCRRRRRRRRCRRRRRCRCCRC.RRC
C.RCR.RRC.CC.RCRR.RRRCR.C.C.RR.R.RRCCR.R.R...RRRRRRCCRRR.RRKC.CR
.RRR.C..RRRC.CCRRRR.RRC..R.CCRR.CR.RR.R.R.C.RR.C...C.C.RCRR.C.R.
..RRCRC.RCRCC..R.CCCW.............................R.............
97 requests currently being processed, 59 idle workers
___R_C_RR.CC_R_R_RRC_RCR._.R_RR.RRW___RR__RC______R_R_R__.K_._R.
RCRC___.CKRCRRRRRCR__CRR_RRRKR_RR.___.._._...RC..RR.CR.R.CRRR.R.
.R__._..RRRC.__R__R.R_R...._R_R.__.RR..._._..R.R...R.R.RR.R.R._.
.._RR_C.R.R_R.._.RRRR...........................................
51 requests currently being processed, 92 idle workers
___KR_R_K.._._.K__R__._..K.__._.R.W__R___R____.____K_____.__._R.
R_CKRK_.__RRRR_KK__RR.___RKR__R.R.__C..R._...__..R_.__._.K__R._.
.___._.._R__.C._RKR.__C....R__C.R_.__..._.C..K._...K._.._._._...
..___RK.R.___.._.____...........................................
126 requests currently being processed, 0 idle workers
RRKRRRRCRCCRRKRKCRRRKCRRRRRRCKCKRKRRRRRRKCRCCCRRKKKRRRRRC.....R.
.C.R.CR.RRC.RRRRRCCRR.RCCCRRRKR.K.R....R.R....R.....C..R.R.RR.R.
.........C.C....K.K.RRK....R..C.K..KC...C.C....R...C.R..W.C.R...
..KRR.R.R.RRR....RCRR...........................................
链接等
我提供这个howto作为一个可能的方式来解决这个特定的问题。 可能会有更多的方式(希望可以),就像使用代理,负载均衡器,七级防火墙等。
在我的情况下,我们必须在几分钟内找到一个快速的解决方案。 为了进一步阅读,您可能会发现这些链接有帮助:
- http://www.golem.de/0906/67854.html
- http://ha.ckers.org/slowloris/
- http://www.zdnet.de/news/wirtschaft_sicherheit_security_perl_skript__slowloris__legt_apache_websites_lahm_story-39001024-41005602-1.htm
- http://isc.sans.org/diary.html?storyid=6613
- http://mod-qos.sourceforge.net/
- http://ha.ckers.org/blog/20090617/slowloris-http-dos/