1. Panoramica
I secret come password e chiavi API sono informazioni sensibili che devono essere archiviate in un archivio sicuro e criptato, con controllo degli accessi e audit. Alcuni sistemi scelgono di utilizzare Vault per archiviare questi secret. Su Google Cloud, puoi utilizzare Secret Manager, un servizio gestito, per archiviare in modo sicuro i secret e controllare l'accesso ai singoli secret utilizzando IAM.
In Spring Boot, puoi utilizzare Spring Cloud GCP per accedere facilmente a questi secret facendo riferimento a essi come a qualsiasi altra proprietà Spring.
In questo codelab, memorizzerai un secret in Secret Manager, quindi creerai semplici microservizi Spring Boot e recupererai il secret.
Cosa imparerai a fare
- Come creare un'applicazione Java Spring Boot e configurare Secret Manager.
Che cosa ti serve
- Un progetto Google Cloud
- Un browser, ad esempio Chrome o Firefox
- Familiarità con gli editor di testo standard di Linux, ad esempio Vim, EMAC o Nano
Come utilizzerai questo tutorial?
Come valuti la tua esperienza di creazione di app web HTML/CSS?
Come valuti la tua esperienza di utilizzo dei servizi Google Cloud?
2. Configurazione e requisiti
Configurazione dell'ambiente autonomo
- Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai già un account Gmail o G Suite, devi crearne uno.
Ricorda l'ID progetto, un nome univoco tra tutti i progetti Google Cloud (il nome sopra è già stato utilizzato e non funzionerà per te, mi dispiace). In questo codelab verrà chiamato PROJECT_ID.
- Successivamente, dovrai abilitare la fatturazione in Cloud Console per utilizzare le risorse Google Cloud.
L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Assicurati di seguire le istruzioni riportate nella sezione "Pulizia", che ti consiglia come arrestare le risorse in modo da non incorrere in addebiti oltre questo tutorial. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.
Google Cloud Shell
Sebbene i servizi Google Cloud possano essere gestiti da remoto dal tuo laptop, in questo codelab utilizzeremo Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.
Attiva Cloud Shell
- Nella console Cloud, fai clic su Attiva Cloud Shell
.
Se non hai mai avviato Cloud Shell, viene visualizzata una schermata intermedia (sotto la piega) che ne descrive le funzionalità. In questo caso, fai clic su Continua e non comparirà più. Ecco come si presenta la schermata intermedia:
Bastano pochi istanti per eseguire il provisioning e connettersi a Cloud Shell.
Questa macchina virtuale è caricata con tutti gli strumenti per sviluppatori di cui avrai bisogno. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro per questo codelab, se non tutto, può essere svolto semplicemente con un browser o con Chromebook.
Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo ID progetto.
- Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list
Output comando
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
Output comando
[core] project = <PROJECT_ID>
In caso contrario, puoi impostarlo con questo comando:
gcloud config set project <PROJECT_ID>
Output comando
Updated property [core/project].
3. Configura un secret
Per utilizzare Secret Manager, abilita prima l'API:
$ gcloud services enable secretmanager.googleapis.com
Poi, crea un secret denominato greeting con il valore Hello:
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
Questo comando utilizza STDIN per fornire il valore alla riga di comando. Tuttavia, puoi anche inserire semplicemente il valore del secret in un file e specificare il nome del file per l'argomento --data-file.
Puoi elencare tutti i secret utilizzando gcloud CLI:
$ gcloud secrets list
4. Crea un nuovo servizio REST Spring Boot
Dopo l'avvio di Cloud Shell, puoi utilizzare la riga di comando per generare una nuova applicazione Spring Boot con 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
In pom.xml, aggiungi la dipendenza iniziale di 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>
Nel file src/main/resources/application.properties, aggiungi la seguente configurazione per abilitare l'API Spring Boot Config Data:
spring.config.import=sm://
In questo modo viene configurata un'origine proprietà Spring, in modo da poter fare riferimento ai secret utilizzando un valore di proprietà, con il prefisso sm://, ad esempio sm://greeting.
Per saperne di più sul formato della proprietà, consulta la documentazione di Spring Cloud GCP Secret Manager. Tieni presente che il requisito application.properties è una novità di Spring Cloud GCP 4.x. Scopri di più nella guida alla migrazione.
Crea un nuovo controller REST aggiungendo un nuovo file di 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!";
}
}
Puoi avviare l'applicazione Spring Boot normalmente con il plug-in Spring Boot.
Assicurati che JAVA_HOME sia impostato sulla versione JDK corretta:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Saltiamo i test per questo lab e avviamo l'applicazione:
$ ./mvnw -DskipTests spring-boot:run
Una volta avviata l'applicazione, fai clic sull'icona Anteprima web
nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.
Dopo una breve attesa, dovresti vedere il risultato:

5. Recuperare un secret
Puoi utilizzare l'annotazione @Value per fare riferimento alla proprietà secret utilizzando il prefisso sm://.
Nella classe HelloSecretController, inserisci il valore greeting utilizzando l'annotazione:
src/main/java/com/example/demo/HelloSecretController.java
import org.springframework.beans.factory.annotation.Value;
...
@RestController
public class HelloSecretController {
@Value("${sm://greeting}")
String greeting;
...
}
Puoi avviare l'applicazione Spring Boot normalmente con il plug-in Spring Boot. Saltiamo i test per questo lab:
$ ./mvnw -DskipTests spring-boot:run
Una volta avviata l'applicazione, fai clic sull'icona Anteprima web
nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.
Dopo una breve attesa, dovresti vedere il risultato:

Puoi anche mappare il valore a una proprietà in application.properties:
src/main/resources/application.properties
greeting=${sm://greeting}
In HelloSecretController, puoi fare riferimento a questo nome di proprietà più generico anziché a un nome di Secret Manager:
src/main/java/com/example/demo/HelloSecretController.java
@RestController
public class HelloSecretController {
@Value("${greeting}")
String greeting;
...
}
Puoi avviare l'applicazione Spring Boot normalmente con il plug-in Spring Boot. Saltiamo i test per questo lab:
$ ./mvnw -DskipTests spring-boot:run
Una volta avviata l'applicazione, fai clic sull'icona Anteprima web
nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.
Aggiornamento del valore del secret
Utilizzando la sintassi breve sm://greeting, utilizzi automaticamente l'ultima versione del secret. Creando una nuova versione del secret, puoi aggiornare l'applicazione senza modificare il codice.
Aggiorna il valore del secret aggiungendo una nuova versione:
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
Riavvia l'applicazione e verifica che venga restituita la nuova versione del secret.

Espansione di questo concetto
Questa tecnica è utile soprattutto se utilizzi profili di applicazioni Spring Boot diversi. Ad esempio, puoi creare secret come greeting-dev, greeting-staging, greeting-prod. In ogni profilo, mappa i saluti giusti.
Crea un secret greeting-prod:
$ echo -n "Hola" | \ gcloud secrets create greeting-prod \ --data-file=- --replication-policy=automatic
Crea un file application-prod.properties:
src/main/resources/application-prod.properties
greeting=${sm://greeting-prod}
Puoi avviare l'applicazione Spring Boot normalmente con il plug-in Spring Boot, ma con il profilo prod. Saltiamo i test per questo lab:
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod
Una volta avviata l'applicazione, fai clic sull'icona Anteprima web
nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.
Dopo una breve attesa, dovresti vedere il risultato:

6. Riepilogo
In questo lab hai creato un servizio che può essere configurato utilizzando i secret archiviati in Secret Manager utilizzando i nomi delle proprietà di Spring con il prefisso sm:// e inserendo il valore dal file applications.properties e dalle annotazioni @Value.
7. Complimenti!
Hai imparato a utilizzare l'API Secret Manager in Java.
Scopri di più
- Progetto Spring on GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repository GitHub di Spring su GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java su Google Cloud: https://cloud.google.com/java/
- Controllo dell'accesso ai secret in Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Audit logging in Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
Licenza
Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.