mod_evasive DOSSystemCommand não está funcionando

2

Estou tentando fazer o mod_evasive disparar um script para adicionar uma regra iptables para negar o host problemático. Eu tentei as sugestões de ambas as respostas aqui mas eu ainda não consigo trabalhe. Além da postagem vinculada, estou tentando executar um script como descrito neste artigo .

Minha configuração do Apache tem isso

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

O script tem isso

#!/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

Eu criei uma cadeia 'proibida' (eu também tentei adicioná-la à cadeia INPUT sem sucesso)

Meu / etc / sudoers é assim:

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

Eu desativei o SELinux para ter certeza de que não está atrapalhando. Eu posso su apache --shell=/bin/bash e executar sudo /root/scripts/ban_ip.sh 10.10.10.10 e funciona muito bem.

Mas quando uma fonte é marcada como maliciosa em mod_evasion, ela nega o host com 403s, mas nunca executa o script, então eu não estou realmente ganhando nenhuma vantagem aqui.

O que mais posso tentar fazer com que isso funcione?

    
por Safado 13.12.2012 / 18:19

3 respostas

5

Meu sistema funciona! :)

Requerimentos:

  • sudo
  • em
  • OPCIONAL: heirloom-mailx (no meu caso)

NOTA: Você pode usar outro agente de email e modificar o script.

Agora minhas configurações:

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 (copie para / 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 FAQ

Q: E a última linha? (rm -f ...)

R: Quando mod_evasive detecta alguns ataques Ele cria um arquivo (arquivo de bloqueio) em "DOSLogDir" com o nome "dos- [sourceip]" (ex. dos-8.8.8.8) e executa o "DOSSystemCommand" uma vez até esse arquivo desaparecer. Então, quando você executa "iptables", você deve remover o arquivo de bloqueio para a próxima verificação.

Testado no Debian 7.

Boa sorte, respeito.

    
por 11.04.2014 / 11:43
2

Eu tentei a abordagem da resposta Beast (obrigado !!) e tive que mudar esse fragmento para que funcionasse:

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

Basicamente eu tive que adicionar sudo aos comandos / sbin / iptables e ao dentro do script:

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

Demorei um pouco para perceber isso, então espero que postar aqui possa ajudar outras pessoas tentando essa solução.

    
por 03.07.2015 / 18:16
0

Consegui usar a resposta acima da Beast para que funcionasse, mas alguns ajustes foram necessários.

O arquivo sudoers (/ etc / sudoers) deve ter essa linha adicionada, caso contrário, o script não estava sendo executado:

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

Esses comandos também são necessários para conceder permissões adequadas e salvaguardar o script.

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

e eu não precisei modificar o script para adicionar qualquer comando sudo.

eu usei

DOSLogDir           "/var/log/mod_evasive"

E também atualizou o script para usar esse caminho.

    
por 04.02.2018 / 22:52