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

1. ภาพรวม

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

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

ในโค้ดแล็บนี้ คุณจะจัดเก็บข้อมูลลับใน Secret Manager จากนั้นสร้างไมโครเซอร์วิส Spring Boot อย่างง่ายและเรียกข้อมูลลับ

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

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

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

  • โปรเจ็กต์ Google Cloud
  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • คุ้นเคยกับโปรแกรมแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, EMAC หรือ 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 ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้

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

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

Google Cloud Shell

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

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

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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

ในไฟล์ src/main/resources/application.properties ให้เพิ่มการกำหนดค่าต่อไปนี้เพื่อเปิดใช้ Spring Boot Config Data API

spring.config.import=sm://

ซึ่งจะกำหนดค่าแหล่งที่มาของพร็อพเพอร์ตี้ Spring เพื่อให้คุณอ้างอิงถึงข้อมูลลับได้โดยใช้ค่าพร็อพเพอร์ตี้ที่มีคำนำหน้าเป็น sm:// เช่น 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/

ข้ามการทดสอบสำหรับ Lab นี้ แล้วเริ่มแอปพลิเคชันกันเลย

$ ./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;Hello World!&quot;

นอกจากนี้ คุณยังแมปค่ากับพร็อพเพอร์ตี้ใน 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=-

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

ภาพหน้าจอของแอปพลิเคชันที่กำลังทำงาน ซึ่งแสดงข้อความ &quot;สวัสดีชาวโลก!&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 แล้ว

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป