Cabeçalhos HSTS e de segurança para o seu website
Em cada página, o seu servidor web envia cabeçalhos (headers): linhas curtas com instruções para o browser. Determinam, em parte, a forma como o browser lida com a segurança do seu site. Aqui pode ler o que é o HSTS, que outros cabeçalhos de segurança existem e como configurá-los e testá-los.
Primeiro, o seu site tem de ter um certificado em funcionamento e reencaminhar os visitantes para https. Pode ler isso em Ativar, renovar e resolver problemas do certificado SSL e Reencaminhar obrigatoriamente os visitantes para https.
O que faz o HSTS?
O reencaminhamento para https tem um momento fraco: o primeiro pedido através de http ainda é enviado sem encriptação. 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 browser memoriza então que só pode abrir o seu site através de https. Se um visitante escrever mais tarde http://, o próprio browser converte isso para https, ainda antes de algo ser transmitido pela rede. Um cabeçalho HSTS recebido através de http simples é ignorado pelo browser.
| Elemento | Significado |
|---|---|
max-age | Durante quanto tempo o browser 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.oseudominio.nl e mail.oseudominio.nl. |
preload | Está a pedir a inclusão na lista incorporada nos browsers (hstspreload.org). Dessa forma, até mesmo a primeiríssima visita fica protegida. Para isso são necessários, entre outros, um ano, includeSubDomains e https em todos os subdomínios. Sair novamente da lista demora bastante tempo. |
max-age=0 | Apaga a instrução memorizada, na próxima visita através de https. |
includeSubDomains, isso também se aplica a todos os subdomínios, como uma página antiga de câmara ou impressora sem certificado. Por isso, construa isto de forma gradual: comece com um max-age curto, por exemplo um dia (86400), verifique se tudo funciona e aumente progressivamente até um ano.HSTS na WebOké
Na maioria dos nossos servidores, o servidor web envia o HSTS por predefinição para cada website aberto através de https: Strict-Transport-Security: max-age=31536000. Isso corresponde a um ano, sem includeSubDomains e sem preload. Para isso não precisa de fazer nada. Em alguns servidores, isto não está ativado por predefinição; nesses casos, ativa-o você mesmo. Pode verificar se o seu site já envia o HSTS e com que max-age nas ferramentas de programador do seu browser ou no teste do internet.nl (ver abaixo).
O interruptor do HSTS no DirectAdmin
No DirectAdmin, vá a Domínios (Domains) e clique no seu nome de domínio. Se Ligação SSL segura (Secure SSL) estiver ativada, verá junto ao HSTS o interruptor Ativar HTTP Strict Transport Security (Enable HTTP Strict Transport Security). Depois, clique em Guardar (Save) para guardar. Pode ler o passo a passo em Reencaminhar sempre os visitantes para https.
Se o seu site já enviar o HSTS, não precisa do interruptor. Só o deve ativar se o seu site ainda não enviar o HSTS. Configure o HSTS num único local: no DirectAdmin ou no .htaccess, nunca em ambos. Se o browser receber dois cabeçalhos HSTS, utiliza apenas o primeiro.
Os outros cabeçalhos de segurança
| Cabeçalho | Contra o quê | Valor para começar |
|---|---|---|
X-Content-Type-Options | O browser tenta adivinhar o tipo de um ficheiro, o que pode fazer com que uma "imagem" carregada seja executada como 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 numa frame, fazendo com que os visitantes cliquem, sem se aperceberem, nos seus botões. | frame-ancestors 'self', ou o cabeçalho mais antigo X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Ao clicar para outro site, o browser 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 estrita, same-origin ou no-referrer. O internet.nl só considera corretos os valores mais estritos. |
Permissions-Policy | Determina quais as funções do browser 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 funções. Se o seu site utilizar alguma delas, omita-a. |
Content-Security-Policy (completo) | Limita os locais a partir dos quais scripts, estilos e imagens podem ser carregados. Isso torna muito mais difícil a inserção de scripts maliciosos (XSS). | Personalizado para cada 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 seu site ainda não enviar HSTS (ver acima): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Só deve acrescentar includeSubDomains quando tiver a certeza de que todos os subdomínios têm https. Se utilizar o 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 num único local: no plugin ou no .htaccess.
Content-Security-Policy-Report-Only. Esse não bloqueia nada, mas mostra na consola do browser o que seria bloqueado. Em caso de dúvida, deixe isto a cargo do seu criador de sites, ou comece apenas com frame-ancestors.Testar
- Internet.nl: introduza o seu domínio no teste do website em internet.nl.
- O seu browser: abra o seu site, prima 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) vê tudo o que o seu servidor envia.
- A linha de comandos:
curl -sI https://oseudominio.nl/mostra os cabeçalhos.
Após 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.
Mais informações
- MDN: Strict-Transport-Security (em inglês)
- MDN: Content-Security-Policy (em inglês)
- MDN: Permissions-Policy (em inglês)
- Lista de preload do HSTS (em inglês)
