Índice
Plataforma
Produto: TOTVS Fluig Plataforma
Versão: 1.6.x ou superiores
Ocorrência
Como prevenir os ataques Http Slow Post & Http Slow Headers na plataforma?
Solução
A natureza desse tipo de ataque DDoS é tentar bloquear os serviços, ocupando o servidor com o uso de poucos recursos do atacante. Isso é realizado atrasando o tempo total da requisição: os cabeçalhos ou dados são enviados em blocos e se camuflam de uma requisição lenta. Mesmo que esta seja inválida, somente quando estiver completa é que será feita a validação e a liberação dos recursos. Infelizmente, esse tipo de ataque ainda é muito eficaz, porque além de utilizar poucos recursos do atacante, ele é difícil de filtrar por parecer de fato uma requisição lenta.
O ideal para prevenir esse tipo de ataque é reduzir o limite de tempo das requisições lentas, que é bem grande por padrão. Isso é realizado nas configurações do Load Balancer (servidor de aplicação). Realizamos testes específicos utilizando o Load Balancer Ngix na frente das requisições, e constatamos que a arquitetura da própria ferramenta reduz a eficácia desse tipo de ataque. Veja mais detalhes sobre a a recomendação de configuração da própria ferramenta no site oficial, na seção Closing Slow Connections.
Testes efetuados com o Nginx
Em testes realizados no ambiente local, com a configuração recomendada, é possível verificar que, após o tempo determinado, as conexões são encerradas. A configuração equivalente no undertow(read-) não limita o tempo total do envio dos headers, somente o tempo entre cada requisição, o que permite manter a conexão aberta por bastante tempo.
Abaixo os resultados dos testes com a configuração ativa:
Importante notar que os valores configurados não representam uma situação de uso real, portanto devem ser ajustados para uso.
server { listen 80; ... client_body_timeout 10s; client_header_timeout 5s; ... }
A contagem de portas em uso está duplicada porque o cliente e servidor são locais.
$ date && netstat -nalt | grep ":80" | grep ESTABLISHED -c ter abr 14 18:09:33 -03 2020 300 $ date && netstat -nalt | grep ":80" | grep ESTABLISHED -c ter abr 14 18:09:34 -03 2020 0
É possível visualizar que, após o tempo definido, as conexões existentes foram encerradas.
$ slowloris -v --sleeptime 1 fluig.local [14-04-2020 18:09:28] Attacking fluig.local with 150 sockets. [14-04-2020 18:09:28] Creating sockets... [14-04-2020 18:09:28] Creating socket nr 0 ... [14-04-2020 18:09:28] Creating socket nr 149 [14-04-2020 18:09:28] Sending keep-alive headers... Socket count: 150 [14-04-2020 18:09:28] Sleeping for 1 seconds [14-04-2020 18:09:29] Sending keep-alive headers... Socket count: 150 [14-04-2020 18:09:29] Sleeping for 1 seconds [14-04-2020 18:09:30] Sending keep-alive headers... Socket count: 150 [14-04-2020 18:09:30] Sleeping for 1 seconds [14-04-2020 18:09:31] Sending keep-alive headers... Socket count: 150 [14-04-2020 18:09:31] Sleeping for 1 seconds [14-04-2020 18:09:32] Sending keep-alive headers... Socket count: 150 [14-04-2020 18:09:32] Sleeping for 1 seconds [14-04-2020 18:09:33] Sending keep-alive headers... Socket count: 150 [14-04-2020 18:09:33] Sleeping for 1 seconds [14-04-2020 18:09:34] Sending keep-alive headers... Socket count: 150 [14-04-2020 18:09:35] Recreating socket... ... [14-04-2020 18:09:35] Recreating socket... [14-04-2020 18:09:35] Sleeping for 1 seconds [14-04-2020 18:09:36] Sending keep-alive headers... Socket count: 150 [14-04-2020 18:09:36] Sleeping for 1 seconds [14-04-2020 18:09:37] Stopping Slowloris