Назад | Перейти на главную страницу

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, но никогда не запускает скрипт, так что я не получаю здесь никакого преимущества.

Что еще я могу попытаться заставить это работать?

Моя система работает! :)

Требования:

  • судо
  • в
  • ДОПОЛНИТЕЛЬНО: 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 <ddos@yourfromdomain.foo>"

# Multiple accounts separated by commas
TO="admin@yourfromdomain.foo user@yourfromdomain.foo"

# 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 FAQ

В: А как насчет последней строчки? (rm -f ...)

A: Когда mod_evasive обнаруживает некоторые атаки, он создает файл (файл блокировки) в «DOSLogDir» с именем «dos- [sourceip]» (например, dos-8.8.8.8) и выполняет команду «DOSSystemCommand» один раз, пока этот файл не исчезнет. Поэтому, когда вы выполняете «iptables», вы должны удалить файл блокировки для следующей проверки.

Протестировано в Debian 7.

Удачи, привет.

Я попробовал подход из ответа 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

Мне потребовалось время, чтобы заметить это, поэтому я надеюсь, что публикация здесь может помочь другим попробовать это решение.

Мне удалось использовать приведенный выше ответ 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"

А также обновил скрипт, чтобы использовать этот путь.