1. Przegląd
Obiekty tajne, takie jak hasła czy klucze interfejsu API, to informacje wrażliwe, które powinny być przechowywane w bezpiecznym, zaszyfrowanym magazynie z kontrolowanym dostępem i możliwością audytu. Niektóre systemy używają do przechowywania tych obiektów tajnych Vault. W Google Cloud możesz używać usługi Secret Manager, usługi zarządzanej, która umożliwia bezpieczne przechowywanie obiektów tajnych i kontrolowanie dostępu do poszczególnych obiektów tajnych za pomocą usługi IAM.
W Spring Boot możesz użyć Spring Cloud GCP, aby łatwo uzyskać dostęp do tych obiektów tajnych, odwołując się do nich jak do innych właściwości Springa.
W tym module nauczysz się przechowywać obiekt tajny w usłudze Secret Manager, a następnie tworzyć proste mikroserwisy Spring Boot i pobierać z nich obiekt tajny.
Czego się nauczysz
- Jak utworzyć aplikację Spring Boot w Javie i skonfigurować usługę Secret Manager.
Czego potrzebujesz
- Projekt Google Cloud
- przeglądarka, np. Chrome lub Firefox;
- Znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, EMACS lub Nano.
Jak zamierzasz korzystać z tego samouczka?
Jak oceniasz swoje doświadczenie w tworzeniu aplikacji internetowych w HTML/CSS?
Jak oceniasz korzystanie z usług Google Cloud?
2. Konfiguracja i wymagania
Samodzielne konfigurowanie środowiska
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. (Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć).
Zapamiętaj identyfikator projektu, czyli unikalną nazwę we wszystkich projektach Google Cloud (podana powyżej nazwa jest już zajęta i nie będzie działać w Twoim przypadku). W dalszej części tego laboratorium będzie on nazywany PROJECT_ID.
- Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów Google Cloud.
Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Wykonaj instrukcje z sekcji „Czyszczenie”, w której znajdziesz informacje o tym, jak wyłączyć zasoby, aby uniknąć naliczenia opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.
Google Cloud Shell
Usługi Google Cloud można obsługiwać zdalnie z laptopa, ale w tym module użyjemy Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.
Aktywowanie Cloud Shell
- W konsoli Cloud kliknij Aktywuj Cloud Shell
.
Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni (część strony widoczna po przewinięciu) z opisem tego środowiska. W takim przypadku kliknij Dalej, a ten ekran nie będzie się już wyświetlać. Ten wyświetlany jednorazowo ekran wygląda tak:
Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.
Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce lub na Chromebooku.
Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.
- Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list
Wynik 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
Wynik polecenia
[core] project = <PROJECT_ID>
Jeśli nie, możesz go ustawić za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Wynik polecenia
Updated property [core/project].
3. Konfigurowanie obiektu tajnego
Aby korzystać z Secret Manager, najpierw włącz interfejs API:
$ gcloud services enable secretmanager.googleapis.com
Następnie utwórz obiekt tajny o nazwie greeting i wartości Hello:
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
To polecenie używa STDIN, aby przekazać wartość do wiersza poleceń. Możesz jednak po prostu umieścić wartość obiektu tajnego w pliku i określić nazwę pliku w argumencie --data-file.
Aby wyświetlić listę wszystkich obiektów tajnych, użyj gcloud CLI:
$ gcloud secrets list
4. Tworzenie nowej usługi REST Spring Boot
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 pliku pom.xml dodaj zależność Spring Cloud GCP starter:
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ć interfejs Spring Boot Config Data API:
spring.config.import=sm://
Spowoduje to skonfigurowanie źródła właściwości Spring, dzięki czemu możesz odwoływać się do wpisów tajnych za pomocą wartości właściwości z prefiksem sm://, np. sm://greeting.
Więcej informacji o formacie właściwości znajdziesz w dokumentacji Spring Cloud GCP Secret Manager. Pamiętaj, że application.properties jest nowym wymaganiem 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ć normalnie za pomocą wtyczki Spring Boot.
Sprawdź, czy zmienna JAVA_HOME jest ustawiona na prawidłową wersję JDK:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
W tym module pominiemy testy i uruchomimy aplikację:
$ ./mvnw -DskipTests spring-boot:run
Po uruchomieniu aplikacji kliknij ikonę Podgląd w przeglądarce
na pasku narzędzi Cloud Shell i wybierz Podejrzyj na porcie 8080.
Po krótkim czasie powinien pojawić się wynik:

5. Pobieranie obiektu tajnego
Możesz użyć adnotacji @Value, aby odwołać się do właściwości tajnej za pomocą prefiksu sm://.
W klasie HelloSecretController wstrzyknij wartość greeting za pomocą 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ć normalnie za pomocą wtyczki Spring Boot. Pomińmy testy w tym module:
$ ./mvnw -DskipTests spring-boot:run
Po uruchomieniu aplikacji kliknij ikonę podglądu w przeglądarce
na pasku narzędzi Cloud Shell i wybierz Podejrzyj na porcie 8080.
Po krótkim czasie powinien pojawić się wynik:

Możesz też przypisać wartość do właściwości w application.properties:
src/main/resources/application.properties
greeting=${sm://greeting}
W pliku HelloSecretController możesz odwoływać się do tej bardziej ogólnej nazwy właściwości zamiast 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ć normalnie za pomocą wtyczki Spring Boot. Pomińmy testy w tym module:
$ ./mvnw -DskipTests spring-boot:run
Po uruchomieniu aplikacji kliknij ikonę Podgląd w przeglądarce
na pasku narzędzi Cloud Shell i wybierz Podejrzyj na porcie 8080.
Aktualizowanie wartości obiektu tajnego
Korzystając z krótkiej składni sm://greeting, automatycznie używasz 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 ponownie aplikację i sprawdź, czy zwracana jest nowa wersja obiektu tajnego.

Rozwijanie tej koncepcji
Ta technika jest szczególnie przydatna, jeśli używasz różnych profili aplikacji Spring Boot. Możesz na przykład utworzyć klucze tajne, takie jak greeting-dev, greeting-staging, greeting-prod. W każdym profilu przypisz odpowiednie powitania.
Utwórz greeting-prod obiekt tajny:
$ 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 za pomocą wtyczki Spring Boot, ale z profilem prod. Pomińmy testy w tym module:
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod
Po uruchomieniu aplikacji kliknij ikonę podglądu w przeglądarce
na pasku narzędzi Cloud Shell i wybierz Podejrzyj na porcie 8080.
Po krótkim czasie powinien pojawić się wynik:

6. Podsumowanie
W tym module utworzyliśmy usługę, którą można skonfigurować za pomocą obiektów tajnych przechowywanych w usłudze Secret Manager. W tym celu użyliśmy nazw właściwości Springa z prefiksem sm:// i wstrzyknęliśmy wartość z pliku applications.properties oraz adnotacji @Value.
7. Gratulacje!
Wiesz już, jak używać interfejsu Secret Manager API w Javie.
Więcej informacji
- Projekt Spring on GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repozytorium Spring on GCP w GitHubie: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java w Google Cloud: https://cloud.google.com/java/
- Kontrolowanie dostępu do obiektów tajnych w Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Dzienniki kontrolne w Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
Licencja
To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.