Bloqueio de solicitações HTTP repetidas no Apache por trás de um balanceador de carga

3

Eu tenho vários servidores do EC2 no AWS que executam o apache por trás de um balanceador de carga (ELB). De vez em quando, alguns endereços IP abusam da API hospedada nos servidores do EC2 e causam uma negação de serviço. Não tenho acesso ao balanceador de carga, portanto, preciso bloquear o acesso no nível do servidor.

Alterei o log de acesso do apache para exibir IPs baseados no cabeçalho X-Forwarded-For fornecido pelo balanceador de carga (caso contrário, ele exibe apenas o IP do balanceador de carga), para que eu possa identificar esses IPs e bloqueá-los (novamente especificando o X-Forwarded-For) com algo como:

<Directory api_dir>
                SetEnvIF X-FORWARDED-FOR "1.1.1.1" DenyIP
                Order allow,deny
                allow from all
                deny  from env=DenyIP
</Directory>

No entanto, isso ainda significa que eu preciso manipular manualmente cada ataque, e o meu servidor sofre algum tempo de inatividade como resultado.

Qual é a maneira recomendada de bloquear automaticamente os ataques de chamadas HTTP repetidas, com base não no IP, mas no cabeçalho Forwarded-For proveniente do balanceador de carga.

    
por hillel 21.08.2013 / 18:39

2 respostas

2

Você pode fazer isso com o mod_evasive combinado com mod_rpaf .

O primeiro permite que você limite por endereço IP (para parar ataques do DOS, por exemplo), o último permite que você faça o endereço X-FORWARDED-FOR aparecer como o IP, como discutido nos comentários da resposta a esta questão .

(Se o mod_rpaf não funcionar para você, você terá que hackear a fonte do mod_evasive.)

    
por 21.08.2013 / 19:00
2

Eu escrevi uma postagem no blog sobre como para fazer isso com o Apache 2.4 usando o OSSEC (um sistema de detecção de invasão baseado no host FOSS). Aqui está o TLDR:

  1. Use o mod_remoteip para registrar os IPs do cliente no lugar dos IPs do balanceador de carga.
  2. Na sua configuração vhost, use uma diretiva IncludeOptional dentro de um RequireAll para criar um diretório que contenha outros mod_authz_host , escritas por OSSEC.
  3. Crie um script de resposta ativa personalizado para o OSSEC adicione um arquivo com uma diretiva mod_authz_host como Require not ip 1.2.3.4 ao diretório acima para cada endereço IP a partir do qual o OSSEC detecta atividades maliciosas.
  4. Configure o OSSEC para começar a usar o script de resposta ativa acima - Eu recomendaria copiar as configurações dos blocos command e active-response config do padrão da OSSEC host-deny active-response, que bloqueia um endereço IP por 10 minutos se acionar um alerta em ou acima de nível 6 .
  5. Adicione algumas regras personalizadas ao arquivo de definição local_rules.xml da OSSEC para solicitações HTTP registradas no seu log de acesso do Apache que acionará a resposta ativa acima quando corresponder com X frequency em Y timeframe (como dizer mais de 50 vezes em 10 segundos, ou o que você considera abusivo).

Se você ainda não estiver usando o OSSEC (ou algum outro HIDS), recomendo-o com entusiasmo - é muito fácil de configurar e oferece várias funcionalidades prontas para uso. A DigitalOcean tem uma boa instalação do OSSEC tutorial para o Ubuntu 14.04 (que você pode acompanhar muito bem mesmo para outros linuxes). Você pode simplesmente instalá-lo no modo "local" em cada um dos seus servidores para começar, e depois reorganizá-lo para usar sua sofisticada arquitetura cliente-servidor.

Observe também que esta técnica requer o reinício automático do Apache toda vez que um IP é adicionado à lista de bloqueio, o que pode não ser um bom começo para alguns.

    
por 07.05.2015 / 07:50