Depois que todo o site é HTTPS, se o usuário inserir manualmente o endereço HTTP do site ou clicar no link HTTP do site de outros lugares, geralmente depende do salto 301/302 do lado do servidor para usar o serviço HTTPS. A primeira solicitação HTTP pode ser sequestrada, fazendo com que a solicitação não chegue ao servidor, constituindo assim um sequestro de downgrade de HTTPS. Atualmente, esse problema pode ser resolvido através do HSTS (HTTP Strict Transport Security, RFC6797). |
Introdução ao HSTS
HSTS (HTTP Strict Transport Security) é um mecanismo de política de segurança da Internet lançado pela Organização Internacional de Engenharia da Internet IETF. Os sites que adotam a política HSTS garantirão que o navegador sempre se conecte à versão criptografada HTTPS do site, eliminando a necessidade dos usuários inserirem manualmente o endereço criptografado na barra de endereço URL para reduzir o risco de sequestro de sessão.
Formato do cabeçalho de resposta HSTS
Segurança de transporte estrita: max-age=expireTime [; includeSubDomains] [; pré-carregamento]
- max-age, em segundos, é usado para informar ao navegador que este site deve ser acessado através do protocolo HTTPS dentro de um tempo especificado. Ou seja, para o endereço HTTP deste site, o navegador precisa substituí-lo localmente por HTTPS antes de enviar a solicitação.
- includeSubDomains, parâmetro opcional. Se este parâmetro for especificado, indica que todos os nomes de subdomínios deste site também devem ser acessados através do protocolo HTTPS.
- pré-carregamento, parâmetro opcional, uma lista de nomes de domínio integrados ao navegador que usa HTTPS.
Lista de pré-carregamento HSTS
Embora o HSTS possa resolver com eficácia os ataques de downgrade de HTTPS, a primeira solicitação HTTP antes do HSTS entrar em vigor não pode evitar ser sequestrada. Para resolver este problema, os fabricantes de navegadores propuseram a solução HSTS Preload List: uma lista integrada que pode ser atualizada regularmente. Para os nomes de domínio na lista, mesmo que o usuário não os tenha visitado antes, o protocolo HTTPS irá ser usado.
Atualmente esta lista de pré-carregamento é mantida pelo Google Chrome e usada pelo Chrome, Firefox, Safari, IE 11 e Microsoft Edge. Se quiser adicionar seu nome de domínio a esta lista, primeiro você precisa atender às seguintes condições:
- Ter um certificado legítimo (se for utilizado um certificado SHA-1, a data de validade deve ser anterior a 2016);
- Redirecione todo o tráfego HTTP para HTTPS;
- Certifique-se de que todos os subdomínios tenham HTTPS ativado;
- Cabeçalho de resposta HSTS de saída:
- a idade máxima não pode ser inferior a 18 semanas (10886400 segundos);
- O parâmetro includeSubdomains deve ser especificado;
- O parâmetro preload deve ser especificado;
Mesmo que todas as condições acima sejam atendidas, talvez você não consiga entrar na lista de pré-carregamento do HSTS.
Por meio da ferramenta chrome://net-internals/#hsts do Chrome, você pode verificar se um site está na lista de pré-carregamento e também pode adicionar manualmente um nome de domínio à lista de pré-carregamento local.
Desvantagens do HSTS
O HSTS não é uma solução perfeita para sequestro de sessão HTTP. A primeira vez que um usuário visita um site não é protegido pelo HSTS. Isso ocorre porque ao acessar pela primeira vez, o navegador ainda não recebeu HSTS, portanto ainda é possível acessar através de HTTP de texto simples.
Se um usuário acessar um site protegido por HSTS por meio de HTTP, o sequestro de downgrade poderá ocorrer nas seguintes situações:
- Nunca visitei este site antes
- Recentemente reinstalou seu sistema operacional
- Reinstalou recentemente o navegador
- Mudar para um novo navegador
- Mude para um novo dispositivo, como um telefone celular
- Excluir cache do navegador
- O site não foi visitado recentemente e a idade máxima expirou.
Atualmente existem duas soluções para este problema:
Solução 1: predefinir a lista de nomes de domínio HSTS no navegador, que é a solução HSTS Preload List mencionada acima. Esta lista de nomes de domínio é distribuída e codificada nos principais navegadores da web. Os clientes que acessam nomes de domínio nesta lista usarão HTTPS ativamente e negarão acesso ao site usando HTTP.
Solução 2: adicione informações de HSTS ao registro do sistema de nomes de domínio. Mas isso requer garantir a segurança do DNS, o que significa implantar extensões de segurança do sistema de nomes de domínio.
Outros possíveis problemas
Como o HSTS expirará após um determinado período de tempo (o período de validade é especificado pela idade máxima), se o navegador forçará a política de HSTS dependerá da hora atual do sistema. A maioria dos sistemas operacionais costuma atualizar a hora do sistema por meio do Network Time Protocol. Por exemplo, toda vez que o Ubuntu se conecta à rede, o OS X Lion se conecta automaticamente ao servidor de horário a cada 9 minutos. Um invasor pode ignorar o HSTS falsificando informações NTP e definindo a hora incorreta.
A solução é autenticar as informações do NTP ou proibir o NTP de aumentar ou diminuir muito o tempo. Por exemplo: o Windows 8 atualiza o horário a cada 7 dias e exige que o horário definido pelo NTP a cada vez não exceda 15 horas a partir do horário atual.
Suporte ao navegador HSTS
Atualmente, os navegadores convencionais já suportam o recurso HSTS. Para obter detalhes, consulte a lista a seguir:
- Google Chrome 4 e superior
- Firefox 4 e superior
- Ópera 12 e superior
- Safari começando com OS X Mavericks
- Internet Explorer e superior
Implantação HSTS
O método para o servidor habilitar o HSTS é: quando o cliente faz uma solicitação através de HTTPS, o cabeçalho de resposta do Hypertext Transfer Protocol retornado pelo servidor inclui o campo Strict-Transport-Security. O campo HSTS definido durante a transmissão não criptografada é inválido.
A melhor solução de implantação é implantá-lo no local mais próximo do usuário. Por exemplo, se a arquitetura tiver um proxy reverso front-end e um servidor Web back-end, é melhor configurar o HSTS no proxy front-end. Caso contrário, será necessário configurar o HSTS na camada do servidor Web. Se o servidor web não suportar explicitamente HSTS, um mecanismo poderá ser usado para adicionar cabeçalhos de resposta. Se tudo mais falhar, o HSTS poderá ser adicionado na camada de aplicação.
Habilitar o HSTS é relativamente simples, basta adicionar as seguintes informações ao cabeçalho correspondente:
Segurança de transporte estrita: idade máxima = 63072000; includeSubdomains;pré-carregamento;
Strict-Transport-Security é o nome do campo de cabeçalho e max-age representa o tempo efetivo de HSTS no cliente. includeSubdomains significa que entra em vigor em todos os subdomínios. pré-carregamento usa a lista de nomes de domínio integrada do navegador.
A política HSTS só pode ser definida na resposta HTTPS, e o site deve usar a porta padrão 443; deve usar um nome de domínio, não um IP. Portanto, o HTTP precisa ser redirecionado para HTTPS. Se o cabeçalho HSTS puder ser definido na resposta de texto simples, um invasor man-in-the-middle poderá realizar um ataque DoS injetando informações de HSTS em um site normal.
Habilite HSTS no Apache
$ vim /etc/apache2/sites-available/hi-linux.conf # Para habilitar o HSTS , você precisa habilitar o módulo de cabeçalhos LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so <VirtualHost *:80> ServerName www .hi-linux.com ServerAlias hi-linux.com ... #Redirecione todos os visitantes para HTTPS para resolver o problema de primeiro acesso HSTS. RedirectPermanent / https://www.hi-linux.com/ </VirtualHost> <VirtualHost 0.0.0.0:443> ... # Habilite o cabeçalho HTTP Strict Transport Security sempre defina Strict-Transport-Security "max-age=63072000; includeSubdomains; pré-carregar" ... </VirtualHost>
Reinicie o serviço Apache
$ serviço apche2 reiniciar
Habilite HSTS no Nginx
$ vim /etc/nginx/conf.d/hi-linux.conf servidor { ouvir 443 ssl; nome_do_servidor www.hi-linux.com; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; pré-carregamento"; ... } servidor { ouvir 80; nome_do_servidor www.hi-linux.com; retorne 301 https://www.hi-linux.com$request_uri; ... }
Reinicie o serviço Nginx
$ serviço nginx reiniciar
IIS habilita HSTS
Para habilitar o HSTS no IIS, é necessário um módulo de terceiros.
Depois que a configuração for concluída, você poderá usar o comando curl para verificar se a configuração foi bem-sucedida. Se o resultado contiver o campo Strict-Transport-Security, a configuração foi bem-sucedida.
$ curl -I https://www.hi-linux.com HTTP/1.1 200 OK Servidor: nginx Data: Sábado, 27 de maio de 2017 03:52:19 GMT Tipo de conteúdo: text/html; charset=utf-8 ... Segurança de transporte estrita: idade máxima=63072000; includeSubDomains; pré-carregar X-Frame-Options: negar X-XSS-Protection: 1; mode=bloco X-Content-Type-Options: nosniff ...
Para HSTS e HSTS Preload List, a recomendação é não habilitá-lo enquanto não for possível garantir que o serviço HTTPS sempre será fornecido. Porque assim que o HSTS entrar em vigor, os usuários antigos serão redirecionados para HTTPS antes que a idade máxima expire, fazendo com que o site não possa ser acessado corretamente. A única maneira é alterar o nome de domínio.