Pobieranie danych logowania/obiektów tajnych z usługi Secret Manager za pomocą Spring Boot

1. Omówienie

Obiekty tajne, takie jak hasła czy klucze interfejsu API, należy przechowywać w bezpiecznym, zaszyfrowanym magazynie danych z kontrolą dostępu i podlegającymi audytowi. Niektóre systemy decydują się na przechowywanie tych obiektów tajnych w Vault. W Google Cloud możesz używać usługi zarządzanej Secret Manager do bezpiecznego przechowywania obiektów tajnych i kontrolowania dostępu do poszczególnych obiektów tajnych za pomocą uprawnień.

W Spring Boot możesz używać usługi Spring Cloud GCP, aby łatwo uzyskać dostęp do tych obiektów tajnych, nazywając je jak wszystkimi innymi właściwościami Spring.

W ramach tego ćwiczenia w Codelabs zapiszesz obiekt tajny w usłudze Secret Manager, a następnie utworzysz proste mikroserwisy Spring Boot i pobierzesz ten obiekt tajny.

Czego się nauczysz

  • Jak utworzyć aplikację Spring Boot w Javie i skonfigurować usługę Secret Manager.

Czego potrzebujesz

  • Projekt Google Cloud
  • przeglądarkę, np. Chrome lub Firefox;
  • znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, EMAC lub Nano;

Jak wykorzystasz ten samouczek?

Tylko do przeczytania Przeczytaj go i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenie z tworzeniem aplikacji internetowych HTML/CSS?

Początkujący Poziom średnio zaawansowany Biegły

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa jest już zajęta i nie będzie Ci odpowiadać). W dalszej części tego ćwiczenia w programie będzie ona określana jako PROJECT_ID.

  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Google Cloud.

Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” W tym samouczku znajdziesz wskazówki, jak wyłączyć zasoby, aby uniknąć naliczania opłat. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Google Cloud Shell,

Usługami Google Cloud można sterować zdalnie z laptopa, ale w ramach tych ćwiczeń z programowania wykorzystamy Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Jeśli dopiero zaczynasz korzystać z Cloud Shell, wyświetli się ekran pośredni (w części strony widocznej po przewinięciu) z opisem tej funkcji. W takim przypadku kliknij Dalej (nie zobaczysz go więcej). Tak wygląda ten jednorazowy ekran:

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

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość czynności z tego ćwiczenia z programowania można wykonać w przeglądarce lub na Chromebooku.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się informacja, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

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

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

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Skonfiguruj obiekt tajny

Aby korzystać z usługi Secret Manager, najpierw włącz interfejs API:

$ gcloud services enable secretmanager.googleapis.com

Następnie utwórz obiekt tajny o nazwie greeting z wartością Hello:

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

To polecenie używa STDIN, aby podać wartość w wierszu poleceń. Możesz też jednak umieścić wartość obiektu tajnego w pliku i podać nazwę pliku dla argumentu --data-file.

Wszystkie obiekty tajne możesz wyświetlić za pomocą interfejsu wiersza poleceń gcloud:

$ gcloud secrets list

4. Utwórz nową usługę Spring Boot REST

Po uruchomieniu Cloud Shell możesz użyć wiersza poleceń, aby wygenerować nową aplikację Spring Boot za pomocą 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

W obiekcie pom.xml dodaj zależność startową 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>

W pliku src/main/resources/application.properties dodaj tę konfigurację, aby włączyć Spring Boot Config Data API:

spring.config.import=sm://

Spowoduje to skonfigurowanie źródła usługi Spring, dzięki czemu będzie można odwoływać się do obiektów tajnych za pomocą wartości właściwości z prefiksem sm://, np. sm://greeting.

Więcej informacji o formacie usługi znajdziesz w dokumentacji usługi Spring Cloud GCP Secret Manager. Zwróć uwagę, że wymaganie application.properties jest nowością w Spring Cloud GCP 4.x. Więcej informacji znajdziesz w przewodniku po migracji.

Utwórz nowy kontroler REST, dodając nowy plik klasy:

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

Aplikację Spring Boot możesz uruchomić w zwykły sposób, używając wtyczki Spring Boot.

Sprawdź, czy JAVA_HOME ma prawidłową wersję JDK:

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

Pomińmy testy tego modułu i uruchommy aplikację:

$ ./mvnw -DskipTests spring-boot:run

Po uruchomieniu aplikacji kliknij ikonę podglądu w przeglądarce e18df08334f0d809.png na pasku narzędzi Cloud Shell i wybierz podgląd na porcie 8080.

Wynik powinien pojawić się po krótkim czasie:

1e9a7884ff113c14.png

5. Pobieranie obiektu tajnego

Możesz używać adnotacji @Value, aby odwołać się do właściwości obiektu tajnego za pomocą prefiksu sm://.

W klasie HelloSecretController wstrzyknij wartość greeting przy użyciu adnotacji:

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

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

...

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

  ...
}

Aplikację Spring Boot możesz uruchomić w zwykły sposób, używając wtyczki Spring Boot. W tym module pomińmy testy:

$ ./mvnw -DskipTests spring-boot:run

Po uruchomieniu aplikacji kliknij ikonę podglądu w przeglądarce e18df08334f0d809.png na pasku narzędzi Cloud Shell i wybierz podgląd na porcie 8080.

Wynik powinien pojawić się po krótkim czasie:

Zrzut ekranu przedstawiający uruchomioną aplikację z widocznym komunikatem „Hello World!”

Możesz też zmapować wartość na właściwość w zasadzie application.properties:

src/main/resources/application.properties

greeting=${sm://greeting}

W HelloSecretController możesz odwołać się do tej bardziej ogólnej nazwy właściwości, a nie do nazwy usługi Secret Manager:

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

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

Aplikację Spring Boot możesz uruchomić w zwykły sposób, używając wtyczki Spring Boot. W tym module pomińmy testy:

$ ./mvnw -DskipTests spring-boot:run

Po uruchomieniu aplikacji kliknij ikonę podglądu w przeglądarce Ikona podglądu w przeglądarce na pasku narzędzi Cloud Shell i wybierz podgląd na porcie 8080.

Aktualizuję wartość obiektu tajnego

Użycie krótkiej składni sm://greeting powoduje automatyczne użycie najnowszej wersji obiektu tajnego. Tworząc nową wersję obiektu tajnego, możesz zaktualizować aplikację bez zmiany kodu.

Zaktualizuj wartość obiektu tajnego, dodając nową wersję:

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

Uruchom aplikację ponownie i sprawdź, czy zwracana jest nowa wersja obiektu tajnego.

Zrzut ekranu z uruchomioną aplikacją, na którym widoczny jest komunikat „Greeings World!”.

Rozszerzanie koncepcji

Ta technika jest przydatna zwłaszcza wtedy, gdy korzystasz z różnych profili aplikacji Spring Boot. Możesz na przykład tworzyć obiekty tajne, takie jak greeting-dev, greeting-staging, greeting-prod. W każdym profilu znajdź odpowiednie powitania.

Utwórz obiekt tajny greeting-prod:

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

Utwórz plik application-prod.properties:

src/main/resources/application-prod.properties

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

Aplikację Spring Boot możesz uruchomić normalnie, korzystając z wtyczki Spring Boot, ale z profilem prod. W tym module pomińmy testy:

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

Po uruchomieniu aplikacji kliknij ikonę podglądu w przeglądarce Ikona podglądu w przeglądarce na pasku narzędzi Cloud Shell i wybierz podgląd na porcie 8080.

Wynik powinien pojawić się po krótkim czasie:

Zrzut ekranu przedstawiający uruchomioną aplikację z napisem „Hola World!”

6. Podsumowanie

W tym module udało Ci się utworzyć usługę, którą można skonfigurować przy użyciu obiektów tajnych przechowywanych w usłudze Secret Manager, używając nazw właściwości Spring poprzedzonych prefiksem sm:// i wstrzykując wartość z pliku applications.properties oraz adnotacji @Value.

7. Gratulacje!

Wiesz już, jak korzystać z interfejsu Secret Manager API w języku Java.

Więcej informacji

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.