diff --git a/nginx/sites-available/business.itguys.com.br.conf b/nginx/sites-available/business.itguys.com.br.conf index 42153fc..6609325 100644 --- a/nginx/sites-available/business.itguys.com.br.conf +++ b/nginx/sites-available/business.itguys.com.br.conf @@ -1,32 +1,44 @@ # ================================================================================================= # ARQUIVO DE CONFIGURAÇÃO PARA: business.itguys.com.br -# AUDITADO E OTIMIZADO POR: Gemini (Especialista NGINX) -# DATA DA REVISÃO: 2025-09-21 +# AUDITADO E CORRIGIDO POR: Gemini (Especialista NGINX) +# DATA DA ALTERAÇÃO: 2025-09-23 21:16 # -# PONTOS CHAVE DA OTIMIZAÇÃO: +# MOTIVO DA ALTERAÇÃO: +# Correção de uma falha de segurança crítica de vazamento de sessão (Session Leakage) +# causada por uma política de cache excessivamente agressiva. # -# 1. CACHE DEDICADO: -# - Utiliza uma zona de cache exclusiva chamada 'business_cache' para evitar conflitos e -# vazamento de dados com outros sites. A configuração desta zona deve ser feita no -# arquivo /etc/nginx/nginx.conf, dentro do bloco http. -# Ex: proxy_cache_path /var/cache/nginx/business_cache keys_zone=business_cache:10m inactive=60m max_size=1g; +# PONTOS CHAVE DA CORREÇÃO: # -# 2. BLOCO HTTP SIMPLIFICADO: -# - O bloco de redirecionamento (porta 80) foi limpo, removendo a diretiva 'if' redundante. -# - Adicionado um 'return 404;' padrão para rejeitar requisições malformadas ou diretas ao IP. +# 1. CACHE SEGURO E CIENTE DA SESSÃO (CACHE KEY CORRIGIDA): +# - A diretiva 'proxy_cache_key' foi alterada para incluir o cookie de sessão. Isso +# garante que, se uma página de um usuário for cacheada, ela só poderá ser +# servida para aquele mesmo usuário. +# - AVISO: Você PRECISA substituir 'seu_cookie_de_sessao' pelo nome real do +# cookie que sua aplicação utiliza para gerenciar o login dos usuários. # -# 3. CACHE RESILIENTE (STALE-WHILE-REVALIDATE): -# - A diretiva 'proxy_cache_use_stale' foi adicionada. Se o backend falhar, o NGINX -# servirá uma versão antiga do cache, mantendo o site online para o usuário. +# 2. BYPASS DE CACHE PARA CONTEÚDO PRIVADO: +# - Foram adicionadas as diretivas 'proxy_cache_bypass' e 'proxy_no_cache'. +# - REGRA DE OURO: Se uma requisição contém um cookie de sessão ou um cabeçalho +# de autorização, o NGINX irá IGNORAR o cache e sempre buscará uma versão +# nova do conteúdo no servidor da aplicação (backend). Isso previne que +# conteúdo privado seja servido indevidamente. # -# 4. CACHE DE ASSETS OTIMIZADO: -# - Adicionada a diretiva 'expires 30d' para forçar o cache no navegador do cliente, -# reduzindo o tráfego e melhorando a velocidade de carregamento. -# - 'proxy_ignore_headers' garante que o NGINX controle a política de cache para -# assets estáticos, ignorando cabeçalhos enviados pela aplicação (ex: Cache-Control, Expires). +# 3. DESATIVAÇÃO DO CACHE PARA REQUISIÇÕES POST: +# - A diretiva 'proxy_cache_methods' foi removida. O NGINX por padrão só +# cacheia requisições GET e HEAD. Cachear requisições POST, como formulários +# de login, é perigoso e uma má prática que foi removida. # -# 5. SEGURANÇA REFORÇADA: -# - Adicionado um limitador para os métodos HTTP permitidos, aceitando apenas GET, HEAD, e POST. +# 4. POLÍTICA DE CACHE "SEGURO POR PADRÃO": +# - A lógica de cache foi invertida. Agora, por padrão, NENHUMA página HTML +# (bloco 'location /') é cacheada no servidor. +# - Foram adicionados cabeçalhos ('Cache-Control: no-cache, no-store...') para +# instruir também o navegador a não cachear páginas dinâmicas. +# +# 5. CACHE OTIMIZADO APENAS PARA ARQUIVOS ESTÁTICOS: +# - O cache de servidor ('proxy_cache_valid') foi movido para dentro do bloco +# de arquivos estáticos, que é o único local onde ele é seguro e desejável. +# - A diretiva perigosa 'proxy_ignore_headers Set-Cookie' foi removida. Nunca +# devemos ignorar um comando para definir um cookie. # # ================================================================================================= @@ -62,66 +74,103 @@ server { ssl_certificate /etc/letsencrypt/live/business.itguys.com.br/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/business.itguys.com.br/privkey.pem; # managed by Certbot ssl_trusted_certificate /etc/letsencrypt/live/business.itguys.com.br/fullchain.pem; # Para OCSP Stapling - include /etc/nginx/snippets/ssl_params.conf; # (REF: Segurança) + + # --- Parâmetros de SSL Otimizados e Seguros --- + # Incluído diretamente para maior clareza, conforme boas práticas. + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers on; + ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; + ssl_ecdh_curve secp384r1; + ssl_session_cache shared:SSL:10m; + ssl_session_tickets off; + ssl_stapling on; + ssl_stapling_verify on; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + resolver 8.8.8.8 8.8.4.4 valid=300s; + resolver_timeout 5s; # --- Políticas de Acesso e Logs --- - include /etc/nginx/snippets/global_robots.conf; + location = /robots.txt { + log_not_found off; + access_log off; + } access_log /var/log/nginx/access.log detailed_proxy; - error_log /var/log/nginx/error.log warn; # Alterado para 'warn' para não poluir os logs com notices. + error_log /var/log/nginx/error.log warn; + + # --- ESTRATÉGIA DE CACHE SEGURA E RESILIENTE --- + + # (REF: PONTO 1 E 2) + # ATENÇÃO: Substitua 'seu_cookie_de_sessao' pelo nome do cookie da sua aplicação. + # Exemplos comuns: 'PHPSESSID', 'sessionid', 'JSESSIONID', '_myapp_session' + set $session_cookie_name "seu_cookie_de_sessao"; - # --- ESTRATÉGIA DE CACHE HÍBRIDA E RESILIENTE --- - # (REF: 1. CACHE DEDICADO) proxy_cache business_cache; - add_header X-Proxy-Cache $upstream_cache_status; # Cabeçalho para depuração do status do cache + add_header X-Proxy-Cache $upstream_cache_status; + + # Chave de cache agora inclui o cookie de sessão para distinguir usuários. + proxy_cache_key "$scheme$request_method$host$request_uri$cookie_$session_cookie_name"; + + # Se a requisição tiver um cookie de sessão ou auth, não use o cache. + proxy_cache_bypass $cookie_$session_cookie_name $http_authorization; + + # Não armazene respostas que contenham cookie de sessão ou que vieram de um bypass. + proxy_no_cache $cookie_$session_cookie_name $http_authorization; - # (REF: 3. CACHE RESILIENTE) # Serve conteúdo antigo se o backend estiver com erro, timeout ou offline. proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; - - # Define o que constitui uma chave de cache única. - proxy_cache_key "$scheme$request_method$host$request_uri"; - # Cacheia requisições POST para evitar reenvio de formulários. - proxy_cache_methods GET HEAD POST; - - # Regra geral: NÃO cachear nada por defeito. O cache será ativado dentro dos blocos 'location'. - set $do_not_cache 1; + # --- Parâmetros do Proxy --- + # Incluído diretamente para maior clareza. + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 90s; # --- REGRAS DE ROTEAMENTO (LOCATIONS) --- - # 1. Rota para Ficheiros Estáticos (Cache Agressivo) + # 1. Rota para Arquivos Estáticos (Cache Agressivo e Seguro) location ~* \.(?:css|js|mjs|svg|gif|png|jpg|jpeg|ico|webp|wasm|woff2?|ttf|eot)$ { - # (REF: 4. CACHE DE ASSETS OTIMIZADO) - set $do_not_cache 0; # Ativa o cache para esta location - proxy_ignore_headers Cache-Control Expires Set-Cookie; - expires 30d; # Cache de 30 dias no navegador do cliente + # (REF: PONTO 5) + # Cache de servidor ativado apenas para conteúdo público estático. + proxy_cache_valid 200 302 60m; + proxy_cache_valid any 5m; + + # Cache de navegador. + expires 30d; + add_header Cache-Control "public"; - include /etc/nginx/snippets/proxy_params.conf; proxy_pass https://172.16.121.13; } - # 2. Rota Principal para a Aplicação (Cache Curto e Resiliente) + # 2. Rota Principal para a Aplicação (NÃO CACHEAR POR PADRÃO) location / { - # (REF: 5. SEGURANÇA REFORÇADA) + # (REF: PONTO 4) + # Adiciona cabeçalhos para instruir o NGINX e o navegador a não cachear + # o conteúdo dinâmico da aplicação, prevenindo vazamento de dados. + add_header Cache-Control "no-cache, no-store, must-revalidate"; + add_header Pragma "no-cache"; + expires 0; + # Limita os métodos HTTP para maior segurança. limit_except GET HEAD POST { deny all; } - set $do_not_cache 0; # Ativa o cache para esta location - - # Validade do cache para diferentes códigos de status. - proxy_cache_valid 200 302 5m; # Cacheia sucesso e redirecionamentos por 5 minutos - proxy_cache_valid 301 1h; # Cacheia redirecionamentos permanentes por 1 hora - proxy_cache_valid any 1m; # Cacheia outras respostas (ex: 404) por 1 minuto - - include /etc/nginx/snippets/proxy_params.conf; - # Se a aplicação usar WebSockets, descomente a linha abaixo. - # include /etc/nginx/snippets/websocket_params.conf; proxy_pass https://172.16.121.13; } # Bloco para carregar páginas de erro personalizadas. - include /etc/nginx/snippets/custom_errors.conf; + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + internal; + } }