Aplicação da política de segurança HSTS em navegadores

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.

Acho que você gosta

Origin blog.csdn.net/yaxuan88521/article/details/132966549
Recomendado
Clasificación