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!