
Eu executo centenas de servidores web atrás de balanceadores de carga, hospedando muitos sites diferentes com uma infinidade de aplicativos (dos quais não tenho controle). Cerca de uma vez por mês, um dos sites é hackeado e um script de inundação é carregado para atacar algum banco ou instituição política. No passado, estas eram sempre inundações UDP que eram efetivamente resolvidas bloqueando o tráfego UDP de saída no servidor web individual. Ontem eles começaram a inundar um grande banco dos EUA com nossos servidores usando muitas conexões TCP para a porta 80. Como esse tipo de conexão é perfeitamente válido para nossas aplicações, apenas bloqueá-las não é uma solução aceitável.
Estou considerando as seguintes alternativas. Qual desses você recomendaria? Você os implementou e como?
- Limite de pacotes TCP de saída do servidor web (iptables) com porta de origem! = 80
- O mesmo, mas com fila (tc)
- Limite de taxa de tráfego de saída por usuário por servidor. Uma grande carga administrativa, 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 intrusão.
Atualização: atualmente estou testando essas regras, o que teria evitado esse ataque específico. Como você proporia torná-los mais genéricos? Estou perdendo um ataque TCP DoS conhecido quando avalio apenas o limite de 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
Saúde!
Responder1
A melhor solução possível na 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á que o invasor envie uma grande quantidade de conexões ao alvo. Definir a porta e o protocolo não é uma boa ideia porque se o invasor estiver enviando uma inundação HTTP hoje, 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 :)
Responder2
A postura que sempre tomei é que um servidor web não deveria fazer conexões TCP de saída - apenas enviar tráfego como um servidor respondendo a solicitações de entrada. (Eu também permito TCP de entrada apenas para o servidor web e SSH.) (Em relação a isso, também acredito que um servidor web nunca é o host certo para enviar e-mails.) Isso não apenas impedirá ataques de saída - também adiciona um pouco de dificuldade aos ataques feitos em seus sistemas (hackers não podem obter uma janela xterm ou enviar seu kit de ferramentas para seu host).