Présentation des secrets et de leur gestion dans Java

Effectué

Les secrets sont des chaînes de caractères qui ne doivent pas être partagées avec le monde extérieur : il peut s’agir de mots de passe de base de données, de clés de chiffrement privées, de jetons d’accès personnels, etc. Pour renforcer la sécurité, de nombreuses personnes considèrent également que tout ce qui est susceptible d’aider un attaquant doit être considéré comme un secret. Par exemple, l’URL de votre base de données de production peut être considérée comme un secret. Votre base de données ne doit pas être accessible publiquement. En effet, ce type d’informations est sensible par nature, et moins il y a d’informations dans votre code, mieux c’est.

Qu’entend-on par « zéro confiance » et « zéro secret » ?

Le concept de zéro confiance est le suivant : ne jamais faire confiance aveuglément et toujours valider et autoriser l’accès aux ressources de l’entreprise.

Ce concept s’applique également aux applications web, qui ne doivent pas stocker de secrets dans leur code ou dans leurs binaires finaux. C’est ce que nous appelons le zéro secret.

Les secrets doivent être gérés par un système externe, avec des règles d’accès et une validation strictes, afin de réduire le risque d’attaque.

Ne mettez pas vos secrets dans des dépôts Git

Même si votre dépôt Git est privé, le fait de placer des secrets dans votre code source constitue une mauvaise pratique :

  • Toute personne ayant accès à votre référentiel aura connaissance de vos données sensibles
  • Toute personne ayant accès aux fichiers binaires de votre application pourra en extraire les secrets

De plus, quand un secret est stocké dans un référentiel Git, les attaquants peuvent toujours le trouver en consultant l’historique du référentiel, où il peut être oublié après un long moment.

Même si cela vous semble pratique, vous ne devez jamais stocker de secrets dans votre référentiel de code source. Pour éviter ce problème, vous pouvez utiliser des outils automatiques qui vérifient régulièrement votre référentiel et envoient des avertissements s’ils trouvent un mot de passe ou une URL de base de données stocké par erreur.

Utilisation de variables d’environnement

La solution la plus simple pour gérer les secrets consiste à utiliser des variables d’environnement. Celles-ci ont plusieurs avantages :

  • Ils sont faciles à utiliser.
  • Ils fonctionnent sur tous les systèmes (même les systèmes locaux).
  • Tout le monde les connaît et comprend leur fonctionnement.

Cependant, ils ne sont pas suffisamment sécurisés : tous les processus de votre système peuvent les lire et ils sont facilement exposés avec Java Management Extensions (JMX) sur un système Java.

Les variables d’environnement sont donc souvent considérées comme une première étape vers le zéro confiance. Elles sont plus sécurisées que les secrets stockés directement dans le code source, mais elles ne disposent pas de fonctionnalités de gestion et sont facilement accessibles aux attaquants.

Utilisation de secrets Kubernetes

Kubernetes a une notion de secrets qui constitue également une bonne solution. Ces secrets peuvent être chargés en tant que fichiers sur le système de fichiers de l’application. Un programme Java peut alors lire ce fichier au démarrage pour accéder à ces secrets. Des outils tels que Spring Framework offrent même une prise en charge standard de ce mécanisme, ce qui leur permet d’utiliser les secrets de manière simple et efficace.

Ce mécanisme est plus sécurisé que des variables d’environnement, car ces fichiers peuvent être lus seulement par le processus qui en a besoin. Les secrets bénéficient également du riche écosystème Kubernetes et peuvent être gérés par divers outils de gestion, notamment ceux fournis par votre fournisseur de services cloud.

Bien que les secrets Kubernetes constituent une bonne solution pour Kubernetes, ils sont limités à Kubernetes et n’offrent pas, selon les outils utilisés pour gérer l’infrastructure Kubernetes, de fonctionnalités de gestion avancées.

Utilisation d’un magasin de secrets

Un magasin de secrets, comme Hashicorp Vault ou Azure Key Vault, est un logiciel spécialisé dans la gestion des secrets. Il offre un système de gestion riche pour autoriser les utilisateurs, effectuer la rotation des clés et valider quelle application peut accéder à quel secret.

Il fournit également une API externe et peut donc être utilisé sur n’importe quel système. Par exemple, vous pouvez utiliser Azure Key Vault sur tous les services Azure, notamment Machines Virtuelles, Azure App Services, Azure Kubernetes Service et Azure Spring Apps.

Un magasin de secrets est la solution la plus sécurisée pour gérer des secrets, mais il nécessite l’utilisation d’un outil dédié.