mod_evasive DOSSystemCommand 不起作用

mod_evasive DOSSystemCommand 不起作用

我正在尝试让 mod_evasive 触发一个脚本来添加 iptables 规则以拒绝有问题的主机。我尝试了两个答案中的建议这里但我仍然无法让它工作。除了链接的帖子外,我还在尝试运行一个脚本,如下所示在本文中

我的 Apache 配置如下

DOSSystemCommand "sudo -u root /root/scripts/ban_ip.sh %s"

脚本中有这个

#!/bin/sh

IP=$1
IPTABLES=/sbin/iptables

$IPTABLES -A banned -s $IP -p TCP -j DROP

echo "$IPTABLES -D banned -s $IP -p TCP -j DROP" | at now + 5 minutes

我已经创建了一条“禁止”链(我也尝试将其添加到 INPUT 链中,但没有成功)

我的 /etc/sudoers 如下所示:

apache ALL=(root) NOPASSWD: /root/scripts/ban_ip.sh *

我已禁用 SELinux,以确保它不会造成干扰。我可以su apache --shell=/bin/bash运行sudo /root/scripts/ban_ip.sh 10.10.10.10,而且运行正常。

但是当某个源在 mod_evasion 中被标记为恶意时,它会使用 403 拒绝主机,但从不运行脚本,所以我在这里并没有真正获得任何优势。

我还可以尝试什么来让它工作?

答案1

我的系统正常运行!:)

要求:

  • 须藤
  • 可选: heirloom-mailx(就我而言)

注意:您可以使用其他邮件代理并修改脚本。

现在我的配置:

mod_evasive(/etc/apache2/mods-enabled/mod-evasive.conf)

<IfModule mod_evasive20.c>
 DOSHashTableSize    3097
 DOSPageCount        10
 DOSSiteCount        150
 DOSPageInterval     2
 DOSSiteInterval     2
 DOSBlockingPeriod   10
 DOSSystemCommand "sudo /usr/local/bin/ddos_system.sh %s"
 DOSLogDir           "/tmp"
</IfModule>

sudoers

www-data ALL=NOPASSWD: /sbin/iptables *, /usr/bin/at *

ddos_system.sh (复制到 /usr/local/bin)

#!/bin/bash
#set -x
[ -z $1 ] && (echo "Usage: $0 <sourceip>"; exit 1)
[ -x /usr/bin/at ] || (echo "Please, install 'at'"; exit 1)

#############
## OPTIONS
#

SOURCEIP="$1"
HOSTNAME=$(/bin/hostname -f)
BODYMAIL="/tmp/bodymailddos"
MODEVASIVE_DOSLogDir="/tmp"

FROM="Anti DDOS System <[email protected]>"

# Multiple accounts separated by commas
TO="[email protected] [email protected]"

# Time-units can be minutes, hours, days, or weeks
BANNEDTIME="1 minute"

#
##
############

# Custom mail message
{
echo "Massive connections has been detected from this source IP: $SOURCEIP

The system has blocked the IP in the firewall for $BANNEDTIME. If the problem persist you should block that IP permanently.

- Anti DDOS System -"
} > $BODYMAIL

/sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "/sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | at now + $BANNEDTIME
cat $BODYMAIL | /usr/bin/mail -r "$FROM" -s "DDOS Attack Detected - $HOSTNAME" $TO
rm -f "$MODEVASIVE_DOSLogDir/dos-$SOURCEIP"

MINI 常见问题解答

问:最后一行怎么样?(rm -f ...)

答:当 mod_evasive 检测到某些攻击时,它会在“DOSLogDir”中创建名为“dos-[sourceip]”(例如 dos-8.8.8.8)的文件(锁定文件),并执行“DOSSystemCommand”一次,直到该文件消失。因此,当您执行“iptables”时,您应该删除锁定文件以进行下一次检查。

在 Debian 7 中测试。

祝你好运,问候。

答案2

我尝试了 Beast 响应中的方法(谢谢!!)并且必须更改此片段才能使其起作用:

/sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "/sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | at now + $BANNEDTIME

基本上我必须补充须藤命令/sbin/iptables脚本内部:

sudo /sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "sudo /sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | sudo at now + $BANNEDTIME

我花了一段时间才注意到这一点,所以我希望在这里发布的帖子可以帮助其他人尝试这个解决方案。

答案3

我最近在做一个项目时,偶然发现了这个关于 mod_evasive 的问题。虽然得票最多的答案正是我需要的,部分解决了我的问题,但我不会向任何人推荐它,因为它存在严重的安全漏洞。虽然不建议允许www-数据用户运行须藤,任何用户都不应被允许运行at命令须藤特权禁止密码! 这at命令可用于将权限提升至只需一个简单的命令,如果允许运行须藤无需密码。例如,看看这张图片:- 特权升级命令

┌──(root

答案4

我设法使用 Beast 的上述答案来使其工作,但需要进行一些调整。

sudoers 文件(/etc/sudoers)应该添加此行,否则脚本不会运行:

www-data ALL=NOPASSWD: /usr/local/bin/ddos_system.sh *

也需要这些命令来提供适当的权限并保护脚本。

mkdir /var/log/mod_evasive
chown www-data /var/log/mod_evasive

chown root /usr/local/bin/ddos_system.sh 
chmod 700 /usr/local/bin/ddos_system.sh

而且我不需要修改脚本来添加任何 sudo 命令。

我用了

DOSLogDir           "/var/log/mod_evasive"

并且还更新了脚本以使用该路径。

相关内容