如何在 Apache 中抵御暴力破解和 DDos 攻击(2)

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

<IfModulemod_security2.c>

SecRuleEngine On

SecRequestBodyAccess On

SecResponseBodyAccess On

SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream

SecDataDir /tmp

</IfModule>

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

步骤 3: 配置mod_evasive

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

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

<IfModulemod_evasive24.c>

DOSHashTableSize 3097

DOSPageCount 2

DOSSiteCount 50

DOSPageInterval 1

DOSSiteInterval 1

DOSBlockingPeriod 10

</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。您可以通过下面的命令来授予权限:

# setsebool -P httpd_can_sendmail 1

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

DOSEmailNotify you@yourdomain.com

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

DOSSystemCommand

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

DOSSystemCommand</command>

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

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

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

用于iptables防火墙

#!/bin/sh

# 由mod_evasive检测出,将被阻挡的IP地址

IP=$1

# iptables的完整路径

IPTABLES="/sbin/iptables"

# mod_evasive锁文件夹

mod_evasive_LOGDIR=/var/log/mod_evasive

# 添加下面的防火墙规则 (阻止所有从$IP流入的流量)

$IPTABLES -I INPUT -s $IP -j DROP

# 为了未来的检测,移除锁文件

rm -f "$mod_evasive_LOGDIR"/dos-"$IP"

用于firewalld防火墙

#!/bin/sh

# 由mod_evasive检测出,将被阻挡的IP地址

IP=$1

# firewalld-cmd的完整路径

FIREWALL_CMD="/usr/bin/firewall-cmd"

# mod_evasive锁文件夹

mod_evasive_LOGDIR=/var/log/mod_evasive

# 添加下面的防火墙规则 (阻止所有从$IP流入的流量)

$FIREWALL_CMD --zone=drop --add-source $IP

# 为了未来的检测,移除锁文件

rm -f "$mod_evasive_LOGDIR"/dos-"$IP"

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

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

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

将apache用户添加到sudoers文件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6382391a8dfcc290f282952f086f1c66.html