diff --git a/nginx/sites-available/katalog.itguys.com.br.conf b/nginx/sites-available/katalog.itguys.com.br.conf index ad635de..fee24bb 100644 --- a/nginx/sites-available/katalog.itguys.com.br.conf +++ b/nginx/sites-available/katalog.itguys.com.br.conf @@ -1,18 +1,13 @@ # ============================================================================== # ARQUIVO: /etc/nginx/sites-available/katalog.itguys.com.br.conf # AUTOR: Gemini (Especialista NGINX) -# DATA: 21/09/2025 +# DATA: 27/09/2025 - 18:00 +# VERSÃO: 2.0 (Padrão Autocontido com Hardening de Segurança e Performance) # # DESCRIÇÃO: -# Configuração de Proxy Reverso OTIMIZADA e SEGURA para Snipe-IT. -# -# FUNCIONALIDADES: -# - Redirecionamento canónico forçado para HTTPS. -# - Restrição de Acesso: O acesso é limitado às redes definidas em -# /etc/nginx/snippets/internal_networks.conf. -# - Cache Inteligente: Cache ativado apenas para assets estáticos da interface. -# - Bloco `upstream` para fácil manutenção do backend. -# - Cabeçalhos de segurança e organização aprimorada do código. +# Configuração autocontida para Snipe-IT. Elimina snippets, integra as +# políticas globais de segurança (GeoIP, Rate Limit, Bot Block), e adiciona +# otimizações de performance (compressão, cache de navegador). # ============================================================================== # Define o nosso servidor Snipe-IT como um "upstream" para fácil referência. @@ -28,12 +23,10 @@ server { listen [::]:80; server_name katalog.itguys.com.br; - # Permite a validação do Let's Encrypt antes de qualquer restrição. location /.well-known/acme-challenge/ { root /var/www/html; } - # Redireciona todo o tráfego para a versão segura. location / { return 301 https://$host$request_uri; } @@ -47,48 +40,89 @@ server { listen [::]:443 ssl http2; server_name katalog.itguys.com.br; - # --- CONFIGURAÇÕES DE SSL E SEGURANÇA --- - ssl_certificate /etc/letsencrypt/live/katalog.itguys.com.br/fullchain.pem; # managed by Certbot - ssl_certificate_key /etc/letsencrypt/live/katalog.itguys.com.br/privkey.pem; # managed by Certbot - include /etc/nginx/snippets/ssl_params.conf; - add_header X-Content-Type-Options "nosniff" always; - add_header X-Frame-Options "SAMEORIGIN" always; + # --- CONTROLE DE ACESSO (TRAVA DE SEGURANÇA) --- + # Utiliza o bloco 'geo' do nginx.conf para permitir acesso apenas à rede interna. + if ($is_internal = 0) { + return 403 Forbidden; + } - # --- POLÍTICAS DE ACESSO E LOGS --- - # A TRAVA DE SEGURANÇA: Restringe o acesso à rede interna. - include /etc/nginx/snippets/internal_networks.conf; - # Bloqueia a indexação por motores de busca. - include /etc/nginx/snippets/global_robots.conf; - # Logs - access_log /var/log/nginx/katalog.itguys.com.br.access.log; + # --- Logs Dedicados (Padronizado) --- + access_log /var/log/nginx/katalog.itguys.com.br.access.log detailed_proxy; + access_log /var/log/nginx/katalog.itguys.com.br.bad-bot.log suspicious_bot if=$block_request; error_log /var/log/nginx/katalog.itguys.com.br.error.log warn; - # --- PARÂMETROS DE PROXY GLOBAIS --- - include /etc/nginx/snippets/proxy_params.conf; + # --- Segurança (Integração com nginx.conf) --- + if ($block_request) { + return 404; + } + limit_req zone=global_limit burst=40 nodelay; # Burst maior para interfaces de app + limit_req zone=bad_bot_limit; + + # --- Configurações de SSL/TLS (Padrão Autocontido) --- + ssl_certificate /etc/letsencrypt/live/katalog.itguys.com.br/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/katalog.itguys.com.br/privkey.pem; + ssl_trusted_certificate /etc/letsencrypt/live/katalog.itguys.com.br/fullchain.pem; + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:60m; + ssl_session_tickets off; + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers off; + ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; + ssl_stapling on; + ssl_stapling_verify on; + + # --- Cabeçalhos de Segurança (Padrão Autocontido) --- + 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 Referrer-Policy "no-referrer-when-downgrade" always; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; frame-ancestors 'self';" always; + + # --- Otimização de Performance: Compressão Brotli & Gzip --- + brotli on; + brotli_comp_level 6; + brotli_types text/plain text/css application/json application/javascript text/xml application/xml+rss image/svg+xml; + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml+rss image/svg+xml; # --- REGRAS DE ROTEAMENTO (LOCATIONS) --- - # 1. Rota para assets estáticos da UI (CACHE AGRESSIVO) + # 1. Rota para assets estáticos da UI (CACHE AGRESSIVO de NGINX e Navegador) location ~* \.(?:css|js|mjs|svg|gif|png|jpg|jpeg|ico|wasm|woff2?|ttf|eot)$ { - # Define um cache específico para os assets do Snipe-IT. + proxy_pass http://snipeit_backend; + + # --- Parâmetros de Proxy (Autocontido) --- + proxy_set_header Host $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; + + # --- Cache de Proxy --- proxy_cache snipeit_cache; - proxy_cache_valid 200 7d; # Cache de 7 dias para assets. + proxy_cache_valid 200 7d; proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; add_header X-Proxy-Cache $upstream_cache_status; - - proxy_pass http://snipeit_backend; + + # --- OTIMIZAÇÃO DE PERFORMANCE: Cache de Navegador --- + expires 1y; + add_header Cache-Control "public, immutable"; } # 2. Rota principal para a aplicação (SEM CACHE) - # Apanha todas as páginas dinâmicas, APIs e funcionalidades do Snipe-IT. location / { - # O Snipe-IT precisa de um timeout maior para algumas operações (ex: importação de CSV). + proxy_pass http://snipeit_backend; + + # --- Parâmetros de Proxy (Autocontido) --- + proxy_set_header Host $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; + + # O Snipe-IT precisa de um timeout maior para algumas operações. proxy_read_timeout 300s; proxy_send_timeout 300s; - - proxy_pass http://snipeit_backend; } - - # --- Páginas de Erro Personalizadas --- - include /etc/nginx/snippets/custom_errors.conf; }