1. Panoramica
I secret, come le password e le chiavi API, sono informazioni sensibili, devono essere archiviati in un ambiente sicuro, criptato, con accesso controllato e verificabile. 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 tramite IAM.
In Spring Boot, puoi utilizzare Spring Cloud GCP per accedere facilmente a questi secret facendovi riferimento come qualsiasi altra proprietà Spring.
In questo codelab, archivierai un secret in Secret Manager, quindi creerai semplici microservizi Spring Boot e recupererai il secret.
Cosa imparerai a fare
- 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 valuteresti la tua esperienza nello sviluppo di app web HTML/CSS?
Come giudichi la tua esperienza di utilizzo dei servizi Google Cloud?
2. Configurazione e requisiti
Configurazione dell'ambiente da seguire in modo autonomo
- Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o G Suite, devi crearne uno.
Ricorda l'ID progetto, un nome univoco in tutti i progetti Google Cloud (il nome precedente è già stato utilizzato e non funzionerà correttamente). Verrà indicato più avanti in questo codelab come PROJECT_ID
.
- Successivamente, dovrai abilitare la fatturazione in Cloud Console per utilizzare le risorse Google Cloud.
Eseguire questo codelab non dovrebbe costare molto. Assicurati di seguire le istruzioni nella sezione "Pulizia" in cui viene spiegato come arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial. I nuovi utenti di Google Cloud sono idonei al programma di prova senza costi di 300$.
Google Cloud Shell
I servizi Google Cloud possono essere gestiti da remoto dal tuo laptop, ma in questo codelab utilizzeremo Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.
Attiva Cloud Shell
- Dalla console Cloud, fai clic su Attiva Cloud Shell .
Se non hai mai avviato Cloud Shell, verrà visualizzata una schermata intermedia (below the fold) in cui viene descritto di cosa si tratta. In tal caso, fai clic su Continua (e non la vedrai più). Ecco come appare quella singola schermata:
Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.
Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto semplicemente con un browser o 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
Quindi, crea un secret denominato greeting
, con 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 semplicemente inserire il valore del secret in un file, specificando 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 Google Cloud:
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 verrà configurata un'origine proprietà Spring, in modo da poter fare riferimento ai secret utilizzando un valore della proprietà, con il prefisso sm://
, ad esempio sm://greeting
.
Per ulteriori dettagli sul formato della proprietà, consulta la documentazione di Spring Cloud GCP Secret Manager. Tieni presente che il requisito application.properties
è un nuovo requisito in Spring Cloud Google Cloud 4.x. Leggi maggiori dettagli 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 impostata sulla versione JDK corretta:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Saltiamo i test di 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. Recupera 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 di 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 di 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
Con la sintassi breve sm://greeting
, viene usata automaticamente la versione più recente 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 controlla che venga restituita la nuova versione del secret.
Espansione di questo concetto
Questa tecnica è utile soprattutto se utilizzi profili di applicazione Spring Boot diversi. Ad esempio, puoi creare secret come greeting-dev
, greeting-staging
e greeting-prod
. In ogni profilo, mappa gli auguri corretti.
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 di 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 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ù
- Spring sul progetto Google Cloud: http://cloud.spring.io/spring-cloud-gcp/
- Repository GitHub di Google Cloud Spring: 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.