1. 總覽
密碼、API 金鑰等私密資訊應儲存在安全、加密的儲存空間、存取權受到控管且可稽核中。部分系統會選擇使用保管箱儲存這些密鑰。您可以在 Google Cloud 中使用 Secret Manager 這項代管服務安全地儲存密鑰,並使用身分與存取權管理控管個別密鑰的存取權。
在 Spring Boot 中,您可以使用 Spring Cloud GCP 將這些密鑰當做任何其他 Spring 屬性,輕鬆存取。
在這個程式碼研究室中,您會將密鑰儲存在 Secret Manager,然後建構簡單的 Spring Boot 微服務並擷取密鑰。
課程內容
- 如何建立 Spring Boot Java 應用程式並設定 Secret Manager。
軟硬體需求
您會如何使用這個教學課程?
針對建立 HTML/CSS 網頁應用程式的經驗,您會給予什麼評價?
針對使用 Google Cloud 服務的經驗,您會給予什麼評價?
2. 設定和需求
自修環境設定
提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID
。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。
執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
Google Cloud Shell
雖然 Google Cloud 服務可以從筆電遠端運作,但在本程式碼研究室中,我們會使用 Google Cloud Shell,這是 Cloud 中執行的指令列環境。
啟用 Cloud Shell
- 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 。
如果您從未啟動 Cloud Shell,您會看見中繼畫面 (需捲動位置),說明螢幕內容。如果出現這種情況,請按一下「繼續」 (之後不會再顯示)。以下是單次畫面的外觀:
佈建並連線至 Cloud Shell 只需幾分鐘的時間。
這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可以透過瀏覽器或 Chromebook 完成。
連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。
- 在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list
指令輸出
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
指令輸出
[core] project = <PROJECT_ID>
如果尚未設定,請使用下列指令進行設定:
gcloud config set project <PROJECT_ID>
指令輸出
Updated property [core/project].
3. 設定密鑰
如要使用 Secret Manager,請先啟用 API:
$ gcloud services enable secretmanager.googleapis.com
接著建立名為 greeting
的密鑰,並將值設為 Hello
:
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
這個指令使用 STDIN
將值提供給指令列。不過,您也可以直接將密鑰值放入檔案,也就是為 --data-file
引數指定檔案名稱。
您可以使用 gcloud CLI 列出所有密鑰:
$ gcloud secrets list
4. 建立新的 Spring Boot REST 服務
Cloud Shell 啟動後,您可以使用指令列,透過 Spring Initializr 產生新的 Spring Boot 應用程式:
$ 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
在 pom.xml
中,新增 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>
在 src/main/resources/application.properties
檔案中,新增下列設定以啟用 Spring Boot Config Data API:
spring.config.import=sm://
這樣做將會設定 Spring 屬性來源,這樣一來,您就能使用前置字元為 sm://
的屬性值參照 Secret,例如 sm://greeting
。
如要進一步瞭解屬性格式,請參閱 Spring Cloud GCP Secret Manager 說明文件。請注意,application.properties
規定已於 Spring Cloud GCP 4.x 推出。詳情請參閱遷移指南。
透過新增類別檔案建立新的 REST 控制器:
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!";
}
}
您可以使用 Spring Boot 外掛程式正常啟動 Spring Boot 應用程式。
確認 JAVA_HOME 設定的 JDK 版本正確無誤:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
讓我們略過本研究室的測試,並啟動應用程式:
$ ./mvnw -DskipTests spring-boot:run
應用程式啟動後,請點選 Cloud Shell 工具列中的「網頁預覽」圖示 ,然後選擇「透過以下通訊埠預覽:8080」。
稍候片刻,您應該會看到結果:
5. 擷取密鑰
您可以使用 @Value
註解,使用 sm://
前置字串參照密鑰屬性。
在 HelloSecretController 類別中,使用註解插入 greeting
值:
src/main/java/com/example/demo/HelloSecretController.java
import org.springframework.beans.factory.annotation.Value;
...
@RestController
public class HelloSecretController {
@Value("${sm://greeting}")
String greeting;
...
}
您可以使用 Spring Boot 外掛程式正常啟動 Spring Boot 應用程式。讓我們略過本研究室的測試:
$ ./mvnw -DskipTests spring-boot:run
應用程式啟動後,請點選 Cloud Shell 工具列中的「網頁預覽」圖示 ,然後選擇「透過以下通訊埠預覽:8080」。
稍候片刻,您應該會看到結果:
您也可以將這個值對應至 application.properties
中的屬性:
src/main/resources/application.properties
greeting=${sm://greeting}
在 HelloSecretController 中,您可以參照這個較一般的屬性名稱,而非 Secret Manager 名稱:
src/main/java/com/example/demo/HelloSecretController.java
@RestController
public class HelloSecretController {
@Value("${greeting}")
String greeting;
...
}
您可以使用 Spring Boot 外掛程式正常啟動 Spring Boot 應用程式。讓我們略過本研究室的測試:
$ ./mvnw -DskipTests spring-boot:run
應用程式啟動後,請點選 Cloud Shell 工具列中的「網頁預覽」圖示 ,然後選擇「透過以下通訊埠預覽:8080」。
更新密鑰值
使用 sm://greeting
短語法可讓您自動使用最新版的密鑰。建立新的密鑰版本後,您就可以在不變更程式碼的情況下更新應用程式。
新增版本以更新密鑰值:
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
重新啟動應用程式,然後查看系統傳回新版密鑰。
延伸這個概念
假如您使用不同的 Spring Boot 應用程式設定檔,就特別適合採用這項技巧。例如,您可以建立 greeting-dev
、greeting-staging
、greeting-prod
等密鑰。並在每個設定檔中對應到正確的問候語。
建立 greeting-prod
密鑰:
$ echo -n "Hola" | \ gcloud secrets create greeting-prod \ --data-file=- --replication-policy=automatic
建立 application-prod.properties
檔案:
src/main/resources/application-prod.properties
greeting=${sm://greeting-prod}
您可以使用 Spring Boot 外掛程式正常啟動 Spring Boot 應用程式,也可以使用 prod
設定檔。讓我們略過本研究室的測試:
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod
應用程式啟動後,請點選 Cloud Shell 工具列中的「網頁預覽」圖示 ,然後選擇「透過以下通訊埠預覽:8080」。
稍候片刻,您應該會看到結果:
6. 摘要
在本研究室中,您已建立一項服務,可以使用儲存在 Secret Manager 中的密鑰設定服務,方法是使用前置字串為 sm://
的 Spring 屬性名稱,並插入 applications.properties
檔案和 @Value
註解中的值。
7. 恭喜!
您已瞭解如何在 Java 中使用 Secret Manager API。
瞭解詳情
- Spring on GCP 專案:http://cloud.spring.io/spring-cloud-gcp/
- GCP GitHub 存放區的 Spring:https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- 在 Google Cloud 中使用 Java:https://cloud.google.com/java/
- 控管 Secret Manager 中的密鑰存取權:https://cloud.google.com/secret-manager/docs/access-control
- Secret Manager 中的稽核記錄:https://cloud.google.com/secret-manager/docs/audit-logging
授權
這項內容採用的是創用 CC 姓名標示 2.0 通用授權。