Récupérer les identifiants/secrets à partir de Secret Manager avec Spring Boot

1. Présentation

Les secrets, comme les mots de passe et les clés API, sont des informations sensibles. Ils doivent être stockés dans un espace de stockage sécurisé et chiffré, dont les accès sont contrôlés et vérifiables. Certains systèmes choisissent Vault pour stocker ces codes secrets. Sur Google Cloud, vous pouvez utiliser Secret Manager, un service géré, pour stocker les secrets de manière sécurisée et contrôler l'accès aux secrets individuels à l'aide d'IAM.

Dans Spring Boot, vous pouvez utiliser Spring Cloud GCP pour accéder facilement à ces secrets en les désignant comme n'importe quelle autre propriété Spring.

Dans cet atelier de programmation, vous allez stocker un secret dans Secret Manager, puis créer des microservices Spring Boot simples et récupérer le secret.

Points abordés

  • Créer une application Java Spring Boot et configurer Secret Manager

Prérequis

  • Un projet Google Cloud
  • Un navigateur tel que Chrome ou Firefox
  • Bonne connaissance des éditeurs de texte Linux standards tels que Vim, EMACs ou Nano

Comment allez-vous utiliser ce tutoriel ?

Je vais le lire uniquement Je vais le lire et effectuer les exercices

Comment évalueriez-vous votre expérience en matière de création d'applications Web HTML/CSS ?

Débutant Intermédiaire Expert

Quel est votre niveau d'expérience avec les services Google Cloud ?

<ph type="x-smartling-placeholder"></ph> Débutant Intermédiaire Expert
.

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à Cloud Console, puis créez un projet ou réutilisez un projet existant. (Si vous n'avez pas encore de compte Gmail ou G Suite, vous devez en créer un.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Mémorisez l'ID du projet. Il s'agit d'un nom unique permettant de différencier chaque projet Google Cloud (le nom ci-dessus est déjà pris ; vous devez en trouver un autre). Il sera désigné par le nom PROJECT_ID tout au long de cet atelier de programmation.

  1. Vous devez ensuite activer la facturation dans Cloud Console pour pouvoir utiliser les ressources Google Cloud.

L'exécution de cet atelier de programmation est très peu coûteuse, voire gratuite. Veillez à suivre les instructions de la section "Nettoyer" qui indique comment désactiver les ressources afin d'éviter les frais une fois ce tutoriel terminé. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Google Cloud Shell

Bien que les services Google Cloud puissent être utilisés à distance depuis votre ordinateur portable, nous allons utiliser Google Cloud Shell dans cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.

Activer Cloud Shell

  1. Dans Cloud Console, cliquez sur Activer Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Si vous n'avez encore jamais démarré Cloud Shell, un écran intermédiaire s'affiche en dessous de la ligne de séparation pour décrire de quoi il s'agit. Si tel est le cas, cliquez sur Continuer (cet écran ne s'affiche qu'une seule fois). Voici à quoi il ressemble :

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle intègre un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier dans un simple navigateur ou sur votre Chromebook.

Une fois connecté à Cloud Shell, vous êtes en principe authentifié et le projet est défini avec votre ID de projet.

  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list

Résultat de la commande

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Résultat de la commande

[core]
project = <PROJECT_ID>

Si vous obtenez un résultat différent, exécutez cette commande :

gcloud config set project <PROJECT_ID>

Résultat de la commande

Updated property [core/project].

3. Configurer un secret

Pour utiliser Secret Manager, commencez par activer l'API:

$ gcloud services enable secretmanager.googleapis.com

Créez ensuite un secret nommé greeting, avec la valeur Hello:

$ echo -n "Hello" | \
 gcloud secrets create greeting \
 --data-file=-

Cette commande utilise STDIN pour fournir la valeur à la ligne de commande. Cependant, vous pouvez aussi simplement placer la valeur du secret dans un fichier, en spécifiant le nom de fichier de l'argument --data-file.

Vous pouvez répertorier tous les secrets à l'aide de la gcloud CLI:

$ gcloud secrets list

4. Créer un service REST Spring Boot

Une fois Cloud Shell lancé, vous pouvez utiliser la ligne de commande pour générer une nouvelle application Spring Boot avec Spring Initializr:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
  -d dependencies=web,cloud-gcp \
  -d bootVersion=3.0.6 \
  -d type=maven-project \
  -d baseDir=hello-secret-manager | tar -xzvf - \
  && cd hello-secret-manager

Dans pom.xml, ajoutez la dépendance de démarrage Spring Cloud GCP:

pom.xml

<project>
  ...

  <dependencies>
    ...
    <!-- Add Secret Manager Starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
    </dependency>
  </dependencies>

  ...
</project>

Dans le fichier src/main/resources/application.properties, ajoutez la configuration suivante pour activer l'API Spring Boot Config Data:

spring.config.import=sm://

Cette commande configurera une source de propriété Spring pour vous permettre de faire référence à des secrets à l'aide d'une valeur de propriété, avec le préfixe sm:// (par exemple, sm://greeting).

Consultez la documentation de Spring Cloud GCP Secret Manager pour en savoir plus sur le format de la propriété. Notez que l'exigence application.properties est nouvelle dans Spring Cloud GCP 4.x. Pour en savoir plus, consultez le guide de migration.

Créez un contrôleur REST en ajoutant un nouveau fichier de classe:

src/main/java/com/example/demo/HelloSecretController.java

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloSecretController {
  String greeting = "Hi";

  @GetMapping("/")
  public String hello() {
    return greeting + " World!";
  }
}

Vous pouvez démarrer l'application Spring Boot normalement avec le plug-in Spring Boot.

Assurez-vous que JAVA_HOME est défini sur la bonne version du JDK:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Ignorons les tests de cet atelier et démarrons l'application:

$ ./mvnw -DskipTests spring-boot:run

Une fois l'application démarrée, cliquez sur l'icône Aperçu sur le Web e18df08334f0d809.png dans la barre d'outils Cloud Shell, puis sélectionnez Prévisualiser sur le port 8080.

Après quelques instants, vous devriez obtenir le résultat suivant:

1e9a7884ff113c14.png

5. Récupérer un secret

Vous pouvez utiliser l'annotation @Value pour faire référence à la propriété secrète à l'aide du préfixe sm://.

Dans la classe HelloSecretController, injectez la valeur greeting à l'aide de l'annotation:

src/main/java/com/example/demo/HelloSecretController.java

import org.springframework.beans.factory.annotation.Value;

...

@RestController
public class HelloSecretController {
  @Value("${sm://greeting}")
  String greeting;

  ...
}

Vous pouvez démarrer l'application Spring Boot normalement avec le plug-in Spring Boot. Ignorons les tests pour cet atelier:

$ ./mvnw -DskipTests spring-boot:run

Une fois l'application démarrée, cliquez sur l'icône Web Preview (Aperçu sur le Web) e18df08334f0d809.png dans la barre d'outils Cloud Shell, puis choisissez Preview on port 8080 (Prévisualiser sur le port 8080).

Après quelques instants, vous devriez obtenir le résultat suivant:

Capture d&#39;écran de l&#39;application en cours d&#39;exécution, qui affiche le message &quot;Hello World!&quot;

Vous pouvez également mapper la valeur avec une propriété de application.properties:

src/main/resources/application.properties

greeting=${sm://greeting}

Dans HelloSecretController, vous pouvez faire référence à ce nom de propriété plus générique plutôt qu'à un nom Secret Manager:

src/main/java/com/example/demo/HelloSecretController.java

@RestController
public class HelloSecretController {
  @Value("${greeting}")
  String greeting;
  ...
}

Vous pouvez démarrer l'application Spring Boot normalement avec le plug-in Spring Boot. Ignorons les tests pour cet atelier:

$ ./mvnw -DskipTests spring-boot:run

Une fois l'application démarrée, cliquez sur l'icône Aperçu sur le Web Icône Aperçu sur le Web dans la barre d'outils Cloud Shell, puis sélectionnez Prévisualiser sur le port 8080.

Mettre à jour la valeur du secret

En utilisant la syntaxe courte sm://greeting, vous utilisez automatiquement la dernière version du secret. En créant une nouvelle version du secret, vous pouvez mettre à jour votre application sans modifier votre code.

Mettez à jour la valeur du secret en ajoutant une nouvelle version:

$ echo -n "Greetings" |
 gcloud secrets versions add greeting \
 --data-file=-

Redémarrez l'application et vérifiez que la nouvelle version du secret est renvoyée.

Capture d&#39;écran de l&#39;application en cours d&#39;exécution, montrant le message &quot;Greeings World!&quot;

Développer ce concept

Cette technique est utile, en particulier si vous utilisez différents profils d'application Spring Boot. Par exemple, vous pouvez créer des secrets tels que greeting-dev, greeting-staging ou greeting-prod. Et dans chacun des profils, faites correspondre les messages d'accueil appropriés.

Créez un secret greeting-prod:

$ echo -n "Hola" | \
 gcloud secrets create greeting-prod \
 --data-file=- --replication-policy=automatic

Créez un fichier application-prod.properties:

src/main/resources/application-prod.properties

greeting=${sm://greeting-prod}

Vous pouvez démarrer l'application Spring Boot normalement avec le plug-in Spring Boot, mais avec le profil prod. Ignorons les tests pour cet atelier:

$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod

Une fois l'application démarrée, cliquez sur l'icône Web Preview (Aperçu sur le Web) Icône &quot;Aperçu sur le Web&quot; dans la barre d'outils Cloud Shell, puis choisissez Preview on port 8080 (Prévisualiser sur le port 8080).

Après quelques instants, vous devriez obtenir le résultat suivant:

Capture d&#39;écran de l&#39;application en cours d&#39;exécution, montrant le message &quot;Hola World!&quot;

6. Résumé

Dans cet atelier, vous avez créé un service pouvant être configuré à l'aide de secrets stockés dans Secret Manager en utilisant les noms de propriété de Spring précédés de sm:// et en injectant la valeur du fichier applications.properties et des annotations @Value.

7. Félicitations !

Vous avez appris à utiliser l'API Secret Manager en Java.

En savoir plus

Licence

Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.