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;

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;

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

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

includeSubDomains aplica HSTS a todos os subdomínios, ative apenas se todos tiverem HTTPS. Preload inclui o domínio na lista hardcoded dos browsers (ainda mais seguro, mas irreversível). Ative preload apenas quando HTTPS estiver 100% estável.

DENY: bloqueia iframes de qualquer origem, ideal para painéis críticos e apps de banco. SAMEORIGIN: permite iframes do mesmo domínio, adequado para sites que embitem seu próprio conteúdo. Para APIs: DENY.

Opção 1 (melhor): mova scripts inline para arquivos externos. Opção 2: nonce por request, server gera token único e adiciona ao CSP e ao script: script-src 'nonce-TOKEN' e <script nonce="TOKEN">. Evite unsafe-inline para scripts críticos.

Negligenciável. São strings de texto em cada resposta HTTP. HSTS melhora performance indiretamente eliminando redirecionamentos HTTP→HTTPS (menos round-trips).

strict-origin-when-cross-origin é o default moderno dos browsers e o valor recomendado: envia o domínio completo (sem path) em requests cross-origin e o URL completo em same-origin. Evite no-referrer-when-downgrade (legado) e unsafe-url (envia tudo).