Anmeldedaten/Secrets von Secret Manager mit Spring Boot abrufen

1. Übersicht

Secrets wie Passwörter und API-Schlüssel sind vertrauliche Informationen, die in einem sicheren, verschlüsselten Speicher mit Zugriffskontrolle und Audit-Funktion gespeichert werden sollten. Einige Systeme verwenden Vault zum Speichern dieser Secrets. In Google Cloud können Sie Secret Manager, einen verwalteten Dienst, 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 jede andere Spring-Eigenschaft referenzieren.

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

Lerninhalte

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

Voraussetzungen

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

Wie werden Sie diese Anleitung verwenden?

Nur lesen Lesen und Übungen durchführen

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

Anfänger Mittelstufe Fortgeschrittene

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

Anfänger Mittelstufe Fortgeschritten

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten 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 eines 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 später in diesem Codelab als PROJECT_ID bezeichnet.

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

Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Folgen Sie bitte der Anleitung im Abschnitt „Bereinigen“, in der Sie erfahren, wie Sie Ressourcen herunterfahren können, damit nach Abschluss dieser Anleitung keine Gebühren anfallen. Neue Nutzer von Google Cloud kommen für das Programm für den kostenlosen Testzeitraum mit einem Guthaben von 300$ infrage.

Google Cloud Shell

Während Sie Google Cloud-Dienste von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, 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_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Wenn Sie Cloud Shell noch nie gestartet haben, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter. So sieht dieses Fenster aus:

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

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser oder Ihrem Chromebook erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in der 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

Um Secret Manager zu verwenden, müssen Sie zuerst die API aktivieren:

$ 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 für die Befehlszeile bereitzustellen. Sie können den Secret-Wert aber auch einfach in eine Datei einfügen und den Dateinamen für das --data-file-Argument angeben.

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

$ gcloud secrets list

4. Neuen Spring Boot-REST-Dienst erstellen

Nachdem Cloud Shell gestartet wurde, können Sie über die Befehlszeile eine neue Spring Boot-Anwendung mit Spring Initializr 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 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 der Datei src/main/resources/application.properties die folgende Konfiguration hinzu, um die Spring Boot Config Data API zu aktivieren:

spring.config.import=sm://

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

Weitere Informationen zum Format der Property finden Sie in der Spring Cloud GCP Secret Manager-Dokumentation. Die Anforderung application.properties ist neu in Spring Cloud GCP 4.x. Weitere Informationen finden Sie in der Migrationsanleitung.

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 wie gewohnt mit dem Spring Boot-Plug-in starten.

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

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

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

$ ./mvnw -DskipTests spring-boot:run

Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau e18df08334f0d809.png und wählen Vorschau auf Port 8080 aus.

Nach kurzer Zeit sollte das Ergebnis angezeigt werden:

1e9a7884ff113c14.png

5. Secret abrufen

Mit der Annotation @Value können Sie mit dem Präfix sm:// auf das Attribut „secret“ verweisen.

Fügen Sie in der Klasse „HelloSecretController“ den Wert greeting mit 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 wie gewohnt mit dem Spring Boot-Plug-in starten. Wir überspringen die Tests für dieses Lab:

$ ./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 kurzer Zeit sollte das Ergebnis angezeigt werden:

Screenshot der ausgeführten Anwendung mit „Hello World!“

Sie können den Wert auch einem Attribut in application.properties zuordnen:

src/main/resources/application.properties

greeting=${sm://greeting}

In HelloSecretController können Sie auf diesen allgemeineren Property-Namen anstelle eines Secret Manager-Namens verweisen:

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

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

Sie können die Spring Boot-Anwendung wie gewohnt mit dem Spring Boot-Plug-in starten. Wir überspringen die Tests für dieses Lab:

$ ./mvnw -DskipTests spring-boot:run

Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau Symbol für Webvorschau und wählen Vorschau auf Port 8080 aus.

Secret-Wert aktualisieren

Wenn Sie die Kurzschreibweise sm://greeting verwenden, wird automatisch die neueste Version des Secrets verwendet. Wenn Sie eine neue Version des Secrets erstellen, können Sie Ihre Anwendung aktualisieren, ohne den 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. Die neue Version des Secrets wird zurückgegeben.

Screenshot der ausgeführten Anwendung mit „Greetings World!“

Dieses Konzept weiterentwickeln

Diese Technik ist besonders nützlich, wenn Sie verschiedene Spring Boot-Anwendungsprofile verwenden. Sie können beispielsweise Secrets wie greeting-dev, greeting-staging und greeting-prod erstellen. Ordnen Sie 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 mit dem Spring Boot-Plug-in wie gewohnt starten, aber mit dem Profil prod. Wir überspringen die Tests für dieses Lab:

$ ./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 kurzer Zeit sollte das Ergebnis angezeigt werden:

Screenshot der laufenden Anwendung mit „Hola World!“

6. Zusammenfassung

In diesem Lab haben Sie einen Dienst erstellt, der mithilfe von Secrets konfiguriert werden kann, die in Secret Manager gespeichert sind. Dazu haben Sie die Eigenschaftsnamen von Spring mit sm:// versehen und den Wert aus der Datei applications.properties und den Annotationen @Value eingefügt.

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.