mod_evasive é um módulo Apache para prevenir ataques DoS.
Basicamente, você define alguns limites para quantas vezes um endereço IP pode fazer solicitações ao seu site em um determinado intervalo. É útil em diversos contextos, mas não está bem documentado.
Instalação
A configuração é direta (instruções para o Apache 2). Como root:
wget http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz
tar xzf mod_evasive_1.10.1.tar.gz
cd mod_evasive
apxs -cia mod_evasive20.c
Ótimo! O módulo foi instalado. Agora é hora de definir seus limites.
Configuração
Acontece que há algumas opções diferentes e a documentação não está completamente clara sobre como elas funcionam.
Estas são as configurações padrão para mod_evasive:
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 60
O que é DOSHashTableSize
e por que tem um número tão estranho? Qual é a diferença entre DOSPageCount
e DOSSiteCount
? A internet foi surpreendentemente pouco divulgada sobre o assunto.
Uma visão geral rápida:
DOSHashTableSize
está relacionado a como o mod_evasive rastreia quem está acessando o quê. Quanto maior o número, mais rápida será a consulta ao verificar o que o visitante já visitou, mas ao custo de consumir mais memória. Espera-se que esse número seja um número primo e será dividido em camadas até o número primo mais próximo.DOSPageCount
é quantas solicitações idênticas a um URI específico (pense em “example.org/about.html” ou “example.org/cat.jpg”) um visitante pode fazer durante oDOSPageInterval
intervalo (normalmente um segundo).DOSSiteCount
é semelhante aDOSPageCount
, mas está relacionado a quantas solicitações no geral um visitante pode fazer ao seu site durante oDOSSiteInterval
intervalo (normalmente também um segundo).
Se um visitante exceder esses limites, ele será colocado na lista negra por um determinado período de tempo ( DOSBlockingPeriod
). Durante esse tempo, todas as solicitações feitas por eles retornarão um erro.403 Forbidden
Como é difícil prever quais configurações serão mais adequadas para o seu site, você vai querer ficar de olho no desempenho do seu site durante a execução do mod_evasive. Você pode configurar notificações por e-mail com DOSEmailNotify
(enviar via mail
) para ser alertado sempre que alguém entrar na lista negra. Observe os logs do servidor em busca de um excesso de respostas – se você estiver recebendo muitas respostas, pode estar bloqueando visitantes legítimos.403 Forbidden
Juntando tudo, aqui está um exemplo de configuração (adicione ao final do seu httpd.conf
arquivo):
# Rate limiting
# Learn more at http://library.linode.com/web-servers/apache/mod-evasive
<IfModule mod_evasive20.c>
# The hash table size defines the number of top-level nodes for each child's
# hash table. Increasing this number will provide faster performance by
# decreasing the number of iterations required to get to the record, but
# consume more memory for table space. You should increase this if you have
# a busy web server. The value you specify will automatically be tiered up
# to the next prime number in the primes list (see mod_evasive.c for a list
# of primes used).
DOSHashTableSize 3097
# If set, this email address will receive a notification whenever an IP
# address becomes blacklisted. A locking mechanism prevents continous
# emails from being sent.
DOSEmailNotify admin@example.org
# NOTE: The following settings apply on a per-IP address basis.
# Allow up to 2 requests for the same URI per second:
DOSPageInterval 1
DOSPageCount 2
# Allow up to 50 requests across the site per second:
DOSSiteInterval 1
DOSSiteCount 50
# Once the client is blacklisted, prevent them from accessing the site
# for 60 seconds:
DOSBlockingPeriod 60
</IfModule>
Certifique-se de apachectl configtest
passes ( “Sintaxe OK”) e reinicie o Apache: apachectl graceful
.