Anmeldedaten/Secrets von Secret Manager mit Spring Boot abrufen

1. Übersicht

Secrets wie Passwörter oder API-Schlüssel sind vertrauliche Informationen, die an einem sicheren, verschlüsselten Speicher mit Zugriffssteuerung und prüfbaren Daten gespeichert werden sollten. Einige Systeme verwenden zum Speichern dieser Secrets Vault. In Google Cloud können Sie den verwalteten Dienst Secret Manager verwenden, um die Secrets sicher zu speichern und den Zugriff auf einzelne Secrets mit IAM zu steuern.

In Spring Boot können Sie mit Spring Cloud GCP ganz einfach auf diese Secrets zugreifen, indem Sie sie wie andere Spring-Attribute angeben.

In diesem Codelab speichern Sie ein Secret in Secret Manager, erstellen dann einfache Spring Boot-Mikrodienste und rufen das Secret ab.

Aufgaben in diesem Lab

  • Spring Boot-Java-Anwendung erstellen und Secret Manager konfigurieren.

Voraussetzungen

  • Ein Google Cloud-Projekt
  • Browser, z. B. Chrome oder Firefox
  • Erfahrung mit standardmäßigen Linux-Texteditoren wie Vim, EMACs oder Nano

Wie möchten Sie diese Anleitung nutzen?

<ph type="x-smartling-placeholder"></ph> Nur bis zum Ende lesen Lies sie dir durch und absolviere die Übungen

Wie würden Sie Ihre Erfahrung mit der Erstellung von HTML/CSS-Web-Apps bewerten?

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

Wie würden Sie Ihre Erfahrungen im Umgang mit Google Cloud-Diensten bewerten?

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

2. Einrichtung und Anforderungen

Umgebung für das selbstbestimmte Lernen einrichten

  1. Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie ein Konto erstellen.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird in diesem Codelab später als PROJECT_ID bezeichnet.

  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen nutzen zu können.

Dieses Codelab sollte ohne großen Aufwand betrieben werden. Folgen Sie der Anleitung im Abschnitt „Bereinigen“, . Hier erfahren Sie, wie Sie Ressourcen herunterfahren, damit Ihnen über dieses Tutorial hinaus keine Kosten entstehen. Neue Google Cloud-Nutzer können an einem kostenlosen Testzeitraum mit 300$Guthaben teilnehmen.

Google Cloud Shell

Google Cloud-Dienste können Sie auch per Fernzugriff von Ihrem Laptop aus bedienen. In diesem Codelab verwenden wir jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtZWQFrF.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Wenn Sie Cloud Shell zum ersten Mal verwenden, wird ein Zwischenbildschirm (below the fold) angezeigt, in dem beschrieben wird, worum es sich dabei handelt. Klicken Sie in diesem Fall auf Weiter. Der Chat wird nie wieder angezeigt. So sieht dieser einmalige Bildschirm aus:

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

Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können Sie ganz einfach mit einem Browser oder Ihrem Chromebook erledigen.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt bereits auf Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. Secret konfigurieren

Aktivieren Sie zuerst die API, um Secret Manager zu verwenden:

$ gcloud services enable secretmanager.googleapis.com

Erstellen Sie dann ein Secret mit dem Namen greeting und dem Wert Hello:

$ echo -n "Hello" | \
 gcloud secrets create greeting \
 --data-file=-

Dieser Befehl verwendet STDIN, um den Wert an die Befehlszeile bereitzustellen. Sie können den Secret-Wert aber auch einfach in einer Datei speichern und den Dateinamen für das Argument --data-file angeben.

Sie können alle Secrets mit der gcloud CLI auflisten:

$ gcloud secrets list

4. Neuen Spring Boot REST-Dienst erstellen

Nach dem Start von Cloud Shell können Sie die Befehlszeile verwenden, um mit Spring Initializr eine neue Spring Boot-Anwendung zu generieren:

$ 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

Fügen Sie in der Datei pom.xml die Spring Cloud GCP-Starterabhängigkeit hinzu:

pom.xml

<project>
  ...

  <dependencies>
    ...
    <!-- Add Secret Manager Starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
    </dependency>
  </dependencies>

  ...
</project>

Fügen Sie die folgende Konfiguration in die Datei src/main/resources/application.properties ein, um die Spring Boot Config Data API zu aktivieren:

spring.config.import=sm://

Dadurch wird eine Spring-Property-Quelle konfiguriert, sodass Sie mithilfe eines Property-Werts mit dem Präfix sm:// auf Secrets verweisen können, z. B. sm://greeting.

Weitere Informationen zum Format von Attributen finden Sie in der Dokumentation zu Secret Manager von Spring Cloud GCP. Die application.properties-Anforderung ist in Spring Cloud GCP 4.x neu. Weitere Informationen finden Sie im Migrationsleitfaden.

Erstellen Sie einen neuen REST-Controller, indem Sie eine neue Klassendatei hinzufügen:

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!";
  }
}

Sie können die Spring Boot-Anwendung normal mit dem Spring Boot-Plug-in starten.

Prüfen Sie, ob für JAVA_HOME die richtige JDK-Version festgelegt ist:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Wir überspringen die Tests für dieses Lab und starten die Anwendung:

$ ./mvnw -DskipTests spring-boot:run

Klicken Sie nach dem Start der Anwendung in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau e18df08334f0d809.png und wählen Sie Vorschau auf Port 8080 aus.

Nach einer kurzen Wartezeit sollten Sie folgendes Ergebnis sehen:

1e9a7884ff113c14.png

5. Secret abrufen

Sie können die Annotation @Value verwenden, um mit dem Präfix sm:// auf das Secret-Attribut zu verweisen.

In die HelloSecretController-Klasse fügen Sie den Wert greeting mithilfe der Annotation ein:

src/main/java/com/example/demo/HelloSecretController.java

import org.springframework.beans.factory.annotation.Value;

...

@RestController
public class HelloSecretController {
  @Value("${sm://greeting}")
  String greeting;

  ...
}

Sie können die Spring Boot-Anwendung normal mit dem Spring Boot-Plug-in starten. In diesem Lab überspringen wir die Tests:

$ ./mvnw -DskipTests spring-boot:run

Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf "Web Preview" (Webvorschau) e18df08334f0d809.png und wählenPreview on port 8080 (Vorschau auf Port 8080) aus.

Nach einer kurzen Wartezeit sollten Sie folgendes Ergebnis sehen:

Screenshot der laufenden Anwendung mit „Hello World!“

Sie können den Wert auch einer Eigenschaft in application.properties zuordnen:

src/main/resources/application.properties

greeting=${sm://greeting}

In HelloSecretController können Sie auf diesen allgemeineren Attributnamen anstatt auf einen Secret Manager-Namen verweisen:

src/main/java/com/example/demo/HelloSecretController.java

@RestController
public class HelloSecretController {
  @Value("${greeting}")
  String greeting;
  ...
}

Sie können die Spring Boot-Anwendung normal mit dem Spring Boot-Plug-in starten. In diesem Lab überspringen wir die Tests:

$ ./mvnw -DskipTests spring-boot:run

Klicken Sie nach dem Start der Anwendung in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau Symbol für Webvorschau und wählen Sie Vorschau auf Port 8080 aus.

Secret-Wert aktualisieren

Mit der Kurzsyntax sm://greeting verwenden Sie automatisch die neueste Version des Secrets. Wenn Sie eine neue Version des Secrets erstellen, können Sie Ihre Anwendung aktualisieren, ohne Ihren Code zu ändern.

Aktualisieren Sie den Wert des Secrets, indem Sie eine neue Version hinzufügen:

$ echo -n "Greetings" |
 gcloud secrets versions add greeting \
 --data-file=-

Starten Sie die Anwendung neu und sehen Sie, wie die neue Version des Secrets zurückgegeben wird.

Screenshot der laufenden Anwendung mit „Greeings World!“

Erweiterung des Konzepts

Diese Technik ist besonders nützlich, wenn Sie verschiedene Spring Boot-Anwendungsprofile verwenden. Sie können beispielsweise Secrets wie greeting-dev, greeting-staging oder greeting-prod erstellen. Ordnen Sie in jedem Profil die richtigen Begrüßungen zu.

Erstellen Sie ein greeting-prod-Secret:

$ echo -n "Hola" | \
 gcloud secrets create greeting-prod \
 --data-file=- --replication-policy=automatic

Erstellen Sie eine application-prod.properties-Datei:

src/main/resources/application-prod.properties

greeting=${sm://greeting-prod}

Sie können die Spring Boot-Anwendung normal mit dem Spring Boot-Plug-in starten, jedoch mit dem Profil prod. In diesem Lab überspringen wir die Tests:

$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod

Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf "Web Preview" (Webvorschau) Symbol für Webvorschau und wählenPreview on port 8080 (Vorschau auf Port 8080) aus.

Nach einer kurzen Wartezeit sollten Sie folgendes Ergebnis sehen:

Screenshot der laufenden Anwendung mit „Hola World!“

6. Zusammenfassung

In diesem Lab haben Sie einen Dienst erstellt, der mit in Secret Manager gespeicherten Secrets konfiguriert werden kann. Dazu verwenden Sie die Attributnamen von Spring mit dem Präfix sm:// und fügen den Wert aus der Datei applications.properties und den Annotationen @Value ein.

7. Glückwunsch!

Sie haben gelernt, wie Sie die Secret Manager API in Java verwenden.

Weitere Informationen

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.