Une introduction à Spring Cloud Vault

Une introduction à Spring Cloud Vault

1. Vue d'ensemble

Dans ce didacticiel, nous allons montrer comment nous pouvons utiliser Vault de Hashicorp dans les applications Spring Boot pour sécuriser les données de configuration sensibles.

We assume here some Vault knowledge and that we have a test setup already up and running. Si ce n'est pas le cas, prenons un moment pour lire nosVault Intro tutorial 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 queallows applications to access secrets stored in a Vault instance in a transparent way.

En général, la migration vers Vault est un processus très simple: il vous suffit d'ajouter les bibliothèques requises et d'ajouter quelques propriétés de configuration supplémentaires à notre projet. Nous devrions pouvoir continuer. No code changes are required!

Ceci est possible car il agit comme unPropertySource de haute priorité enregistré dans lesEnvironment actuels.

En tant que tel, Spring l'utilisera chaque fois qu'une propriété est requise. Les exemples incluent les propriétésDataSource,ConfigurationProperties, et ainsi de suite.

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

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

Outre lesstarter,principaux, nous inclurons également lesspring-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 desSpring Cloud Vault starter peut être téléchargée depuis Maven Central.

3.1. Configuration de base

Afin de 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 lesbootstrap.yml oubootstrap.properties:

# bootstrap.yml
spring:
  cloud:
    vault:
      uri: https://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.

Note that this configuration has no authentication data. Dans le cas le plus simple, où nous utilisons un jeton fixe, nous pouvons le transmettre via la propriété systèmespring.cloud.vault.token ou une variable d'environnement. Cette approche fonctionne bien avec les mécanismes de configuration standard du cloud, tels que les secrets ConfigMaps ou Docker de Kubernetes.

Spring Vault requiert é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 une prise en charge à deux types de secret courants: clé / valeur et informations d'identification de base de données.

4. Utilisation du backend Secrets générique

We use the Generic Secret backend to access unversioned secrets stored as Key-Value pairs in Vault.

En supposant que nous ayons déjà la dépendancespring-cloud-starter-vault-config dans nosclasspath, tout ce que nous avons à faire est d'ajouter quelques propriétés au fichier de configuration de l'applicationbootstrap.yml:

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

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

Nous pouvons maintenant utiliser toutes les paires clé / valeur stockées àsecret/fakebank comme n'importe quelle autre propriétéEnvironment. L'extrait 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");
}

As we can see, the code itself knows nothing about 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é dansbootstrap.yml.

4.1. Une note sur les profils de printemps

Si disponible dans lesEnvironment, Spring Cloud Vaultwill use the available profile names as a suffix appended to the specified base path where key/value pairs will be searched actuels.

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 fonctionnalité avec prudence!

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

  1. secret/fakebank_/production_ (higher priority)

  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 en utilisant la propriétéspring.cloud.vault.generic.default-context.

Les propriétés stockées sous le chemin le plus spécifique auront la priorité 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 la base de données

The Database backend module allows Spring applications to use dynamically generated database credentials created by Vault. Spring Vault injecte ces informations d'identification sous les propriétés standardspring.datasource.username etspring.datasource.password afin qu'elles puissent être sélectionnées par lesDataSources normaux.

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 dansour previous tutorial.

Pour utiliser les informations d'identification de base de données générées par Vault dans notre application Spring, lesspring-cloud-vault-config-databases doivent être présents 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 à nosbootstrap.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. Lors du démarrage, Spring contacte Vault et lui demande de créer de nouvelles informations d'identification avec les privilèges correspondants.

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

Heureusement,Spring Vault will automatically renew the lease associated with the acquired credentials. 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 suivant obtient une nouvelle connexion à la base de données à partir d'unDataSource géré par Spring:

Connection c = datasource.getConnection();

Once again, we can see that there is no sign of Vault usage in our code. Toute intégration se produit au niveauEnvironment, donc 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 disponibleover on GitHub.