Linux: impedir inundação TCP de saída

9

Eu corro várias centenas de servidores web atrás de loadbalancers, hospedando muitos sites diferentes com uma infinidade de aplicativos (dos quais não tenho controle). Uma vez por mês, um dos sites é invadido e um script de inundação é enviado para atacar algum banco ou instituição política. No passado, essas sempre eram inundações UDP que eram efetivamente resolvidas ao bloquear o tráfego UDP de saída no servidor da web individual. Ontem, eles começaram a inundar um grande banco americano de nossos servidores usando muitas conexões TCP à porta 80. Como esse tipo de conexão é perfeitamente válido para nossos aplicativos, apenas bloqueá-los não é uma solução aceitável.

Estou considerando as seguintes alternativas. Qual desses você recomendaria? Você implementou isso e como?

  • Limite nos pacotes TCP de saída do servidor da web (iptables) com porta de origem! = 80
  • O mesmo, mas com filas (tc)
  • Taxa limite de tráfego de saída por usuário por servidor. Um fardo administrativo, pois há potencialmente milhares de usuários diferentes por servidor de aplicativos. Talvez isto: como posso limitar a largura de banda por usuário?
  • Algo mais?

Naturalmente, também estou procurando maneiras de minimizar a chance de hackers entrarem em um de nossos sites hospedados, mas como esse mecanismo nunca será 100% à prova d'água, quero limitar severamente o impacto de uma invasão.

Atualização: No momento, estou testando com essas regras, que teriam evitado esse ataque específico. Como você proporia torná-los mais genéricos? Estou faltando um ataque conhecido do TCP DoS quando apenas classifico o limite em pacotes SYN?

iptables -A OUTPUT -p tcp --syn -m limit --limit 100/min -j ACCEPT
iptables -A OUTPUT -p tcp --syn -m limit --limit 1000/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A OUTPUT -p tcp --syn -j REJECT --reject-with tcp-reset

Felicidades!

Willem
fonte

Respostas:

3

As melhores soluções possíveis para minha opinião e a que funcionou muito bem para mim é limitar o número de conexões / pacotes para o IP de destino. Definir o limite para uma taxa razoável impedirá o invasor de enviar uma grande quantidade de conexões ao destino. Definir a porta e o protocolo não é uma boa ideia, porque se o invasor enviar hoje uma inundação http, amanhã ele usará um tipo diferente de ataque. portanto, limitar as conexões por ip em geral seria uma solução para o seu problema.

Espero que ajude :)

Hex
fonte
-3

A postura que sempre adotei é que um servidor Web não deve estar fazendo conexões TCP de saída - apenas enviando tráfego como um servidor que responde a solicitações de entrada. (Eu também permito o TCP de entrada apenas para o servidor da web e o SSH.) (Relacionado a isso, também acredito que um servidor da web nunca é o host certo para enviar e-mails.) Isso não apenas evita ataques de saída - também adiciona um pouco de dificuldade aos ataques feitos em seus sistemas (os hackers não podem obter uma janela xterm ou instalar o kit de ferramentas no host).

Pedro
fonte
OK, então como é que um site busca um feed RSS de outro site?
Michael Hampton