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:
-
/anonymous.html sem autenticação,
-
/login.html, e
-
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 HTTPS–your 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.