Como minimizar o efeito de solicitações POST travessas e persistentes

5

Por alguns meses agora um dos nossos servidores de hospedagem compartilhada tem sido persistentemente e constantemente martelado por solicitações "POST /" do que deve ser centenas de milhares de IPs individuais. Em várias ocasiões, isso sobrecarregou o servidor e levou a uma negação da interrupção do tipo de serviço. O domínio de destino é muito chato (um pequeno agente imobiliário), embora isso pareça ser mal-intencionado. Não consigo entender o motivo desse ataque de longa duração e 99% malsucedido.

Uma solicitação típica (tirada de TCPDUMP) é semelhante a isto:

POST / HTTP/1.1
Accept: */*
Accept-Language: en-us
Content-Type: application/octet-stream
Content-Length: 570
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: xxx.co.uk
Connection: Keep-Alive
Cache-Control: no-cache

2+cIPSyYVJFqB9xPFzWoLj9seNyEKIcuIJz/yfkc9tVP+orXgjDk8ywglufcXsMz
bVP4XLcowz/fQtsn2kceQEj/EaEWx/GEbcC3eTbCbTube0suAfEGje3qISKQJ+ka
HaChqun3whii3OTh7vCayGV72lh4raLRandKC5g/73wgQ9Jzh2OLIzNvsiEMSJco
yG+4i35XJMvX7ovx8qJkyByHUIeE5G5M2Kp97O4sOT4jTAK2y/KAMjf6oFgtAJhI
K4/HdcnyfNdI3/4RJXlrSfhUQAc+qhGMEL7AZdtzgRub7lnu+hbuPGZvS3rF1MvL
WK1q4mrnZr0Q3m0bWkzsMZCndQ7fqOBafchjprhn4JKPsjO+upRm2m+irvmJjqnl
sDiR3fnD6pzbWyLTm2qonMJPCll3p6zg06gEfIaW04t9r89/PdHgz8AU8nzO4BX8
qwTG6dSjgbowHyJQmud8Ro+ZT+gHfw/YQUrBqKm7RoFmfJzUoOCKaP1LTwHfI1Gc
E+L8bwQV6ztKBwVn2NqbE83SAXYr9E0QkpaxGg==

Não conseguimos determinar o que está na solicitação POST, pois parece lixo, mas não tenho certeza se é relevante. Não é codificado em base64.

Para reduzir a quantidade de largura de banda usada pelas respostas a essa solicitação, proibimos o uso de solicitações POST na configuração do Apache2:

<Location />
    <Limit POST>
        Order deny,allow
        Deny from all
    </Limit>
</Location>

Isso restringe o tamanho da resposta a apenas uma mensagem 403 Proibida simples, em vez da homepage comum do cliente.

Para tentar bloquear os IPs, tentamos canalizar o log de acesso, filtrar a solicitação POST e alimentar isso diretamente no iptables:

tail -f /var/www/vhosts/xxx.co.uk/statistics/logs/access_log | grep "POST / " | awk '{print $1}' | xargs -I{} iptables -A INPUT -s {} -j DROP

Isso funciona bem e reduz o efeito do problema, mas é implacável e geralmente temos que limpar o conjunto de regras do iptables quando ele atinge 50-60k devido a problemas de iptables / kernel. Não é uma solução, pois não posso deixar essa corrida por algumas semanas até que quem for o responsável receba a mensagem e desista.

Também desativamos o KeepAlive para este VirtualHost em particular para manter o número de trabalhadores Apache ocupados no mínimo, o que ajudou, mas não é uma solução.

Alguém tem alguma idéia melhor sobre como eliminar esses pedidos, em uma escala de centenas de milhares de IPs remotos, ou para reduzir o impacto no Apache ao mínimo absoluto? O melhor que posso fazer no momento é configurá-lo para enviar um 403 Proibido, combinado com bloqueio de IP por algumas horas ...

Obrigado!

    
por Richard Maynard 30.10.2013 / 13:38

1 resposta

2

se você tiver acesso root a essa máquina, poderá implantar o snort / suricata com um conjunto de regras limitado, por exemplo, detectar e bloquear solicitações de POST.

pro:

  • funciona no nível da rede
  • ips podem ser bloqueados por um determinado período de tempo

con:

  • não tão fácil de configurar e manter, deve ser feito por alguém que saiba como / o que fazer

mais fácil: configure o nginx na frente do seu apache e processe seu 403 a partir dali, enquanto passa solicitações válidas para o apache

pro:

  • configuração fácil
  • pode lidar com mais solicitações do que o apache
  • limite-rate pode ser usado em um nível de ip

con:

  • deve ser testado
por 30.10.2013 / 13:55