Recupero di credenziali/Secret da Secret Manager con Spring Boot

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?

Leggilo e basta Leggilo e completa gli esercizi

Come valuti la tua esperienza di creazione di app web HTML/CSS?

Principiante Intermedio Avanzato

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

Principiante Intermedio Avanzato

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

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

  1. Nella console Cloud, fai clic su Attiva Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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:

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

Bastano pochi istanti per eseguire il provisioning e connettersi a Cloud Shell.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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.

  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

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

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.

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

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

Licenza

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