Hardening do Nginx: O Guia para Amplificar sua Segurança (com tudo que pode dar errado se você não fizer) Cada linha de configuração padrão do Nginx que você ignora é uma porta entreaberta. Este guia mostra exatamente o que cada uma significa na prática — e como fechar, uma por uma.
Hardening do Nginx: O Guia para Amplificar sua Segurança (com tudo que pode dar errado se você não fizer) Cada linha de configuração padrão do Nginx que você ignora é uma porta entreaberta. Este guia mostra exatamente o que cada uma significa na prática — e como fechar, uma por uma. Introdução O Nginx nasceu em 2004 com uma proposta diferente do Apache: ser leve, rápido e lidar com milhares de conexões simultâneas sem suar. Em 20 anos virou o servidor web mais usado do mundo entre os sites do top 1 milhão. E, exatamente como o Apache, sua configuração padrão é projetada para funcionar em qualquer lugar — não para ser segura em qualquer lugar . A boa notícia é que o Nginx tem uma configuração mais enxuta e centralizada que o Apache. A má notícia é que justamente por isso, quando algo está errado, está errado em todos os sites de uma vez. Este guia segue a mesma lógica do post anterior sobre Apache: para cada item, explicamos o que a configuração padrão faz , o que um atacante consegue fazer com isso (com cenários reais), e como corrigir com configuração pronta pra copiar. server tokens: o Nginx também grita sua versão O que acontece por padrão Toda resposta do Nginx inclui um header Server assim: E em páginas de erro, aparece um rodapé igualmente revelador. O que isso causa Atacante varre a internet com Shodan, Censys ou um script Filtra por "nginx/1.24.0" — encontra todas as CVEs daquela versão Filtra exploits prontos no Exploit-DB, Metasploit, GitHub Se a sua versão tem vulnerabilidade não corrigida, o ataque começa em segundos Agravante específico do Nginx: muita gente roda versões compiladas com módulos de terceiros (Brotli, ModSecurity, RTMP) que ficam pra trás nas atualizações. A correção Para esconder completamente o header (não apenas a versão), use o módulo headers-more: fastcgi param SERVER SOFTWARE: o vazamento via PHP O que acontece por padrão Quando o Nginx passa requisições pro PHP-FPM, envia automaticamente uma variável SERVER SOFTWARE com a versão do Nginx. Combinado com expose php = On, vaza versão dos dois. O que isso causa Mesmo problema do item anterior, em estéreo. Atacante descobre versão do Nginx e do PHP com uma única requisição. A correção No php.ini: No bloco PHP do Nginx: A diretiva fastcgi hide header impede que headers vindos do upstream sejam repassados ao cliente. Use sempre. Métodos HTTP perigosos O que acontece por padrão O Nginx aceita qualquer método HTTP que o cliente enviar e repassa pra aplicação backend. O que isso causa API mal protegida que aceita DELETE /api/users/123 sem autenticação adequada Aplicação Node/Python com rota PUT aberta por engano WebDAV mal configurado em outro componente Scanners de compliance marcando como vulnerabilidade A correção Para APIs REST que precisam de PUT, DELETE, PATCH: Strict-Transport-Security (HSTS) O que acontece por padrão O Nginx não envia HSTS. Mesmo em sites HTTPS-only, o navegador faz o primeiro request via HTTP até receber redirect. O que isso causa SSL Stripping : atacante em Wi-Fi público intercepta o primeiro request HTTP, mantém conexão HTTP com a vítima e HTTPS com o servidor real. A vítima nunca vê o cadeado, mas digita senha mesmo assim. Com HSTS, o navegador se recusa a falar HTTP com o domínio depois da primeira visita. O ataque para de funcionar. A correção AVISO CRÍTICO sobre always: sem esse sufixo, o header só é enviado em respostas de sucesso e redirect, não em respostas de erro . Com always, é enviado em todas. Use sempre always em headers de segurança no Nginx. Aviso sobre HSTS em si: uma vez aplicado com max-age longo, o navegador trava o domínio em HTTPS. Se o certificado vencer, usuários ficam sem acesso. Comece com max-age=300 (5 minutos), valide tudo, depois aumente. X-Frame-Options: clickjacking O que acontece por padrão Sem esse header, qualquer site pode embutir o seu dentro de um iframe. O que isso causa Clickjacking : atacante cria site qualquer (sorteio, jogo) que carrega seu painel admin dentro de iframe invisível, com botões falsos sobrepostos. A vítima — logada em outra aba do seu sistema — clica em "ganhar prêmio" e na verdade clica em "excluir conta" no seu painel. A correção X-Content-Type-Options: MIME sniffing O que acontece por padrão Quando recebe arquivo com Content-Type ambíguo, o navegador tenta adivinhar o tipo real olhando o conteúdo (MIME sniffing). O que isso causa Atacante envia foto.png com conteúdo HTML/JavaScript dentro. Você valida só a extensão. Quando outra vítima acessa, o navegador olha o conteúdo, pensa "isso é HTML" e executa. XSS armazenado sem nem precisar burlar filtro. A correção Referrer-Policy O que acontece por padrão Quando usuário clica em link externo, o navegador envia ao destino a URL completa de origem. O que isso causa Suponha URLs como: Qualquer link externo (ou imagem de outro domínio, ou pixel de tracking) faz a URL inteira vazar pro destino. Tokens, IDs, dados sensíveis. Sistemas de saúde americanos vazaram identificadores de pacientes pro Facebook por ca…