Skip to main content

10 bonnes pratiques de sécurité pour Spring Boot

Écrit par

Matt Raible

Spring Boot Security Best Practices small

16 août 2018

0 minutes de lecture

Vous travaillez avec Spring Boot et ne savez pas par où commencer en matière de sécurité ? Plus d’inquiétude ! Cette fiche pratique présente les bonnes pratiques qui permettent aux développeurs et aux responsables de la maintenance d’améliorer la sécurité de Spring Boot.

Spring Boot est l’un des frameworks les plus utilisés dans l’écosystème Java, car il simplifie considérablement le développement d’applications Spring. Il est donc judicieux de renforcer la posture de sécurité globale de vos applications Spring Boot. Et nous sommes là pour vous aider à y parvenir.

Cet article a d’abord été publié sous la forme d’un billet de blog plus détaillé, avec Matt Raible, Java Champion et Developer Advocate chez Okta. Nous travaillons tous deux pour des entreprises du secteur de la sécurité, nous aimons Java et souhaitons aider les développeurs à créer des applications plus sûres. Quoi de mieux que de produire une fiche pratique bien conçue sur la sécurité de Spring Boot !

Sans plus attendre, découvrons notre liste de bonnes pratiques de sécurité pour Spring Boot. Notez que la version originale, plus détaillée, est disponible sur le blog d’Okta.

Qu’est-ce que la sécurité de Spring Boot ?

La sécurité de Spring Boot peut désigner différentes choses. De manière générale, il s’agit d’ajouter le framework Spring Security à votre application web Spring Boot en incluant la dépendance de démarrage Spring Boot Security. Spring Security est un framework d’authentification et de contrôle d’accès qui s’intègre facilement à une application Spring Boot. Mais la sécurité de Spring Boot ne se limite pas à l’ajout du framework Spring Security. Cette fiche pratique aborde la sécurité de Spring Boot au sens large et explique comment sécuriser votre application créée avec Spring Boot.

Bonnes pratiques de sécurité pour Spring Boot

La liste sélectionnée ci-dessous va au-delà de la simple présentation de Spring Security pour l’authentification et l’autorisation dans votre application Spring Boot. Elle s’intéresse à la stratégie globale de sécurité de Spring Boot et aborde les sujets suivants :

  1. Utilisez HTTPS en production

  2. Testez vos dépendances et détectez les vulnérabilités de Spring Boot

  3. Activez la protection CSRF

  4. Utilisez une politique de sécurité du contenu pour protéger Spring Boot contre les attaques XSS

  5. Utilisez OpenID Connect pour l’authentification

  6. Utilisez le hachage des mots de passe

  7. Utilisez les dernières versions

  8. Stockez vos secrets en toute sécurité

  9. Réalisez un test d’intrusion sur votre application

  10. Demandez à votre équipe de sécurité de procéder à une revue de code

1. Utilisez HTTPS en production

Les certificats TLS/SSL étaient autrefois coûteux, et HTTPS était considéré comme lent. Les machines sont devenues beaucoup plus rapides, ce qui a résolu le problème de performances, et Let’s Encrypt fournit gratuitement des certificats TLS. Ces deux évolutions ont changé la donne et fait de TLS une technologie largement adoptée.

Pour imposer HTTPS dans votre application Spring Boot, vous pouvez étendre WebSecurityConfigurerAdapter et exiger une connexion sécurisée.

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

Les fournisseurs cloud peuvent considérablement simplifier la gestion des certificats TLS. Amazon Certificate Manager fonctionne exactement comme Let’s Encrypt, mais est intégré par défaut à tous les produits et services AWS. Il vous permet de provisionner gratuitement des certificats SSL et gère leur renouvellement automatique, entre autres, sans aucun effort ni configuration. Heroku propose également Automated Certificate Management.

2. Testez vos dépendances et détectez les vulnérabilités de Spring Boot

Il est fort probable que vous ne sachiez pas combien de dépendances directes votre application utilise. Et il est encore plus probable que vous ignoriez le nombre de dépendances transitives qu’elle utilise. C’est souvent le cas, alors même que les dépendances constituent la majeure partie de votre application et peuvent contenir des vulnérabilités de sécurité Spring Boot. Les attaquants ciblent de plus en plus les dépendances open source, car leur réutilisation leur permet de faire de nombreuses victimes. Il est important de s’assurer que l’ensemble de l’arbre de dépendances de votre application ne contient aucune vulnérabilité connue.

Snyk teste les artefacts de build de votre application et signale les dépendances présentant des vulnérabilités de sécurité Spring Boot connues. Il vous fournit, sous forme de tableau de bord, la liste des vulnérabilités présentes dans les packages utilisés par votre application.

Tableau de bord Snyk affichant tous les projets vulnérables et le nombre de vulnérabilités critiques, élevées, moyennes et faibles pour trois projets Maven sur GitHub.

En outre, Snyk recommande des versions de mise à niveau ou fournit des correctifs pour remédier à vos problèmes de sécurité, par le biais d’une pull request adressée à votre dépôt de code source. Snyk protège également votre environnement en testant automatiquement (via des webhooks) toute nouvelle pull request créée dans votre dépôt, afin de vérifier qu’elle n’introduit aucune nouvelle vulnérabilité de sécurité Spring Boot connue.

Snyk est disponible via une interface web et une CLI. Vous pouvez donc facilement l’intégrer à votre environnement CI et le configurer pour faire échouer votre build lorsque des vulnérabilités dépassent le seuil de gravité que vous avez défini.

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.

3. Activez la protection CSRF

La falsification de requête intersites (CSRF) est une attaque qui force un utilisateur à effectuer des actions indésirables dans une application à laquelle il est actuellement connecté.

Spring Security offre une excellente prise en charge du CSRF, activée par défaut. Si vous utilisez la balise <form:form> de Spring MVC ou Thymeleaf avec @EnableWebSecurity, le jeton CSRF est automatiquement ajouté sous la forme d’un champ de saisie masqué. Pour intégrer cette mesure à votre stratégie de sécurité Spring Boot, vous devez ajouter le starter Spring Security comme dépendance.

Si vous utilisez un framework JavaScript comme Angular ou React, vous devrez configurer CookieCsrfTokenRepository afin que JavaScript puisse lire le cookie.

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

Spring Security ajoute automatiquement l’indicateur secure au cookie XSRF-TOKEN lorsque la requête est effectuée via HTTPS. Spring Security n’utilise pas l’indicateur SameSite=strict pour les cookies CSRF, mais l’utilise avec Spring Session ou la gestion des sessions WebFlux.

4. Utilisez une politique de sécurité du contenu pour protéger Spring Boot contre les attaques XSS

La politique de sécurité du contenu (CSP) est une couche de sécurité supplémentaire qui aide à atténuer les attaques XSS (cross-site scripting) et par injection de données. Pour l’activer, vous devez configurer votre application afin qu’elle renvoie un en-tête Content-Security-Policy. Vous pouvez également utiliser une balise <meta http-equiv="Content-Security-Policy"> dans votre page HTML.

Spring Security fournit plusieurs en-têtes de sécurité par défaut. Spring Security n’ajoute pas de CSP par défaut. Vous pouvez activer l’en-tête CSP dans votre application Spring Boot à l’aide de la configuration ci-dessous.

@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. Utilisez OpenID Connect pour l’authentification

OpenID Connect (OIDC) est une extension d’OAuth 2.0 qui fournit des informations sur l’utilisateur. En plus d’un jeton d’accès, il ajoute un jeton d’identité ainsi qu’un point de terminaison /userinfo, qui permet d’obtenir des informations supplémentaires. Il ajoute également la découverte des points de terminaison et l’enregistrement dynamique des clients.

Le schéma ci-dessous montre le fonctionnement d’OIDC pour l’authentification.

Schéma du flux d’autorisation OIDC avec code : client, serveur d’autorisation, consentement de l’utilisateur, rappel et échange de jetons.

6. Utilisez le hachage des mots de passe

Stocker des mots de passe en clair est l’une des pires choses que vous puissiez faire pour la sécurité de votre application. Heureusement, Spring Security n’autorise pas les mots de passe en clair par défaut. Il est également fourni avec un module de cryptographie que vous pouvez utiliser pour le chiffrement symétrique, la génération de clés et le hachage des mots de passe (également appelé encodage des mots de passe).

PasswordEncoder est l’interface principale de Spring Security pour le hachage des mots de passe. Elle se présente comme suit :

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

Spring Security fournit plusieurs implémentations, dont les plus populaires sont BCryptPasswordEncoder et Pbkdf2PasswordEncoder.

7. Utilisez les dernières versions

Il existe plusieurs raisons de mettre régulièrement à niveau les dépendances de votre application. La sécurité est l’une des principales motivations. La page de démarrage start.spring.io utilise les versions les plus récentes des packages Spring et des dépendances, dans la mesure du possible.

Les mises à niveau de l’infrastructure sont souvent moins perturbatrices que celles des dépendances, car les auteurs de bibliothèques n’ont pas tous la même sensibilité à la compatibilité descendante et aux changements de comportement d’une version à l’autre. Cela dit, lorsque vous trouvez une vulnérabilité de sécurité dans votre configuration, vous avez trois options : mettre à niveau, appliquer un correctif ou ignorer. Les mises à niveau sont les plus sûres pour la santé globale de votre application, mais ne sont pas toujours possibles. Dans ce cas, les correctifs peuvent éliminer les vulnérabilités de votre package. Vous pouvez souvent les obtenir auprès d’un spécialiste de la sécurité comme Snyk. Ignorer une vulnérabilité est bien sûr une option, mais ce n’est pas une bonne solution. Vous connaissez peut-être une vulnérabilité sans penser qu’elle est directement exploitable. Gardez à l’esprit qu’elle ne fait peut-être pas partie du flux de votre application aujourd’hui, mais qu’un développeur pourrait un jour ajouter du code qui emprunte un chemin vulnérable.

8. Stockez vos secrets en toute sécurité

Dans le cadre de votre stratégie de sécurité Spring Boot, il faut également réfléchir à la protection de vos données. Les informations sensibles, comme les mots de passe et les jetons d’accès, doivent être manipulées avec précaution. Vous ne pouvez pas les laisser traîner, les transmettre en clair ni choisir des valeurs prévisibles si vous les stockez localement. Comme l’historique (de GitHub) l’a maintes fois démontré, les développeurs ne réfléchissent pas suffisamment à la manière dont ils stockent leurs secrets.

Une bonne pratique consiste à stocker les secrets dans un coffre-fort permettant de les conserver, de contrôler les accès et même de générer des identifiants pour les services utilisés par votre application. Vault by HashiCorp facilite considérablement le stockage des secrets et propose également plusieurs services supplémentaires. Vous pouvez aussi l’intégrer à des mécanismes d’authentification courants comme LDAP pour obtenir des jetons.

Si cela vous intéresse, prenez le temps de découvrir Spring Vault, qui ajoute une couche d’abstraction à HashiCorp Vault et fournit aux clients un accès reposant sur les annotations Spring. Ils peuvent ainsi accéder aux secrets, les stocker et les révoquer sans avoir à se perdre dans l’infrastructure. L’extrait de code suivant montre à quel point il est facile d’extraire un mot de passe de Spring Vault à l’aide d’une annotation.

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

9. Réalisez un test d’intrusion sur votre application

L’outil de sécurité OWASP ZAP est un proxy qui réalise des tests d’intrusion sur votre application en production, à l’exécution. Ce projet open source gratuit est très populaire (plus de 4 000 étoiles) et hébergé sur GitHub.

OWASP ZAP utilise deux méthodes pour détecter les vulnérabilités : Spider et Active Scan. L’outil Spider part d’une liste initiale d’URL, y accède et analyse chaque réponse pour repérer les liens hypertextes et les ajouter à une liste. Il visite ensuite les nouvelles URL découvertes et répète l’opération de manière récursive, afin de créer une cartographie des URL de votre application web. L’outil Active Scan teste automatiquement les cibles que vous avez sélectionnées par rapport à une liste de vulnérabilités potentielles. Il vous fournit un rapport qui indique les points exploitables de votre application web et détaille les vulnérabilités.

10. Demandez à votre équipe de sécurité de procéder à une revue de code

Les revues de code sont essentielles à toute équipe de développement logiciel performante. Chez Okta, tout le code de production et les projets open source officiels doivent être analysés par notre équipe d’experts en sécurité. Vous n’avez peut-être pas d’experts en sécurité dans votre entreprise, mais si vous traitez des données sensibles, vous devriez peut-être en faire appel à un !

N’oubliez pas de télécharger la fiche pratique sur la sécurité de Spring Boot et de l’afficher quelque part pour vous rappeler les bonnes pratiques à suivre si vous développez des applications avec Spring Boot.

FAQ

Comment ajouter la sécurité à Spring Boot ?

Pour ajouter Spring Security à votre application Spring Boot, commencez par ajouter la dépendance de démarrage de sécurité.

Comment désactiver Spring Security dans Spring Boot ?

Par défaut, Spring Security est activé dès que vous incluez le package spring-boot-starter-security. Vous pouvez facilement le désactiver en excluant SecurityAutoConfiguration dans le fichier application.properties.

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

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.

Lire la suite

Blog

Les modèles de pointe ont trouvé les vulnérabilités. Seul l’attaquant a trouvé les chaînes d’exploitation.

L’analyse statique a détecté les failles, mais seuls des tests d’attaque en conditions réelles ont prouvé comment elles pouvaient être enchaînées pour provoquer des compromissions. Comparaison d’Evo COS, de Claude Security et de Claude Code Security.

feature insights context
Blog

Les attaques autonomes sont déjà là. La défense doit suivre leur rythme.

Les attaquants autonomes réduisent la fenêtre de défense. Découvrez comment la découverte, la correction, la validation et la prévention continues peuvent aider les équipes de sécurité à suivre le rythme.

Blog

Pourquoi les agents de codage IA créent-ils sans cesse des failles de contrôle d’accès ?

Les agents de codage IA peuvent générer une logique d’autorisation qui compile et passe la revue, tout en exposant les données d’un tenant à un autre. Découvrez pourquoi les failles de contrôle d’accès sont difficiles à détecter et comment les prévenir.