Une introduction à Spring Cloud Vault

1. Vue d'ensemble

Dans ce didacticiel, nous montrerons comment utiliser le coffre-fort de Hashicorp dans les applications Spring Boot pour sécuriser les données de configuration sensibles.

Nous supposons ici quelques connaissances de Vault et que nous avons une configuration de test déjà opérationnelle . Si ce n'est pas le cas, prenons un moment pour lire notre tutoriel Vault Intro afin que nous puissions nous familiariser avec ses bases.

2. Spring Cloud Vault

Spring Cloud Vault est un ajout relativement récent à la pile Spring Cloud qui permet aux applications d'accéder aux secrets stockés dans une instance Vault de manière transparente .

En général, la migration vers Vault est un processus très simple: ajoutez simplement les bibliothèques requises et ajoutez quelques propriétés de configuration supplémentaires à notre projet et nous devrions être prêts à partir. Aucun changement de code n'est requis!

Cela est possible car il agit comme une PropertySource de haute priorité enregistrée dans l' environnement actuel .

En tant que tel, Spring l'utilisera chaque fois qu'une propriété est requise. Les exemples incluent les propriétés DataSource , ConfigurationProperties, etc.

3. Ajout de Spring Cloud Vault à un projet Spring Boot

Afin d'inclure la bibliothèque spring-cloud-vault dans un projet Spring Boot basé sur Maven, nous utilisons l' artefact de démarrage associé , qui extraira toutes les dépendances requises.

Outre le démarreur principal , nous inclurons également les bases de données spring-vault-config-databases , qui ajoutent la prise en charge des informations d'identification de base de données dynamiques:

 org.springframework.cloud spring-cloud-starter-vault-config   org.springframework.cloud spring-cloud-vault-config-databases 

La dernière version du démarreur Spring Cloud Vault peut être téléchargée à partir de Maven Central.

3.1. Configuration de base

Pour fonctionner correctement, Spring Cloud Vault a besoin d'un moyen de déterminer où contacter le serveur Vault et comment s'authentifier auprès de celui-ci.

Nous faisons cela en fournissant les informations nécessaires dans le fichier bootstrap.yml ou bootstrap.properties :

# bootstrap.yml spring: cloud: vault: uri: //localhost:8200 ssl: trust-store: classpath:/vault.jks trust-store-password: changeit 

La propriété spring.cloud.vault.uri pointe vers l'adresse API de Vault. Étant donné que notre environnement de test utilise HTTPS avec un certificat auto-signé, nous devons également fournir un fichier de clés contenant sa clé publique.

Notez que cette configuration n'a pas de données d'authentification . Dans le cas le plus simple, où nous utilisons un jeton fixe, nous pouvons le transmettre via la propriété système spring.cloud.vault.token ou une variable d'environnement. Cette approche fonctionne bien en conjonction avec des mécanismes de configuration cloud standard, tels que les ConfigMaps de Kubernetes ou les secrets Docker.

Spring Vault nécessite également une configuration supplémentaire pour chaque type de secret que nous souhaitons utiliser dans notre application. Les sections suivantes décrivent comment nous pouvons ajouter la prise en charge de deux types de secrets courants: clé / valeur et informations d'identification de base de données.

4. Utilisation du backend Generic Secrets

Nous utilisons le backend Generic Secret pour accéder aux secrets non versionnés stockés sous forme de paires clé-valeur dans Vault .

En supposant que nous ayons déjà la dépendance spring-cloud-starter-vault-config dans notre chemin de classe , tout ce que nous avons à faire est d'ajouter quelques propriétés au fichier de configuration bootstrap.yml de l'application :

spring: cloud: vault: # other vault properties omitted ... generic: enabled: true application-name: fakebank 

La propriété nom-application est facultative dans ce cas. S'il n'est pas spécifié, Spring prendra à la place la valeur de spring.application.name standard .

Nous pouvons maintenant utiliser toutes les paires clé / valeur stockées dans secret / fakebank comme n'importe quelle autre propriété d' environnement . L'extrait de code suivant montre comment nous pouvons lire la valeur de la clé foo stockée sous ce chemin:

@Autowired Environment env; public String getFoo() { return env.getProperty("foo"); } 

Comme nous pouvons le voir, le code lui-même ne sait rien de Vault, ce qui est une bonne chose! Nous pouvons toujours utiliser des propriétés fixes dans les tests locaux et passer à Vault à notre guise en activant simplement une seule propriété dans bootstrap.yml .

4.1. Une note sur les profils de ressort

S'il est disponible dans l' environnement actuel , Spring Cloud Vault utilisera les noms de profil disponibles comme suffixe ajouté au chemin de base spécifié où les paires clé / valeur seront recherchées .

Il recherchera également les propriétés sous un chemin d'application par défaut configurable (avec et sans suffixe de profil) afin que nous puissions avoir des secrets partagés dans un seul emplacement. Utilisez cette fonction avec prudence!

Pour résumer, si le profil de production de l' application out fakebank est actif, Spring Vault recherchera les propriétés stockées sous les chemins suivants:

  1. secret / fakebank / production (priorité plus élevée)
  2. secret / fakebank
  3. secret / application / production
  4. secret / application (priorité inférieure)

Dans la liste précédente, application est le nom que Spring utilise comme emplacement supplémentaire par défaut pour les secrets. Nous pouvons le modifier à l'aide de la propriété spring.cloud.vault.generic.default-context .

Les propriétés stockées sous le chemin le plus spécifique prévaudront sur les autres. Par exemple, si la même propriété foo est disponible sous les chemins ci-dessus, alors l'ordre de priorité serait:

5. Utilisation du backend secret de base de données

Le module de base de données permet aux applications Spring d'utiliser les informations d'identification de base de données générées dynamiquement et créées par Vault . Spring Vault injecte ces informations d'identification sous les propriétés standard spring.datasource.username et spring.datasource.password afin qu'elles puissent être sélectionnées par les DataSource standards .

Veuillez noter qu'avant d'utiliser ce backend, nous devons créer une configuration de base de données et des rôles dans Vault comme décrit dans notre didacticiel précédent.

Pour utiliser les informations d'identification de base de données générées par Vault dans notre application Spring, les bases de données spring-cloud-vault-config-databases doivent être présentes dans le chemin de classe du projet, avec le pilote JDBC correspondant.

Nous devons également activer son utilisation dans notre application en ajoutant quelques propriétés à notre bootstrap.yml:

spring: cloud: vault: # ... other properties omitted database: enabled: true role: fakebank-accounts-rw

La propriété la plus importante ici est la propriété role , qui contient un nom de rôle de base de données stocké dans Vault. Pendant le bootstrap, Spring contactera Vault et lui demandera de créer de nouvelles informations d'identification avec les privilèges correspondants.

Le coffre-fort révoquera par défaut les privilèges associés à ces informations d'identification après la durée de vie configurée.

Heureusement, Spring Vault renouvellera automatiquement le bail associé aux informations d'identification acquises. En faisant cela, les informations d'identification resteront valides tant que notre application est en cours d'exécution.

Voyons maintenant cette intégration en action. L'extrait de code suivant obtient une nouvelle connexion à la base de données à partir d'un DataSource géré par Spring :

Connection c = datasource.getConnection(); 

Une fois de plus, nous pouvons voir qu'il n'y a aucun signe d'utilisation de Vault dans notre code . Toute intégration se produit au niveau de l' environnement , de sorte que notre code peut facilement être testé unitaire comme d'habitude.

6. Conclusion

Dans ce didacticiel, nous avons montré comment intégrer Vault à Spring Boot à l'aide de la bibliothèque Spring Vault. Nous avons couvert deux cas d'utilisation courants: les paires clé / valeur génériques et les informations d'identification de base de données dynamiques.

Un exemple de projet contenant toutes les dépendances requises, les tests d'intégration et les scripts de configuration du coffre-fort est disponible à l'adresse over sur GitHub.