Riscos de ativar o keepalive upstream do nginx

Riscos de ativar o keepalive upstream do nginx

Usando nginx como proxy reverso HTTP para Apache com back-end PHP (preciso de flexibilidade .htaccess para webmasters). Ver o http/1.0 usado nos logs do Apache me fez pesquisar como ativar a conexão keep-alive.

Após minha pesquisa, encontrei esta postagem do blog do Nginxhttps://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives

Por padrão, o NGINX abre uma nova conexão com um servidor upstream (backend) para cada nova solicitação recebida. Isso é seguro, mas ineficiente, [...]

Se o comportamento padrão for seguro, quais são os riscos de ativar o keepalive upstream?

Responder1

Proxy de uma conexão com keepalive é considerado um risco devido a ataques de dessincronização HTTP/contrabando de solicitações. Isso ocorre quando o back-end não divide diferentes solicitações de clientes exatamente da mesma maneira que o front-end. Fechar a conexão após cada solicitação é a opção "segura", pois delineia claramente quando a solicitação atual terminou.

Verhttps://book.hacktricks.xyz/pentesting-web/http-request-smugglingPara maiores informações.

Responder2

Como já afirmei, KeepAlive é uma otimização para armazenar em cache a conexão. É para suportar tráfego de alto rendimento. Não vejo riscos em habilitá-lo, na verdade teria melhores resultados em qualquer caso.

Responder3

Comportamento padrão, a criação de conexão com o upstream para cada solicitação não é segura para carga pesada. Pelos seguintes motivos:

  1. assim que uma solicitação chegar ao servidor nginx do mesmo cliente, ele criará uma nova conexão com o servidor upstream, para a qual usará a nova porta local disponível.
  2. Depois de concluir a solicitação, a conexão fornecida naquela porta local passará de estabelecida para TIME_WAIT por 120 segundos, ou seja, por 120 segundos, essa porta local não poderá ser reutilizada para nenhuma nova solicitação
  3. agora a segunda solicitação vem do mesmo cliente, ele repetirá a etapa 1.
  4. desta forma para cargas pesadas,
    1. você pode acabar usando todas as portas locais disponíveis no nginx (65k)
    2. A criação e encerramento da conexão em cada solicitação é uma operação muito cara

Então, para evitar isso, o melhor que você pode fazer é armazenar em cache a conexão, para que, quando a solicitação chegar, você possa reutilizar a mesma conexão com o servidor upstream (na mesma porta local, como fez na última solicitação)

Atenciosamente Vj

informação relacionada