การดึงข้อมูลเข้าสู่ระบบ/ข้อมูลลับจาก Secret Manager ด้วย Spring Boot

1. ภาพรวม

ซึ่งข้อมูลลับต่างๆ เช่น รหัสผ่าน คีย์ API คือข้อมูลที่ละเอียดอ่อนที่ควรเก็บไว้ในพื้นที่เก็บข้อมูลที่เข้ารหัสและปลอดภัย มีการควบคุมการเข้าถึง และตรวจสอบได้ บางระบบอาจเลือกใช้ห้องนิรภัยเพื่อจัดเก็บข้อมูลลับเหล่านี้ ใน Google Cloud คุณสามารถใช้ Secret Manager ซึ่งเป็นบริการที่มีการจัดการเพื่อจัดเก็บข้อมูลลับอย่างปลอดภัยและควบคุมการเข้าถึงข้อมูลลับเฉพาะโดยใช้ IAM

ใน Spring Boot คุณสามารถใช้ Spring Cloud GCP เพื่อเข้าถึงข้อมูลลับเหล่านี้ได้ง่ายๆ โดยอ้างถึงข้อมูลลับว่าเป็นพร็อพเพอร์ตี้อื่นๆ ของ Spring

ใน Codelab นี้ คุณจะจัดเก็บข้อมูลลับใน Secret Manager จากนั้นสร้าง Microservice สำหรับการเปิดเครื่อง Spring Boot แบบง่ายและเรียกข้อมูลลับ

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างแอปพลิเคชัน Spring Boot Java และกำหนดค่า Secret Manager

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud
  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • คุ้นเคยกับเครื่องมือแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, EMACs หรือ Nano

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านเท่านั้น อ่านและทำแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอป HTML/CSS อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

คุณจะให้คะแนนความพึงพอใจในการใช้บริการ Google Cloud อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมในแบบของคุณ

  1. ลงชื่อเข้าใช้ Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีคนใช้แล้ว และจะใช้ไม่ได้ ขออภัย) และจะมีการอ้างอิงใน Codelab ว่า PROJECT_ID ในภายหลัง

  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี ตรวจสอบว่าคุณได้ทำตามวิธีการใน "การล้างข้อมูล" ซึ่งจะแนะนำคุณเกี่ยวกับวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

Google Cloud Shell

แม้ว่าบริการของ Google Cloud จะทำงานจากระยะไกลได้จากแล็ปท็อป แต่ใน Codelab นี้ เราจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

เปิดใช้งาน Cloud Shell

  1. คลิกเปิดใช้งาน Cloud Shell กริ๊งๆๆๆ จาก Cloud Console

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

หากคุณไม่เคยเริ่มต้นใช้งาน Cloud Shell มาก่อน คุณจะเห็นหน้าจอตรงกลาง (ครึ่งหน้าล่าง) ซึ่งอธิบายว่านี่คืออะไร หากเป็นเช่นนั้น ให้คลิกดำเนินการต่อ (คุณจะไม่เห็นการดำเนินการนี้อีก) หน้าจอแบบครั้งเดียวมีลักษณะดังนี้

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

การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์หรือ Chromebook เท่านั้น

เมื่อเชื่อมต่อกับ Cloud Shell คุณควรเห็นว่าได้รับการตรวจสอบแล้ว และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว

  1. เรียกใช้คำสั่งต่อไปนี้ใน 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. สร้างบริการ REST สำหรับ Spring Boot ใหม่

หลังจากเปิดตัว Cloud Shell แล้ว คุณจะใช้บรรทัดคำสั่งเพื่อสร้างแอปพลิเคชัน Spring Boot ใหม่ด้วย 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

ใน pom.xml ให้เพิ่มทรัพยากร Dependency เริ่มต้นของ GCP ระบบคลาวด์ Spring:

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:// เช่น sm://greeting ได้

ดูรายละเอียดเพิ่มเติมเกี่ยวกับรูปแบบของพร็อพเพอร์ตี้ได้จากเอกสารประกอบเกี่ยวกับ Secret Manager ของ GCP สำหรับ Cloud ในฤดูใบไม้ผลิ โปรดทราบว่าข้อกำหนดของ application.properties เป็นข้อกำหนดใหม่ใน GCP เวอร์ชัน 4.x ของ Spring Cloud อ่านรายละเอียดเพิ่มเติมในคำแนะนำในการย้ายข้อมูล

สร้างตัวควบคุม 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

เมื่อเริ่มแอปพลิเคชันแล้ว ให้คลิกไอคอน "แสดงตัวอย่างเว็บ" e18df08334f0d809.png ในแถบเครื่องมือ Cloud Shell แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080

หลังจากนั้นไม่นาน คุณจะเห็นผลลัพธ์:

1e9a7884ff113c14.png

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

เมื่อเริ่มแอปพลิเคชันแล้ว ให้คลิกไอคอน "แสดงตัวอย่างเว็บ" e18df08334f0d809.png ในแถบเครื่องมือ Cloud Shell แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080

หลังจากนั้นไม่นาน คุณจะเห็นผลลัพธ์:

ภาพหน้าจอของแอปพลิเคชันที่กำลังทำงาน แสดงคำว่า &quot;สวัสดีทุกคน&quot;

คุณยังแมปค่ากับพร็อพเพอร์ตี้ใน application.properties ได้ด้วย โดยทำดังนี้

src/main/resources/application.properties

greeting=${sm://greeting}

ใน HelloSecretController คุณอ้างอิงถึงชื่อพร็อพเพอร์ตี้ทั่วไปนี้ได้ ซึ่งต่างจากชื่อผู้จัดการข้อมูลลับดังนี้

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=-

โปรดรีสตาร์ทแอปพลิเคชันและดูว่าระบบกำลังแสดงผลข้อมูลลับเวอร์ชันใหม่

ภาพหน้าจอของแอปพลิเคชันที่ทำงานอยู่ โดยแสดง &quot;Greeings World!&quot;

การขยายแนวคิดนี้

เทคนิคนี้มีประโยชน์โดยเฉพาะในกรณีที่คุณใช้โปรไฟล์แอปพลิเคชัน 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

หลังจากนั้นไม่นาน คุณจะเห็นผลลัพธ์:

ภาพหน้าจอของแอปพลิเคชันที่ทำงานอยู่ แสดง &quot;Hola World!&quot;

6. สรุป

ในห้องทดลองนี้ คุณสร้างบริการที่สามารถกำหนดค่าได้โดยใช้ข้อมูลลับที่เก็บไว้ใน Secret Manager โดยใช้ชื่อพร็อพเพอร์ตี้ของ Spring นำหน้าด้วย sm:// และแทรกค่าจากไฟล์ applications.properties และคำอธิบายประกอบ @Value

7. ยินดีด้วย

คุณเรียนรู้วิธีใช้ Secret Manager API ใน Java แล้ว

ดูข้อมูลเพิ่มเติม

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0