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

1. Présentation

Les secrets tels que les mots de passe et les clés API sont des informations sensibles qui doivent être stockées dans un espace sécurisé et chiffré, avec un contrôle d'accès et une journalisation. Certains systèmes choisissent d'utiliser Vault pour stocker ces 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 à chacun d'eux à l'aide d'IAM.

Dans Spring Boot, vous pouvez utiliser Spring Cloud GCP pour accéder facilement à ces secrets en les référençant 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

  • Comment 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 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 ?

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 sans frais. 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 nous servir de Google Cloud Shell pour 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, activez d'abord 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. Toutefois, vous pouvez également simplement placer la valeur secrète dans un fichier et spécifier le nom du fichier pour l'argument --data-file.

Vous pouvez lister 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 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 le fichier 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://

Cela configurera une source de propriété Spring afin que vous puissiez faire référence aux secrets à l'aide d'une valeur de propriété, avec le préfixe sm:// (par exemple, sm://greeting).

Pour en savoir plus sur le format de la propriété, consultez la documentation Spring Cloud GCP Secret Manager. 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 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 pour 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 choisissez Prévisualiser sur le port 8080.

Après un court instant, le résultat devrait s'afficher :

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 un court instant, le résultat devrait s'afficher :

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

Vous pouvez également mapper la valeur à une propriété dans 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 au lieu d'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 choisissez Prévisualiser sur le port 8080.

Mettre à jour la valeur du secret

En utilisant la syntaxe abrégée 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, affichant &quot;Greetings World!&quot;

Développer ce concept

Cette technique est particulièrement utile si vous utilisez différents profils d'application Spring Boot. Par exemple, vous pouvez créer des secrets tels que greeting-dev, greeting-staging et greeting-prod. Dans chacun des profils, associez le bon message d'accueil.

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 un court instant, le résultat devrait s'afficher :

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

6. Résumé

Dans cet atelier, vous avez créé un service qui peut être configuré à l'aide de secrets stockés dans Secret Manager en utilisant les noms de propriétés de Spring avec le préfixe sm:// et en injectant la valeur à partir 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.