impedindo o ataque DoS no servidor web Apache

1

Esta é a versão do apache que estamos usando - httpd-2.2.15-39.el6.centos.x86_64

Recentemente tivemos o nosso site desativado devido ao ataque DoS e, portanto, começamos a explorar o iptables e como usá-lo para evitar ataques DoS. Entrei em vários fóruns e tenho um conjunto de regras que estou tentando entender agora. Para colocar um limite no número de conexões feitas a partir do ip único, eu queria entender a comunicação entre cliente (navegador web) e servidor (webserver - httpd). Digamos que estou acessando "www.mywebsite.com" no meu Google Chrome e comecei a passar por várias páginas do meu site. Agora, quantas conexões estão sendo feitas entre o cliente e o servidor da web. Eu tentei executar o netstat no meu servidor e verifique. Só consigo ver uma conexão sendo feita com meu IP (navegador da web chrome). É sempre o caso? Apenas 1 conexão é feita entre o cliente e o servidor web e a comunicação acontece somente através desta conexão? Quanto tempo esta conexão permanece?

É seguro usar as regras abaixo?

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

As duas regras acima descartarão completamente o risco do cenário em que alguém está tentando fazer tantas conexões com o meu servidor web de sua máquina (considerando que 10 conexões por minuto não são legítimas?)?

Agora, considere as duas regras abaixo

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT

Agora, o que a regra acima faz? Eu já perguntei isso na questão abaixo, mas ainda não consegui obter uma visão completa sobre isso.

A primeira regra diz que apenas 50 conexões por minuto são aceitas e podem chegar a 200. Uma vez que 200 conexões por minuto são aceitas, no minuto consecutivo, apenas 50 são aceitas.

Em relação ao limite de burst, ele começa com 200 tokens. o que significa que meu servidor recebeu 200 solicitações neste minuto, então a contagem de token vai para 50 e apenas 50 conexões são aceitas para o próximo minuto. Agora, o que acontece no terceiro minuto, ele permitirá novamente 200 solicitações? como no minuto anterior, o número de conexões era de < = 50? O meu entendimento está certo?

E o que a última regra diz? Em qualquer ponto, só pode haver 50 conexões estabelecidas?

Há chances de o tráfego legítimo ser descartado devido às duas regras acima?

Se houver alguma outra regra do iptables que você sugeriria para evitar ataques DoS e, em geral, para um servidor web?

    
por Being Gokul 01.03.2016 / 09:00

3 respostas

2

how many connections are being made between the client and the webserver.

Normalmente, um navegador fará conexões de 6 a 10 tcp a um servidor da Web.
Eu testei com cromo e é isso que eu vejo. Eu geralmente testo com end to end corredor de teste que rapidamente faz solicitações, então você pode precisar ajustar o seu comando setup ou netstat - eu normalmente começo com netstat -plunt ou algo similar. Talvez você esteja vendo menos porque está atingindo o mesmo URL e o navegador está fazendo cache - tente solicitar páginas diferentes.

How long are connections kept alive?

Isso é definido em uma diretiva keepalive no apache - geralmente é definido em torno de 5-10 segundos, dependendo da versão do apache - apenas grep para ele. Às vezes, o seu conjunto é mais baixo - ou desligado - por motivos de desempenho - mas se você for o único que gerencia o servidor, então você saberia sobre isso. Se foi desativado para zero, essa pode ser a razão pela qual seu comando netstat não está captando as conexões - porque elas estão sendo liberadas antes do netstat reportá-las.

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT

Em primeiro lugar, esta regra acrescenta - ao final do conjunto de regras existente, o que significa que, se outras regras corresponderem antes, essa regra nem será considerada. É do módulo de limite do netfilter que usa um conceito de token bucket para a matemática. Nesse caso, 200 tokens são colocados no bucket, a regra corresponderá até que todos os tokens sejam consumidos - ou seja, o bucket é esvaziado. Mas o balde está sendo constantemente reabastecido a uma taxa de 50 por minuto.
Portanto, a ideia básica é dizer que você quer corresponder a uma média de 50 vezes por minuto - e você quer continuar correspondendo a 50 solicitações por minuto durante todo o dia. Bem, e se alguém fizer 120 solicitações em uma sequência, mas não fizer nenhuma solicitação pelos próximos 3 minutos ?, elas estão tecnicamente dentro da sua definição de 50 vezes por minuto - média . Então você precisa colocar alguns tokens extras no balde para cobrir isso.

Para mais informações, consulte a documentação do netfilter

    
por 01.03.2016 / 14:02
0

Para evitar ataques DoS, você precisa se aprofundar na camada de rede. Procure por "DoS attack Linux", consulte o guia de rede para sua distribuição. A maioria das mitigações joga com o tráfego limitado usando o iptables.

    
por 01.03.2016 / 14:34
0

Otimize a diretiva MaxRequestWorkers para definir o número máximo de conexões simultâneas sobre as quais os recursos estão esgotados.Veja também o Ajuste de desempenho do Apache

O uso de um módulo mpm permite aproveitar a vantagem das conexões simultâneas, o que minimiza o efeito de < ataques strongs> DoS . No futuro, o evento do Módulo mpm usará o processamento assíncrono para não dedicar um thread para cada conexão. Pela natureza da biblioteca OpenSSL, o evento do módulo mpm é atualmente incompatível com o módulo mod_ssl e outros filtros de entrada. Nesses casos, seu comportamento é reduzido ao do operador mpm do módulo.

Existem muitos módulos de terceiros disponíveis List_of_Apache_modules que podem reduzir o comportamento de alguns clientes e minimizar os problemas de DoS.

    
por 01.03.2016 / 15:26