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 ?
Comment évalueriez-vous votre expérience en matière de création d'applications Web HTML/CSS ?
Quel est votre niveau d'expérience avec les services Google Cloud ?
<ph type="x-smartling-placeholder">2. Préparation
Configuration de l'environnement d'auto-formation
- 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.)
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.
- 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
- Dans Cloud Console, cliquez sur Activer Cloud Shell .
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 :
Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.
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.
- 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 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:
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) 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:
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 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.
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) 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:
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
- Projet Spring sur GCP: http://cloud.spring.io/spring-cloud-gcp/
- Dépôt GitHub Spring sur GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java sur Google Cloud: https://cloud.google.com/java/
- Contrôler l'accès aux secrets dans Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Journaux d'audit dans Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
Licence
Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.