Recupero di credenziali/Secret da Secret Manager con Spring Boot

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?

Solo lettura Leggilo e completa gli esercizi

Come valuteresti la tua esperienza nello sviluppo di app web HTML/CSS?

Principiante Livello intermedio Eccellente

Come giudichi la tua esperienza di utilizzo dei servizi Google Cloud?

Principiante Livello intermedio Eccellente

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo autonomo

  1. 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.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. 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

  1. Dalla console Cloud, fai clic su Attiva Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LXZWQdLgLz.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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:

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

Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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.

  1. 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 e18df08334f0d809.png nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.

Dopo una breve attesa, dovresti vedere il risultato:

1e9a7884ff113c14.png

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 e18df08334f0d809.png nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.

Dopo una breve attesa, dovresti vedere il risultato:

Screenshot dell&#39;applicazione in esecuzione, che mostra &quot;Hello World!&quot;

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 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.

Screenshot dell&#39;applicazione in esecuzione, che mostra &quot;Greeings World!&quot;

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 Icona Anteprima web nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.

Dopo una breve attesa, dovresti vedere il risultato:

Screenshot dell&#39;applicazione in esecuzione, che mostra &quot;Hola World!&quot;

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ù

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.