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?
Jak oceniasz swoje doświadczenie z tworzeniem aplikacji internetowych 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 wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć.
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
.
- 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
- W konsoli Cloud kliknij Aktywuj Cloud Shell .
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:
Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.
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.
- 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 na pasku narzędzi Cloud Shell i wybierz podgląd na porcie 8080.
Wynik powinien pojawić się po krótkim czasie:
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 na pasku narzędzi Cloud Shell i wybierz podgląd na porcie 8080.
Wynik powinien pojawić się po krótkim czasie:
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 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.
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 na pasku narzędzi Cloud Shell i wybierz podgląd na porcie 8080.
Wynik powinien pojawić się po krótkim czasie:
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
- Projekt wiosenny w GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repozytorium Spring on GCP na GitHubie: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java w Google Cloud: https://cloud.google.com/java/
- Kontrola dostępu do obiektów tajnych w usłudze Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Logowanie kontrolne w usłudze 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.