我正在尝试让 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"
并且还更新了脚本以使用该路径。