HSTS e cabeçalhos de segurança para o seu site
Em cada página, o seu servidor Web envia cabeçalhos (headers): linhas curtas com instruções para o navegador. Determinam, em parte, como o navegador lida com a segurança do seu site. Aqui pode ler o que é o HSTS, quais são os outros cabeçalhos de segurança e como os configurar e testar.
Primeiro, o seu site tem de ter um certificado válido e redirecionar os visitantes para https. Pode ler isso em Ativar, renovar e resolver problemas do certificado SSL e Redirecionar obrigatoriamente os visitantes para https.
O que faz o HSTS?
O redirecionamento para https tem um momento fraco: o primeiro pedido feito através de http ainda não é encriptado. Alguém na mesma rede, por exemplo numa rede wifi pública, pode intercetar esse pedido. O HSTS (HTTP Strict Transport Security) resolve isso. O seu site envia este cabeçalho através de https:
Strict-Transport-Security: max-age=31536000
O navegador memoriza então que só pode abrir o seu site através de https. Se um visitante escrever mais tarde http://, o próprio navegador converte isso automaticamente para https, ainda antes de qualquer coisa ser enviada através da rede. Um cabeçalho HSTS recebido através de http simples é ignorado pelo navegador.
| Componente | Significado |
|---|---|
max-age | Durante quanto tempo o navegador memoriza isto, em segundos. O teste do internet.nl considera pelo menos um ano (31536000) suficiente. |
includeSubDomains | Aplica-se também a todos os subdomínios, como shop.odominio.pt e mail.odominio.pt. |
preload | Está a pedir a inclusão na lista incorporada nos navegadores (hstspreload.org). Assim, até a primeiríssima visita fica protegida. Para isso são necessários, entre outros requisitos, um ano, includeSubDomains e https em todos os subdomínios. Remover o site dessa lista demora bastante tempo. |
max-age=0 | Apaga a instrução memorizada, na próxima visita através de https. |
includeSubDomains, isto aplica-se também a cada subdomínio, como uma antiga página de câmara ou impressora sem certificado. Por isso, configure-o gradualmente: comece com um max-age curto, por exemplo um dia (86400), verifique se tudo funciona e aumente progressivamente até um ano.O interruptor de HSTS no DirectAdmin
No DirectAdmin, vá a Domínios e clique no nome do seu domínio. Se a opção Ligação SSL segura estiver ativada, verá junto ao HSTS o interruptor Ativar HTTP Strict Transport Security. Depois clique em Editar para guardar. Pode ler o passo a passo em Redirecionar sempre os visitantes para https.
Se quiser saber que max-age o seu site envia, consulte as ferramentas de desenvolvedor do seu navegador ou o teste do internet.nl (ver abaixo). Configure o HSTS apenas num único local: no DirectAdmin ou no .htaccess, não em ambos. Se o navegador receber dois cabeçalhos HSTS, utiliza apenas o primeiro.
Os outros cabeçalhos de segurança
| Cabeçalho | Contra o quê | Valor inicial recomendado |
|---|---|---|
X-Content-Type-Options | O navegador tenta adivinhar qual é o tipo de um ficheiro, o que pode fazer com que uma "imagem" carregada seja executada como um script. | nosniff (o único valor válido) |
Content-Security-Policy: frame-ancestors ou X-Frame-Options | Clickjacking: outro site carrega a sua página de forma invisível dentro de uma frame, levando os visitantes a clicar nos seus botões sem se aperceberem. | frame-ancestors 'self', ou o cabeçalho mais antigo X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Ao clicar para outro site, o navegador envia o endereço da página anterior, por vezes com um termo de pesquisa ou número de encomenda incluído. | strict-origin-when-cross-origin, ou, de forma mais rigorosa, same-origin ou no-referrer. O internet.nl só considera positivos os valores mais rigorosos. |
Permissions-Policy | Determina quais as funcionalidades do navegador que a sua página e as frames incorporadas podem utilizar, como câmara, microfone e localização. | camera=(), microphone=(), geolocation=() desativa essas três. Se o seu site utilizar alguma dessas funcionalidades, não a inclua. |
Content-Security-Policy (completo) | Limita os locais a partir dos quais podem ser carregados scripts, estilos e imagens. Isto torna muito mais difícil a injeção de scripts maliciosos (XSS). | Configuração personalizada por site. Evite unsafe-inline, unsafe-eval e wildcards. |
Configurar no .htaccess
Coloque estas linhas no início do ficheiro .htaccess, na pasta public_html do seu domínio. Faça primeiro uma cópia do ficheiro.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "frame-ancestors 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Apenas se o interruptor de HSTS no DirectAdmin estiver desativado: # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Só deve adicionar includeSubDomains quando tiver a certeza de que todos os subdomínios têm https. Se utilizar WordPress, também pode configurar os cabeçalhos através de um plugin. Escolha um plugin conhecido que continue a ser atualizado, e configure cada cabeçalho apenas num único local: no plugin ou no .htaccess.
Content-Security-Policy-Report-Only. Este não bloqueia nada, mas mostra na consola do navegador o que seria bloqueado. Em caso de dúvida, deixe esta tarefa a cargo do seu criador de sites, ou comece apenas com frame-ancestors.Testar
- Internet.nl: introduza o seu domínio no teste do site em internet.nl.
- O seu navegador: abra o seu site, pressione F12 (ou escolha Inspecionar), vá ao separador Rede (Network), volte a carregar a página e clique no primeiro pedido. Em Cabeçalhos de resposta (Response Headers) verá tudo o que o seu servidor envia.
- A linha de comandos:
curl -sI https://odominio.pt/mostra os cabeçalhos.
Depois de cada alteração, verifique se o seu site, os formulários e a página de pagamento continuam a funcionar. Mantenha também o seu CMS, plugins e temas atualizados. Consulte Proteger o wp-login.php do WordPress.
Saber mais
- MDN: Strict-Transport-Security (em inglês)
- MDN: Content-Security-Policy (em inglês)
- MDN: Permissions-Policy (em inglês)
- Lista de preload HSTS (em inglês)
