Reforçando a Segurança HTTPS com HSTS e a Lista de Pré-Carregamento

Em um cenário digital onde a segurança é primordial, garantir que a comunicação com seu site seja sempre criptografada é essencial. O HTTP Strict Transport Security (HSTS) surge como um mecanismo robusto para fortalecer a segurança de conexões HTTPS, protegendo contra ataques de downgrade e sequestro de sessão, especialmente durante a "primeira visita" de um usuário a um domínio. Ao forçar os navegadores a usar HTTPS, mesmo que o usuário digite "http://", o HSTS elimina a vulnerabilidade inicial. A adesão à Lista de Pré-Carregamento HSTS (HSTS Preload List) eleva essa proteção, instruindo os navegadores a sempre acessarem seu site via HTTPS, antes mesmo da primeira requisição.

  1. Configuração do HSTS em Servidores

O HSTS (HTTP Strict Transport Security) é uma política de segurança que um site pode impor aos navegadores. Quando ativado, ele instrui o navegador a se conectar exclusivamente ao site usando HTTPS por um período específico. Isso não apenas previne ataques como o SSL stripping, mas também melhora a velocidade ao remover a necessidade de redirecionamentos HTTP para HTTPS em visitas subsequentes.

1.1. Habilitando HSTS no Apache

Para configurar o HSTS em servidores Apache, certifique-se de que o módulo mod_headers esteja habilitado. Geralmente, esta linha já está presente ou pode ser descomentada no arquivo de configuração principal (httpd.conf) ou em um arquivo de módulo específico:

LoadModule headers_module modules/mod_headers.so

Em seguida, adicione a diretiva Strict-Transport-Security dentro do bloco <VirtualHost> para seu site HTTPS (tipicamente em /etc/apache2/sites-enabled/your-site-ssl.conf ou similar):

<VirtualHost *:443>
    # Outras configurações HTTPS aqui
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS
</VirtualHost>

O atributo max-age define a duração em segundos (aqui, dois anos) durante a qual o navegador deve forçar conexões HTTPS. includeSubDomains estende a política a todos os subdomínios, e preload é um requisito para inclusão na lista de pré-carregamento global. A condição env=HTTPS garante que o cabeçalho seja enviado apenas em conexões HTTPS.

Após a modificação, salve o arquivo e reinicie o serviço Apache:

sudo systemctl restart apache2

1.2. Habilitando HSTS no Nginx

No Nginx, a configuração do HSTS é bastante direta. Insira a diretiva add_header no bloco server correspondente à sua configuração HTTPS (porta 443), geralmetne em /etc/nginx/nginx.conf ou nos arquivos de configuração do site em /etc/nginx/sites-available/:

server {
    listen 443 ssl;
    server_name seu-dominio.com www.seu-dominio.com;
    # Outras configurações SSL aqui

    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # ... restante da configuração do servidor
}

O parâmetro always assegura que o cabeçalho seja incluído em todas as respostas, mesmo em páginas de erro. Se o cabeçalho não estiver sendo enviado conforme esperado ao adicioná-lo no bloco server, uma alternativa pode ser adicioná-lo dentro de um bloco location específico, como para arquivos PHP:

location ~ \.php$ {
    # Outras configurações PHP aqui
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    # ...
}

Após salvar as alterações, é fundamental testar a configuração e recarregar ou reiniciar o Nginx:

sudo nginx -t
sudo systemctl reload nginx

1.3. Habilitando HSTS no Lighttpd

Para servidores Lighttpd, a ativação do HSTS requer o módulo mod_setenv. Certifique-se de que ele esteja carregado e, em seguida, adicione as seguintes linhas ao seu arquivo de configuração (por exemplo, /etc/lighttpd/lighttpd.conf):

server.modules += ( "mod_setenv" )

$HTTP["scheme"] == "https" {
    # Define o cabeçalho HSTS para conexões HTTPS
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubDomains; preload" )
}

Salve o arquivo de configuração e reinicie o Lighttpd para que as alterações entrem em vigor:

sudo systemctl restart lighttpd

1.4. Configuração Genérica de HSTS via PHP

Caso as configurações do servidor web não sejam diretamente acessíveis ou se prefira uma abordagem baseada em aplicação, o cabeçalho HSTS pode ser enviado diretamente via PHP. Adicione a seguinte linha de código no início dos scripts PHP que servem suas páginas (por exemplo, em index.php ou um arquivo de cabeçalho global como header.php), antes de qualquer saída para o navegador:

<?php
header('Strict-Transport-Security: max-age=63072000; includeSubDomains; preload');
// Resto do seu código PHP
?>

É crucial que esta diretiva seja executada antes de qualquer conteúdo ser enviado ao navegador, caso contrário, resultará em um erro "Headers already sent".

1.5. Verificando o HSTS com SSL Labs

Após a implementação, é recomendável verificar a configuração do SSL/TLS do seu site e o cabeçalho HSTS usando ferramentas de análise online. Uma ferramenta popular é o SSL Labs da Qualys, que pode fornecer uma classificação detalhada da segurança do seu servidor, incluindo a detecção do cabeçalho HSTS:

  1. Adesão à Lista de Pré-Carregamento HSTS

A Lista de Pré-Carregamento HSTS é um catálogo global de domínios que os principais navegadores (como Chrome, Firefox, Safari e Edge) têm codificados internamente, garantindo que esses sites sejam sempre acessados via HTTPS desde a primeira interação do usuário. Isso elimina a vulnerabilidade de uma primeira conexão HTTP, que ainda poderia ser suscetível a ataques.

2.1. Requisitos para a Lista de Pré-Carregamento

Para que um domínio seja elegível para inclusão na Lista de Pré-Carregamento HSTS, ele deve atender a vários critérios rigorosos:

  1. Servir HTTPS: O domínio base e todos os subdomínios devem servir conteúdo exclusivamente via HTTPS.
  2. Redirecionamento Adequado: Qualquer tentativa de acesso via HTTP ao domínio base ou subdomínios deve ser redirecionada para a versão HTTPS equivalente, usando um redirecionamento 301.
  3. Cabeçalho HSTS Correto: O site deve enviar o cabeçalho Strict-Transport-Security com os seguintes parâmetros:
    • max-age deve ser de pelo menos 31536000 segundos (um ano), mas recomenda-se um valor maior, como 63072000 (dois anos), para a lista de pré-carregamento.
    • includeSubDomains deve estar presente.
    • preload deve estar presente.
  4. Disponibilidade: O site deve estar acessível e enviar o cabeçalho HSTS corretamente.

2.2. Testando a Ativação do HSTS

Antes de solicitar a inclusão na lista de pré-carregamento, é vital confirmar que o cabeçalho HSTS está sendo enviado corretamente. Você pode fazer isso inspecionando as respostas HTTP no navegador. Abra as ferramentas de desenvolvedor (F12) em seu navegador, vá para a aba "Rede" e verifique os cabeçalhos de resposta para a presença de Strict-Transport-Security.

2.3. Configurando Redirecionamento HTTP para HTTPS

É fundamental garantir que todo o tráfego HTTP para seu domínio e subdomínios seja redirecionado permanentemente (código de status 301) para a versão HTTPS. Após a ativação do HSTS no navegador de um usuário, as tentativas subsequentes de acesso HTTP serão forçadas a HTTPS com um redirecionamento interno (código 307), mas a primeira conexão ainda depende de um redirecionamento 301 do servidor para ser segura e atender aos requisitos da lista de pré-carregamento.

2.4. Submetendo o Domínio para a Lista de Pré-Carregamento

Uma vez que todos os requisitos técnicos sejam atendidos, o próximo passo é submeter seu domínio para inclusão na Lista de Pré-carregamento HSTS:

  1. Acesse o site oficial: hstspreload.org
  2. Insira seu domínio e o site verificará automaticamente sua conformidade.
  3. Se o domínio atender a todos os requisitos, você poderá enviar a solicitação.

O processo de revisão e inclusão pode levar um tempo considerável, pois envolve a validação e, posteriormente, a incorporação em futuras versões dos navegadores.

  1. Gerenciamento da Lista de Pré-Carregamento HSTS

3.1. Confirmando a Inclusão do Domínio

Para verificar se seu domínio foi efetivamente adicionado à Lista de Pré-carregamento HSTS e está sendo reconhecido pelos navegadores, você pode:

  1. Consultar o código-fonte do Chromium, que mantém a lista mestra: transport_security_state_static.json.
  2. Após a inclusão e a atualização da versão do navegador, você pode verificar o estado do HSTS localmente no Chrome digitando chrome://net-internals/#hsts na barra de endereços e consultando seu domínio.

3.2. Solicitando a Remoção da Lista de Pré-Carregamento

A remoção de um domínio da Lista de Pré-carregamento HSTS é um processo possível, mas tão demorado quanto a inclusão, ou até mais.

  1. A solicitação de remoção pode ser iniciada em: hstspreload.org/removal/.
  2. É crucial entender que, mesmo após a solicitação ser aprovada e o domínio removido da lista mestra, pode levar muitos meses (dependendo dos ciclos de lançamento dos navegadores) para que essa mudança se propague para as instalações dos usuários finais. Durante esse tempo, os navegadores continuarão a forçar o HTTPS para o seu domínio. Por isso, a decisão de incluir um domínio deve ser tomada com extrema cautela.

Tags: HSTS HTTPS tls Segurança Web nginx

Publicado em 6-20 00:05