Headers HTTP de segurança no Nginx

    Headers HTTP de segurança são a segunda camada de proteção após o HTTPS — protegem contra XSS, clickjacking, sniffing de tipo MIME e vazamento de informações. São configurados no Nginx em segundos, melhoram a nota no SecurityHeaders.com de F para A e não exigem nenhuma mudança no código da aplicação.

    Configuração completa de headers

    Crie um snippet reutilizável para todos os virtual hosts:

    nginx
    # /etc/nginx/snippets/security-headers.conf
    
    # HSTS: forçar HTTPS por 1 ano
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    # Impedir clickjacking
    add_header X-Frame-Options "SAMEORIGIN" always;
    
    # Impedir sniffing de tipo MIME
    add_header X-Content-Type-Options "nosniff" always;
    
    # Controlar informações do Referer
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    
    # Desabilitar features não utilizadas do browser
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
    
    # Remover versão do Nginx
    server_tokens off;
    Dica
    O modificador always faz o Nginx adicionar o header mesmo em respostas de erro (4xx, 5xx). Sem always, os headers só aparecem em respostas 200 — criando brechas.

    Content-Security-Policy (CSP)

    CSP é o header mais poderoso — define de onde o browser pode carregar recursos. Comece em modo report-only:

    nginx
    # Fase 1: report-only (registra violações sem bloquear)
    add_header Content-Security-Policy-Report-Only "
      default-src 'self';
      script-src 'self' https://trusted-cdn.com;
      style-src 'self' 'unsafe-inline';
      img-src 'self' data: https:;
      connect-src 'self' https://api.seudominio.com.br;
    " always;
    
    # Fase 2: CSP real (após confirmar que não quebra nada)
    add_header Content-Security-Policy "
      default-src 'self';
      script-src 'self' https://trusted-cdn.com;
      img-src 'self' data: https:;
      frame-ancestors 'none';
      base-uri 'self';
    " always;
    Atenção
    CSP mal configurado quebra o site — scripts inline param de funcionar. Use Content-Security-Policy-Report-Only primeiro. Só mude para a política real após confirmar que nada quebrou.

    Incluir headers nos virtual hosts

    Reutilize o snippet em todos os sites:

    nginx
    # /etc/nginx/sites-available/seudominio.com.br
    server {
        listen 443 ssl;
        http2 on;
        server_name seudominio.com.br;
    
        ssl_certificate /etc/letsencrypt/live/seudominio.com.br/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/seudominio.com.br/privkey.pem;
    
        include snippets/security-headers.conf;
    
        location / {
            proxy_pass http://app:3000;
            proxy_hide_header X-Powered-By;
        }
    }
    
    # Aplicar e testar
    nginx -t && nginx -s reload
    curl -I https://seudominio.com.br | grep -iE "strict|x-frame|x-content|referrer"

    Esconder informações do servidor

    Remova headers que revelam tecnologia e versões:

    nginx
    # nginx.conf — bloco http
    http {
        server_tokens off;              # remove versão do Nginx
    
        # Remover headers de backends
        proxy_hide_header X-Powered-By;
        proxy_hide_header X-AspNet-Version;
        proxy_hide_header Server;
    }
    
    # Páginas de erro sem versão do Nginx
    error_page 404 /404.html;
    location = /404.html {
        root /var/www/html/errors;
        internal;
    }

    Verificar nota de segurança

    Ferramentas para avaliar a configuração de headers:

    bash
    # Verificar headers com curl
    curl -I https://seudominio.com.br | grep -iE "strict|x-frame|x-content|referrer|permissions|csp"
    
    # Ferramentas online:
    # securityheaders.com   — nota de A+ a F para headers
    # ssllabs.com/ssltest   — análise completa do SSL
    # observatory.mozilla.org — análise de segurança web
    
    # Scanner de vulnerabilidades local
    apt install nikto
    nikto -h https://seudominio.com.br

    $ runstack deploy --plan starter

    Não quer configurar manualmente?

    Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.

    Perguntas frequentes