Segurança do canal HTTP/HTTPS da primavera

Segurança do canal HTTP / HTTPS da primavera

1. Visão geral

Este tutorial mostrahow to use HTTPS to protect your application’s login page usando o recurso Channel Security do Spring.

O uso de HTTPS para autenticação é crucial para proteger a integridade de dados confidenciais durante o transporte.

O artigo se baseia emSpring Security Login tutorial, adicionando uma camada adicional de segurança. Destacamos as etapas necessárias para proteger os dados de autenticação, fornecendo a página de login através do canal HTTPS codificado.

2. Configuração inicial sem segurança de canal

Vamos começar com a configuração de segurança explicada no artigo mencionado.

O aplicativo da web permite que os usuários acessem:

  1. /anonymous.html sem autenticação,

  2. /login.html, e

  3. outras páginas (/homepage.html) após um login bem-sucedido.

O acesso é controlado pela seguinte configuração:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/anonymous*")
      .anonymous();

    http.authorizeRequests()
      .antMatchers("/login*")
      .permitAll();

    http.authorizeRequests()
      .anyRequest()
      .authenticated();

Ou via XML:


    
    
    

Neste ponto, a página de login está disponível em:

http://localhost:8080/spring-security-login/login.html

Os usuários podem se autenticar através de HTTP, porém isso é inseguro, pois as senhas serão enviadas em texto sem formatação.

3. Configuração do servidor HTTPS

Para entregar a página de login apenas por HTTPSyour web-server must be able to serve HTTPS pages. Isso requer que o suporteSSL/TLS esteja ativado.

Observe que você pode usar um certificado válido ou, para fins de teste, pode gerar o seu próprio.

Digamos que estejamos usando o Tomcat e lançando nosso próprio certificado. Primeiro, precisamos criar umkeystore com um certificado autoassinado.

A geração do keystore pode ser feita emitindo o seguinte comando no terminal:

keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat'

Isso criará uma chave privada e um certificado autoassinado no keystore padrão para o seu perfil de usuário, na sua pasta pessoal.

A próxima etapa é editarconf/server.xml para torná-lo parecido com este:



A segunda tag SSL / TLS<Connector> geralmente é comentada no arquivo de configuração, portanto, remover o comentário e adicionar informações de armazenamento de chave é tudo o que é necessário. Mais informações estão disponíveis emTomcat’s related documentation.

Com a configuração HTTPS em vigor, a página de login também pode ser veiculada na seguinte URL:

https://localhost:8443/spring-security-login/login.html

Servidores da Web diferentes do Tomcat exigiriam configurações diferentes, mas provavelmente similares.

4. Configurando a Segurança do Canal

Neste ponto, podemos servir a página de login em HTTP e HTTPS. Esta seção explica como determinar o uso de HTTPS.

To require HTTPS for the login page modifique sua configuração de segurança adicionando o seguinte:

http.requiresChannel()
  .antMatchers("/login*").requiresSecure();

Ou adicione o atributorequires-channel=”https” à sua configuração XML:

Após esse ponto, os usuários poderiam fazer login apenas via HTTPS. Todos os links relativos, por exemplo um encaminhamento para/homepage.html herdará o protocolo da solicitação original e será servido em HTTPS.

Ao misturar solicitações HTTP e HTTPS em um único aplicativo Web, há aspectos adicionais a serem observados e que requerem configuração adicional.

5. Misturando HTTP e HTTPS

Do ponto de vista da segurança, servir tudo em HTTPS é uma boa prática e um objetivo sólido a ter.

No entanto, se o uso exclusivo de HTTPS não for uma opção, podemos configurar o Spring para usar HTTP anexando o seguinte à configuração:

http.requiresChannel()
  .anyRequest().requiresInsecure();

Ou adicione atributosrequires-channel=”http” ao XML:

Isso instrui o Spring a usar HTTP para todas as solicitações que não estão explicitamente configuradas para usar HTTPS, mas, ao mesmo tempo, quebra o mecanismo de login original. As seções a seguir explicam a causa subjacente.

5.1. Um URL de processamento de login personalizado por HTTPS

A configuração de segurança no tutorial de segurança original contém o seguinte:

Without forcing /perform_login to use HTTPS a redirect would happen to the HTTP variant of it, losing the login information enviado com a solicitação original.

Para superar isso, precisamos configurar o Spring para usar HTTPS para a URL de processamento:

http.requiresChannel()
  .antMatchers("/login*", "/perform_login");

Observe o argumento extra/perform_login passado para o métodoantMatchers.

O equivalente na configuração XML requer a adição de um novo elemento<intercept-url> à configuração:

Se o seu próprio aplicativo estiver usando ologin-processing-url padrão (que é/login), você não precisa configurar isso explicitamente, pois o padrão/login* já cobre isso.

Com a configuração em vigor, os usuários podem fazer login, mas não acessar páginas autenticadas, por exemplo. /homepage.html no protocolo HTTP, por causa deSpring’s session fixation protection feature.

5.2. Desativandosession-fixation-protection

Session fixation é um problema que não pode ser evitado ao alternar entre HTTP e HTTPS.

Por padrão, o Spring cria um novosession-id após um login bem-sucedido. Quando um usuário carrega a página de login HTTPS, o cookiesession-id do usuário será marcado comosecure.. Após o login, o contexto mudará para HTTP ethe cookie will be lost, pois o HTTP não é seguro.

Para evitar issosetting session-fixation-protection to none is required.

http.sessionManagement()
  .sessionFixation()
  .none();

Ou via XML:

Disabling session fixation protection might have security implications, portanto, você precisa pesar os prós e os contras se estiver preocupado com ataques baseados em fixação de sessão.

6. Test

Depois de aplicar todas essas mudanças de configuração, acessar/anonymous.html sem fazer login (usandohttp:// ou https: //) irá encaminhá-lo para a página através de HTTP.

Abrir outras páginas diretamente como/homepage.html deve encaminhá-lo para a página de login via HTTPS e, após o login, você será encaminhado de volta para/homepage.html usando HTTP.

7. Conclusão

Neste tutorial, demos uma olhada em como configurar um aplicativo da web Spring que se comunica por meio de HTTP, exceto para o mecanismo de login. No entanto,new modern web-applications should almost always use HTTPS exclusively como seu protocolo de comunicação. Reduzir os níveis de segurança ou desligar os recursos de segurança (comosession-fixation-protection) nunca é uma boa ideia.

Este tutorial é baseado emcodebase available on GitHub. A configuração de segurança do canal pode ser habilitada listandohttps comoSpring profile ativo.