Usando mod_evasive para limitar a taxa do Apache

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 é DOSHashTableSizee por que tem um número tão estranho? Qual é a diferença entre DOSPageCounte DOSSiteCount? A internet foi surpreendentemente pouco divulgada sobre o assunto.

Uma visão geral rápida:

  • DOSHashTableSizeestá 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 o DOSPageIntervalintervalo (normalmente um segundo).
  • DOSSiteCounté semelhante a DOSPageCount, mas está relacionado a quantas solicitações no geral um visitante pode fazer ao seu site durante o DOSSiteIntervalintervalo (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.confarquivo):

# 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 configtestpasses ( “Sintaxe OK”) e reinicie o Apache: apachectl graceful.