如何在 Apache 中抵御暴力破解和 DDoS 攻击

对于那些需要在因特网上提供服务或托管主机的人来说,保证您的系统在面对攻击时的安全是一个重要的事情。

mod_security(一个开源的用于Web应用入侵检测及防护的引擎,可以无缝地集成到Web服务器)和mod_evasive是两个在服务器端对抗暴力破解和(D)DoS攻击的非常重要的工具。

mod_evasive,如它的名字一样,在受攻击时提供避实就虚的功能,它像一个雨伞一样保护Web服务器免受那些威胁。

安装mod_security和mod_evasive来保护Apache

在这篇文章中我们将讨论如何安装、配置以及在RHEL/CentOS6、7和Fedora 21-15上将它们整合到Apache。另外,我们会模拟攻击以便验证服务器做出了正确的反应。

以上以您的系统中安装有LAMP服务器为基础,所以,如果您没有安装,请先阅读下面链接的文章再开始阅读本文。

(LCTT 译注:本文有修改。原文为了在RHEL/CentOS 7或Fedora 21中使用同样的工具,而删除了它们自带的 firewalld,使用了旧式的iptables。译者以为这样并不恰当,因此,译文中做了相应删节,并增加了firewalld的相应脚本。)

步骤 1: 安装mod_security和mod_evasive

另外,在安装LAMP后,您还需要在RHEL/CentOS 7/6中开启EPEL仓库来安装这两个包。Fedora用户不需要开启这个仓库,因为epel已经是Fedora项目的一部分了。


  1. # yum update && yum install mod_security mod_evasive

当安装结束后,您会在/etc/httpd/conf.d下找到这两个工具的配置文件。


  1. # ls -l /etc/httpd/conf.d

mod_security + mod_evasive 配置文件

现在,为了整合这两个模块到Apache,并在启动时加载它们。请确保下面几行出现在mod_evasive.conf和mod_security.conf的顶层部分,它们分别为:


  1. LoadModule evasive20_module modules/mod_evasive24.so
  2. LoadModule security2_module modules/mod_security2.so

请注意modules/mod_security2.so和modules/mod_evasive24.so都是从/etc/httpd到模块源文件的相对路径。您可以通过列出/etc/httpd/modules的内容来验证(如果需要的话,修改它):


  1. # cd /etc/httpd/modules
  2. # pwd
  3. # ls -l | grep -Ei '(evasive|security)'

验证mod_security + mod_evasive模块

接下来重启Apache并且核实它已加载了mod_evasive和mod_security:


  1. # service httpd restart [在RHEL/CentOS 6和Fedora 20-18上]
  2. # systemctl restart httpd [在RHEL/CentOS 7和Fedora 21上]


  1. # httpd -M | grep -Ei '(evasive|security)' [输出已加载的静态模块和动态模块列表]

检查mod_security + mod_evasive模块已加载

步骤 2: 安装一个核心规则集并且配置mod_security

简单来说,一个核心规则集(即CRS)为web服务器提供特定状况下如何反应的指令。mod_security的开发者们提供了一个免费的CRS,叫做OWASP([开放Web应用安全项目])ModSecurity CRS,可以从下面的地址下载和安装。

下载OWASP CRS到为之创建的目录


  1. # mkdir /etc/httpd/crs-tecmint
  2. # cd /etc/httpd/crs-tecmint
  3. # wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master

下载mod_security核心规则

解压CRS文件并修改文件夹名称


  1. # tar xzf master
  2. # mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs

解压mod_security核心规则

现在,是时候配置mod_security了

将示例的规则文件(owasp-modsecurity-crs/modsecuritycrs10_setup.conf.example)拷贝为同名的配置文件。


  1. # cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

并通过将下面的几行插入到web服务器的主配置文件/etc/httpd/conf/httpd.conf来告诉Apache将这个文件和该模块放在一起使用。如果您选择解压打包文件到另一个文件夹,那么您需要修改Include的路径:


  1. <IfModule security2_module>
  2. Include crs-tecmint/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
  3. Include crs-tecmint/owasp-modsecurity-crs/base_rules/*.conf
  4. </IfModule>

最后,建议您在/etc/httpd/modsecurity.d目录下创建自己的配置文件,在那里我们可以用我们自定义的文件夹(接下来的示例中,我们会将其命名为tecmint.conf)而无需修改CRS文件的目录。这样做能够在CRS发布新版本时更加容易的升级。


  1. <IfModule mod_security2.c>
  2. SecRuleEngine On
  3. SecRequestBodyAccess On
  4. SecResponseBodyAccess On
  5. SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
  6. SecDataDir /tmp
  7. </IfModule>

您可以在SpiderLabs的ModSecurity GitHub仓库中参考关于mod_security目录的更完整的解释。

步骤 3: 配置mod_evasive

mod_evasive被配置为使用/etc/httpd/conf.d/mod_evasive.conf中的指令。与mod_security不同,由于在包升级时没有规则来更新,因此我们不需要独立的文件来添加自定义指令。

默认的mod_evasive.conf开启了下列的目录(注意这个文件被详细的注释了,因此我们剔掉了注释以重点显示配置指令):


  1. <IfModule mod_evasive24.c>
  2. DOSHashTableSize 3097
  3. DOSPageCount 2
  4. DOSSiteCount 50
  5. DOSPageInterval 1
  6. DOSSiteInterval 1
  7. DOSBlockingPeriod 10
  8. </IfModule>

这些指令的解释:

  • DOSHashTableSize: 这个指令指明了哈希表的大小,它用来追踪基于IP地址的活动。增加这个数字将使得站点访问历史的查询变得更快,但如果被设置的太大则会影响整体性能。
  • DOSPageCount: 在DOSPageInterval间隔内可由一个用户发起的针对特定的URI(例如,一个Apache 提供服务的文件)的同一个请求的数量。
  • DOSSiteCount: 类似DOSPageCount,但涉及到整个站点总共有多少的请求可以在DOSSiteInterval间隔内被发起。
  • DOSBlockingPeriod: 如果一个用户超过了DOSSPageCount的限制或者DOSSiteCount,他的源IP地址将会在DOSBlockingPeriod期间内被加入黑名单。在DOSBlockingPeriod期间,任何从这个IP地址发起的请求将会遭遇一个403禁止错误。

尽可能的试验这些值,以使您的web服务器有能力处理特定大小的负载。

一个小警告: 如果这些值设置的不合适,则您会蒙受阻挡合法用户的风险。

您也许还会用到以下其它有用的指令:

DOSEmailNotify

如果您运行有一个邮件服务器,您可以通过Apache发送警告消息。注意,如果SELinux已开启,您需要授权apache用户SELinux的权限来发送email。您可以通过下面的命令来授予权限:


  1. # setsebool -P httpd_can_sendmail 1

接下来,将这个指令和其他指令一起加入到mod_evasive.conf文件。


  1. DOSEmailNotify you@yourdomain.com

如果这个指令设置了合适的值,并且您的邮件服务器在正常的运行,则当一个IP地址被加入黑名单时,会有一封邮件被发送到相应的地址。

DOSSystemCommand

它需要一个有效的系统命令作为参数,


  1. DOSSystemCommand </command>

这个指令指定当一个IP地址被加入黑名单时执行的命令。它通常结合shell脚本来使用,比如在脚本中添加一条防火墙规则来阻挡某个IP进一步的连接。

写一个shell脚本在防火墙阶段处理IP黑名单

当一个IP地址被加入黑名单,我们需要阻挡它进一步的连接。我们需要下面的shell脚本来执行这个任务。在/usr/local/bin下创建一个叫做scripts-tecmint的文件夹(或其他的名字),以及一个叫做ban_ip.sh的文件。

用于iptables防火墙


  1. #!/bin/sh
  2. # 由mod_evasive检测出,将被阻挡的IP地址
  3. IP=$1
  4. # iptables的完整路径
  5. IPTABLES="/sbin/iptables"
  6. # mod_evasive锁文件夹
  7. mod_evasive_LOGDIR=/var/log/mod_evasive
  8. # 添加下面的防火墙规则 (阻止所有从$IP流入的流量)
  9. $IPTABLES -I INPUT -s $IP -j DROP
  10. # 为了未来的检测,移除锁文件
  11. rm -f "$mod_evasive_LOGDIR"/dos-"$IP"

用于firewalld防火墙


  1. #!/bin/sh
  2. # 由mod_evasive检测出,将被阻挡的IP地址
  3. IP=$1
  4. # firewalld-cmd的完整路径
  5. FIREWALL_CMD="/usr/bin/firewall-cmd"
  6. # mod_evasive锁文件夹
  7. mod_evasive_LOGDIR=/var/log/mod_evasive
  8. # 添加下面的防火墙规则 (阻止所有从$IP流入的流量)
  9. $FIREWALL_CMD --zone=drop --add-source $IP
  10. # 为了未来的检测,移除锁文件
  11. rm -f "$mod_evasive_LOGDIR"/dos-"$IP"

我们的DOSSystemCommand指令应该是这样的:


  1. DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

上面一行的%s代表了由mod_evasive检测到的攻击IP地址。

将apache用户添加到sudoers文件

请注意,如果您不给予apache用户以无需终端和密码的方式运行我们脚本(关键就是这个脚本)的权限,则这一切都不起作用。通常,您只需要以root权限键入visudo来存取/etc/sudoers文件,接下来添加下面的两行即可:


  1. apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
  2. Defaults:apache !requiretty

添加Apache用户到Sudoers

重要: 在默认的安全策略下您只能在终端中运行sudo。由于这个时候我们需要在没有tty的时候运行sudo,我们必须像下图中那样注释掉下面这一行:


  1. #Defaults requiretty

为Sudo禁用tty

最后,重启web服务器:


  1. # service httpd restart [在RHEL/CentOS 6和Fedora 20-18上]
  2. # systemctl restart httpd [在RHEL/CentOS 7和Fedora 21上]

步骤4: 在Apache上模拟DDoS攻击

有许多工具可以在您的服务器上模拟外部的攻击。您可以google下“tools for simulating DDoS attacks”来找一找相关的工具。

注意,您(也只有您)将负责您模拟所造成的结果。请不要考虑向不在您自己网络中的服务器发起模拟攻击。

假如您想对一个由别人托管的VPS做这些事情,您需要向您的托管商发送适当的警告或就那样的流量通过他们的网络获得允许。Tecmint.com不会为您的行为负责!

另外,仅从一个主机发起一个DoS攻击的模拟无法代表真实的攻击。为了模拟真实的攻击,您需要使用许多客户端在同一时间将您的服务器作为目标。

我们的测试环境由一个CentOS 7服务器[IP 192.168.0.17]和一个Windows组成,在Windows[IP 192.168.0.103]上我们发起攻击:

确认主机IP地址

请播放下面的视频(YT 视频,请自备梯子: https://www.youtube.com/-U_mdet06Jk ),并跟从列出的步骤来模拟一个DoS攻击:

然后攻击者的IP将被防火墙阻挡:

阻挡攻击者的IP地址

结论

在开启mod_security和mod_evasive的情况下,模拟攻击会导致CPU和RAM用量在源IP地址被加入黑名单之前出现短暂几秒的使用峰值。如果没有这些模块,模拟攻击绝对会很快将服务器击溃,并使服务器在攻击期间无法提供服务。

我们很高兴听见您打算使用(或已经使用过)这些工具。我们期望得到您的反馈,所以,请在留言处留下您的评价和问题,谢谢!

原文发布时间为:2015-06-16

本文来自合作伙伴“Linux中国”

时间: 2024-10-10 10:49:07

如何在 Apache 中抵御暴力破解和 DDoS 攻击的相关文章

如何在 Apache 中启用 HTTP/2

如何在 Apache 中启用 HTTP/2 Copyright (C) 2015 greenbytes GmbH 刚发布的 Apache httpd 2.4.17 终于支持 HTTP/2 了.这个页面给出了一些如何构建/部署/配置的建议.目的是为了大家发现 bugs 时能升级它,或者给一些能更好工作的建议. 最后,这会归并回到官方 Apache 文档,这里只会留下一个到那里的链接.暂时我们还没做到. 源码 你可以从这里得到 Apache 版本.Apache 2.4.17 及其更高版本都支持 HT

linux服务器下通过iptables+Denyhost抵御暴力破解的配置方法_Linux

使用iptables 现在每分钟连接ssh的次数 #允许本地环回接口访问 iptables -A INPUT -i lo -j ACCEPT #对已经建立的所有链接都放行 iptables -A INPUT -m state –state ESTABLISHED -j ACCEPT #每分钟对ssh的新连接只允许两个,已建立的连接不限制 复制代码 代码如下: iptables -A INPUT -p tcp –dport 22 -m limit –limit 2/minute –limit-bu

利用xmlrpc.php进行WordPress暴力破解以及DDoS的防护

工具可以利用 WordPress 漏洞来进行扫描,也可以发起DDoS 攻击.经过测试,漏洞影响存在 xmlrpc.php 文件的全部版本. 最近我也遇到了大规模的wordpress后台(wp-login.php)爆破,wordpress差点沦为了骇客手中的僵尸机.不过确实一种另类的wordpress暴力破解攻击.骇客利用xmlrpc.php文件来绕过wordpress后台的登录错误限制进行爆破. 攻击方式   wp.getUsersBlogs     username   password 这种

如何抵御基于 JavaScript 的 DDoS 攻击

DDoS攻击技术正在快速演化,最近出现的基于JavaScript的DDoS攻击具 有一个与众不同的特点:任何有浏览器的设备都可能参与攻击,其潜在攻击规模接近无限.现代网站的绝大多数互动采用的都是JavaScript. JavaScript脚本可直接植入HTML中,或者是从远程服务器载入.JavaScript攻击主要发生在共享JavaScript脚本在第三方服务 器上被替换,或者是在传输过程中被中间人替换.对于屏蔽服务器上被替换的脚本,目前HTTP还没有相关机制,但W3C已经提出了名叫子资源完整性

如何在 Apache 中重定向 URL 到另外一台服务器

假设你正在重新设计公司的网站.你已决定将内容和样式(HTML文件.JavaScript 和 CSS)存储在一个服务器上,将文档存储在另一个服务器上 - 这样可能会更稳健. 建议阅读: 5 个提高 Apache Web 服务器性能的提示 . 但是,你希望这个更改对用户是透明的,以便他们仍然能够通过之前的网址访问文档. 在下面的例子中,名为 assets.pdf 的文件已从 192.168.0.100(主机名:web)中的/var/www/html 移动到192.168.0.101(主机名:web2

如何在apache中部署多个rails应用(非jruby方式)

问题描述 服务器环境:ubuntu8.04 + apache2 + mod_rails + rails2.1 + mysql 5如果我有demo1.demo2.demo3等多个rails应用想部署在同一服务器中,由于只是内部应用,只能通过ip地址进行访问(无域名),想得到如下访问效果:http://10.10.10.1/demo1http://10.10.10.1/demo2http://10.10.10.1/demo3由于网上只有subdomains方式的配置,达不到我想要的效果.请问该如何配

如何在eclipse中跑apache kylin;

问题描述 如何在eclipse中跑apache kylin: 用eclipse导入kylin的jar包,然后通过eclipse生成cube,而且能够在web端检测到,能做到吗? 解决方案 http://www.mamicode.com/info-detail-936729.html

c++-在做一个暴力破解密文的课设,如何快速地匹配文件中的单词?

问题描述 在做一个暴力破解密文的课设,如何快速地匹配文件中的单词? 最近在做一个课程设计,是关于暴力破解密文的.文件中大约有9000个单词,每个单词 占一行,如何快速地去匹配单词呢? 解决方案 先字典序排序.然后二分查找,这是我的想法,当然我觉得也可以用更高级的字符串匹配算法

Linux 利用hosts.deny 防止暴力破解ssh(转)

一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7系统).Development Tools. 主机ip:192.168.30.64 (服务器端).192.168.30.64(客户端+ 暴力破解[Hydra]) 在30.63上进行暴力破解30.64 2.2 客户端上安装 破解程序 hydra.关于该程序的详情请去官网. 安装该软件的依赖环境: [r