Skip to main content

10 práticas recomendadas de segurança para Spring Boot

Escrito por

Matt Raible

Spring Boot Security Best Practices small

16 de agosto de 2018

0 minutos de leitura

Está trabalhando com Spring Boot e não sabe por onde começar quando o assunto é segurança? Não precisa mais se preocupar! Este guia rápido apresenta práticas recomendadas para desenvolvedores e responsáveis pela manutenção melhorarem a segurança do Spring Boot.

O Spring Boot é um dos frameworks mais usados no ecossistema Java porque simplifica drasticamente o desenvolvimento de aplicações Spring. Por isso, vale a pena tentar melhorar a postura geral de segurança das suas aplicações Spring Boot. E estamos aqui para ajudar você a fazer exatamente isso.

Esta publicação foi originalmente escrita em formato de artigo e com mais detalhes, com Matt Raible, Java Champion e Developer Advocate na Okta. Nós dois trabalhamos em empresas do setor de segurança, adoramos Java e queremos ajudar desenvolvedores a criar aplicações mais seguras. Então, nada melhor do que produzir um guia rápido e caprichado sobre segurança no Spring Boot!

Sem mais demora, vamos à nossa lista de práticas recomendadas de segurança para Spring Boot. O artigo original, com mais detalhes, está no blog da Okta.

O que é segurança no Spring Boot?

Segurança no Spring Boot pode significar coisas diferentes. Em geral, trata-se de adicionar o framework Spring Security à sua aplicação web Spring Boot, incluindo a dependência inicial de segurança do Spring Boot. O Spring Security é um framework de autenticação e controle de acesso que pode ser facilmente incluído em uma aplicação Spring Boot. Por outro lado, segurança no Spring Boot vai além de apenas incluir o framework Spring Security. Este guia rápido aborda o tema de forma mais ampla e explica como proteger sua aplicação criada com Spring Boot.

Práticas recomendadas de segurança para Spring Boot

A lista selecionada a seguir vai além da apresentação do Spring Security para autenticação e autorização na sua aplicação Spring Boot. Ela aborda a estratégia de segurança do Spring Boot de forma mais ampla e cobre os seguintes tópicos:

  1. Use HTTPS em produção

  2. Teste suas dependências e encontre vulnerabilidades no Spring Boot

  3. Ative a proteção contra CSRF

  4. Use uma política de segurança de conteúdo para proteger o Spring Boot contra XSS

  5. Use OpenID Connect para autenticação

  6. Use hash de senhas

  7. Use as versões mais recentes

  8. Armazene segredos com segurança

  9. Faça testes de invasão na sua aplicação

  10. Peça à sua equipe de segurança para revisar o código

1. Use HTTPS em produção

Os certificados TLS/SSL costumavam ser caros, e o HTTPS era considerado lento. As máquinas ficaram muito mais rápidas, resolvendo o problema de desempenho, e o Let’s Encrypt oferece certificados TLS gratuitos. Esses dois avanços mudaram o cenário e popularizaram o TLS.

Para forçar o uso de HTTPS na sua aplicação Spring Boot, você pode estender WebSecurityConfigurerAdapter e exigir uma conexão segura.

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

 @Override
 protected void configure(HttpSecurity http) throws Exception {
   http.requiresChannel().requiresSecure();
 }
}

Os provedores de nuvem podem simplificar bastante o uso de certificados TLS. O Amazon Certificate Manager funciona exatamente como o Let’s Encrypt, mas vem integrado por padrão a todos os produtos e serviços da AWS. Com ele, você provisiona certificados SSL 100% gratuitos e conta com renovação automática, entre outros recursos, sem nenhum esforço ou configuração. O Heroku também oferece o Gerenciamento Automatizado de Certificados.

2. Teste suas dependências e encontre vulnerabilidades no Spring Boot

É bem provável que você não saiba quantas dependências diretas sua aplicação usa. E é extremamente provável que não saiba quantas dependências transitivas ela usa. Isso acontece com frequência, embora as dependências representem a maior parte da aplicação e possam conter vulnerabilidades de segurança no Spring Boot. Os invasores têm como alvo as dependências de código aberto cada vez mais, pois a reutilização delas oferece muitas vítimas em potencial para um hacker mal-intencionado. É importante garantir que não haja vulnerabilidades conhecidas em toda a árvore de dependências da sua aplicação.

O Snyk testa os artefatos de build da sua aplicação e sinaliza as dependências com vulnerabilidades de segurança conhecidas no Spring Boot. Ele apresenta em um painel uma lista das vulnerabilidades presentes nos pacotes usados na sua aplicação.

Painel da Snyk mostrando todos os projetos vulneráveis, com a quantidade de vulnerabilidades de alta, média e baixa gravidade em três projetos Maven do GitHub.

Além disso, o Snyk sugere versões para atualização ou fornece correções para resolver seus problemas de segurança, por meio de uma solicitação de pull request no repositório do código-fonte. O Snyk também protege seu ambiente: todas as futuras solicitações de pull request abertas no repositório são testadas automaticamente por webhooks, para garantir que não introduzam novas vulnerabilidades conhecidas no Spring Boot.

O Snyk está disponível tanto em uma interface web quanto em uma CLI, facilitando a integração ao seu ambiente de CI. Você também pode configurá-lo para interromper o build quando houver vulnerabilidades com gravidade acima do limite definido.

Comece a jogar Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.

3. Ative a proteção contra CSRF

Cross-Site Request Forgery é um ataque que força uma pessoa a executar ações indesejadas em uma aplicação na qual está conectada.

O Spring Security oferece excelente suporte a CSRF, ativado por padrão. Se você usa a tag <form:form> do Spring MVC ou o Thymeleaf com @EnableWebSecurity, o token CSRF é adicionado automaticamente como um campo de entrada oculto. Para incluir isso na sua estratégia de segurança do Spring Boot, adicione o starter do Spring Security como dependência.

Se você usa um framework JavaScript como Angular ou React, precisa configurar o CookieCsrfTokenRepository para que o JavaScript possa ler o cookie.

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http
           .csrf()
               .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
   }
}

O Spring Security adiciona automaticamente a flag secure ao cookie XSRF-TOKEN quando a solicitação é feita por HTTPS. O Spring Security não usa a flag SameSite=strict para cookies CSRF, mas usa essa flag com o Spring Session ou o gerenciamento de sessão do WebFlux.

4. Use uma política de segurança de conteúdo para proteger o Spring Boot contra XSS

A Content Security Policy (CSP) é uma camada adicional de segurança que ajuda a atenuar ataques de XSS (cross-site scripting) e injeção de dados. Para ativá-la, configure sua aplicação para retornar um cabeçalho Content-Security-Policy. Você também pode usar uma tag <meta http-equiv="Content-Security-Policy"> na página HTML.

O Spring Security fornece vários cabeçalhos de segurança por padrão. O Spring Security não adiciona uma CSP por padrão. Você pode ativar o cabeçalho CSP na sua aplicação Spring Boot usando a configuração abaixo.

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.headers()
           .contentSecurityPolicy("script-src 'self' https://trustedscripts.example.com; object-src https://trustedplugins.example.com; report-uri /csp-report-endpoint/");
   }
}

5. Use OpenID Connect para autenticação

O OpenID Connect (OIDC) é uma extensão do OAuth 2.0 que fornece informações sobre o usuário. Além de um token de acesso, ele adiciona um token de ID e um endpoint /userinfo, do qual você pode obter informações adicionais. O OIDC também oferece descoberta de endpoints e registro dinâmico de clientes.

O diagrama abaixo mostra como o OIDC funciona para autenticação.

Diagrama do fluxo de código de autorização OIDC, mostrando um cliente, um servidor de autorização, o consentimento do usuário, um callback e a troca de tokens.

6. Use hash de senhas

Armazenar senhas em texto simples é uma das piores coisas que você pode fazer para a segurança da sua aplicação. Felizmente, o Spring Security não permite senhas em texto simples por padrão. Ele também inclui um módulo de criptografia que você pode usar para criptografia simétrica, geração de chaves e hash de senhas (também conhecido como codificação de senhas).

PasswordEncoder é a principal interface para hash de senhas no Spring Security e tem a seguinte aparência:

public interface PasswordEncoder {
   String encode(String rawPassword);
   boolean matches(String rawPassword, String encodedPassword);
}

O Spring Security oferece várias implementações. As mais populares são BCryptPasswordEncoder e Pbkdf2PasswordEncoder.

7. Use as versões mais recentes

Há vários motivos para atualizar regularmente as dependências da sua aplicação. A segurança é um dos motivos mais importantes para fazer isso. A página inicial start.spring.io usa as versões mais recentes possíveis dos pacotes e dependências do Spring.

As atualizações de infraestrutura costumam causar menos impacto do que as atualizações de dependências, pois os autores de bibliotecas variam quanto à preocupação com a compatibilidade com versões anteriores e as mudanças de comportamento entre versões. Ainda assim, ao encontrar uma vulnerabilidade de segurança na sua configuração, você tem três opções: atualizar, corrigir ou ignorar. Atualizar é a opção mais segura para a saúde geral da aplicação, mas nem sempre é possível. Nesse caso, as correções podem eliminar as vulnerabilidades do pacote e muitas vezes podem ser obtidas com especialistas em segurança, como o Snyk. Ignorar uma vulnerabilidade também é uma opção, mas não é uma boa escolha. Talvez você conheça uma vulnerabilidade, mas não acredite que ela possa ser explorada diretamente. Lembre-se: ela pode não fazer parte do fluxo da sua aplicação hoje, mas, em algum momento, um desenvolvedor pode adicionar código que use um caminho vulnerável.

8. Armazene segredos com segurança

Como parte da sua estratégia de segurança para Spring Boot, também precisamos pensar nos seus dados. Informações confidenciais, como senhas e tokens de acesso, devem ser tratadas com cuidado. Não deixe esses dados expostos, não os transmita em texto simples e evite padrões previsíveis ao mantê-los no armazenamento local. Como o histórico do (GitHub) já mostrou muitas vezes, os desenvolvedores nem sempre pensam com o devido cuidado sobre como armazenar seus segredos.

Uma boa prática é armazenar segredos em um cofre que possa guardá-los, controlar o acesso a eles e até gerar credenciais para os serviços usados pela sua aplicação. O Vault by HashiCorp facilita muito o armazenamento de segredos e oferece vários serviços adicionais. Você também pode integrá-lo a mecanismos de autenticação comuns, como LDAP, para obter tokens.

Se isso chamou sua atenção, reserve um tempo para conhecer o Spring Vault, que acrescenta uma camada de abstração ao HashiCorp Vault e oferece acesso baseado em anotações do Spring para que os clientes acessem, armazenem e revoguem segredos sem precisar lidar com a infraestrutura. O trecho de código a seguir mostra como é fácil extrair uma senha do Spring Vault usando uma anotação.

@Value("${password}")
String password;

9. Faça testes de invasão na sua aplicação

A ferramenta de segurança OWASP ZAP é um proxy que realiza testes de invasão na sua aplicação ativa durante a execução. É um projeto gratuito e de código aberto bastante popular, com mais de 4 mil estrelas, hospedado no GitHub.

O OWASP ZAP usa duas abordagens para encontrar vulnerabilidades: Spider e Active Scan. A ferramenta Spider começa com uma lista inicial de URLs, acessa cada uma e analisa as respostas para identificar hyperlinks e adicioná-los a uma lista. Em seguida, acessa as novas URLs encontradas e repete o processo recursivamente, criando um mapa de URLs da sua aplicação web. A ferramenta Active Scan testa automaticamente os alvos selecionados em busca de possíveis vulnerabilidades. Ela fornece um relatório que mostra onde sua aplicação web pode ser explorada, com detalhes sobre cada vulnerabilidade.

10. Peça à sua equipe de segurança para revisar o código

As revisões de código são essenciais para qualquer equipe de desenvolvimento de software de alto desempenho. Na Okta, todo o código de produção e os projetos oficiais de código aberto precisam passar pela análise da nossa equipe especializada em segurança. Talvez sua empresa não tenha especialistas em segurança, mas, se você lida com dados confidenciais, deveria considerar isso!

Não deixe de baixar o guia rápido de segurança para Spring Boot e colocá-lo em um lugar visível para lembrar algumas das práticas recomendadas que você deve seguir ao usar Spring Boot nas suas aplicações.

Perguntas frequentes

Como adiciono segurança ao Spring Boot?

Para adicionar o Spring Security à sua aplicação Spring Boot, comece incluindo a dependência inicial de segurança.

Como desativo o Spring Security no Spring Boot?

Por padrão, o Spring Security é ativado quando você inclui o pacote spring-boot-starter-security. É fácil desativá-lo excluindo o SecurityAutoConfiguration no arquivo application.properties.

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

Comece a jogar Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.

Leia mais

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.

feature insights context
Blog

Os ataques autônomos já chegaram. A defesa precisa acompanhar o ritmo.

Os atacantes autônomos estão reduzindo o tempo disponível para a defesa. Saiba como a descoberta, a correção, a validação e a prevenção contínuas ajudam as equipes de segurança a acompanhar esse ritmo.

Blog

Por que agentes de programação com IA continuam criando falhas de controle de acesso

Agentes de programação com IA podem gerar uma lógica de autorização que compila e passa pela revisão, mas permite que um tenant acesse os dados de outro. Saiba por que é difícil detectar falhas de controle de acesso e como evitá-las.