Truy xuất thông tin xác thực/bí mật từ Trình quản lý bí mật bằng Spring Boot

1. Tổng quan

Các thông tin bí mật như mật khẩu, khoá API là thông tin nhạy cảm cần được lưu trữ trong một bộ nhớ được mã hoá và bảo mật, có quyền truy cập được kiểm soát và có thể kiểm tra được. Một số hệ thống chọn sử dụng Vault để lưu trữ các khoá bí mật này. Trên Google Cloud, bạn có thể sử dụng Secret Manager (một dịch vụ được quản lý) để lưu trữ các dữ liệu bí mật một cách an toàn và kiểm soát quyền truy cập vào từng dữ liệu bí mật bằng IAM.

Trong Spring Boot, bạn có thể sử dụng Spring Cloud GCP để dễ dàng truy cập vào các khoá bí mật này bằng cách tham chiếu chúng dưới dạng bất kỳ thuộc tính Spring nào khác.

Trong lớp học lập trình này, bạn sẽ lưu trữ một bí mật trong Secret Manager, sau đó tạo các vi dịch vụ Spring Boot đơn giản và truy xuất bí mật đó.

Kiến thức bạn sẽ học được

  • Cách tạo ứng dụng Java Spring Boot và định cấu hình Secret Manager.

Bạn cần có

  • Một dự án trên Google Cloud
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Làm quen với các trình chỉnh sửa văn bản tiêu chuẩn của Linux, chẳng hạn như Vim, EMAC hoặc Nano

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm xây dựng ứng dụng web HTML/CSS?

Người mới bắt đầu Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm khi sử dụng các dịch vụ của Google Cloud?

Người mới bắt đầu Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc G Suite, bạn phải tạo một tài khoản.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Hãy nhớ mã dự án, một tên duy nhất trên tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.

  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.

Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.

Google Cloud Shell

Mặc dù bạn có thể vận hành các dịch vụ của Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:

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

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này chỉ bằng một trình duyệt hoặc Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Đầu ra của lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

3. Định cấu hình một Secret

Để sử dụng Secret Manager, trước tiên hãy bật API này:

$ gcloud services enable secretmanager.googleapis.com

Sau đó, hãy tạo một mã bí mật có tên là greeting, với giá trị là Hello:

$ echo -n "Hello" | \
 gcloud secrets create greeting \
 --data-file=-

Lệnh này sử dụng STDIN để cung cấp giá trị cho dòng lệnh. Tuy nhiên, bạn cũng có thể chỉ cần đặt giá trị bí mật vào một tệp và chỉ định tên tệp cho đối số --data-file.

Bạn có thể liệt kê tất cả các khoá bí mật bằng giao diện dòng lệnh gcloud:

$ gcloud secrets list

4. Tạo một Dịch vụ REST Spring Boot mới

Sau khi Cloud Shell khởi chạy, bạn có thể sử dụng dòng lệnh để tạo một ứng dụng Spring Boot mới bằng 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

Trong pom.xml, hãy thêm phần phụ thuộc của 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>

Trong tệp src/main/resources/application.properties, hãy thêm cấu hình sau để bật API dữ liệu cấu hình Spring Boot:

spring.config.import=sm://

Thao tác này sẽ định cấu hình Nguồn thuộc tính Spring để bạn có thể tham chiếu đến các khoá bí mật bằng cách sử dụng giá trị thuộc tính, với tiền tố là sm://, ví dụ: sm://greeting.

Hãy xem tài liệu về Spring Cloud GCP Secret Manager để biết thêm thông tin chi tiết về định dạng của thuộc tính này. Xin lưu ý rằng yêu cầu application.properties là yêu cầu mới trong Spring Cloud GCP 4.x. Đọc thêm thông tin chi tiết trong hướng dẫn di chuyển.

Tạo một bộ điều khiển REST mới bằng cách thêm một tệp lớp mới:

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!";
  }
}

Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot.

Đảm bảo JAVA_HOME được đặt thành phiên bản JDK chính xác:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Hãy bỏ qua các bài kiểm thử cho lớp học lập trình này và bắt đầu ứng dụng:

$ ./mvnw -DskipTests spring-boot:run

Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web e18df08334f0d809.png trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

Sau một thời gian chờ ngắn, bạn sẽ thấy kết quả:

1e9a7884ff113c14.png

5. Truy xuất một giá trị bí mật

Bạn có thể dùng chú giải @Value để tham chiếu đến thuộc tính bí mật bằng tiền tố sm://.

Trong lớp HelloSecretController, hãy chèn giá trị greeting bằng chú giải:

src/main/java/com/example/demo/HelloSecretController.java

import org.springframework.beans.factory.annotation.Value;

...

@RestController
public class HelloSecretController {
  @Value("${sm://greeting}")
  String greeting;

  ...
}

Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot. Hãy bỏ qua các bài kiểm tra cho phòng thí nghiệm này:

$ ./mvnw -DskipTests spring-boot:run

Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web e18df08334f0d809.png trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

Sau một thời gian chờ ngắn, bạn sẽ thấy kết quả:

Ảnh chụp màn hình ứng dụng đang chạy, cho thấy dòng chữ &quot;Hello World!&quot;

Bạn cũng có thể liên kết giá trị với một thuộc tính trong application.properties:

src/main/resources/application.properties

greeting=${sm://greeting}

Trong HelloSecretController, bạn có thể tham chiếu đến tên thuộc tính chung chung này thay vì tên Secret Manager:

src/main/java/com/example/demo/HelloSecretController.java

@RestController
public class HelloSecretController {
  @Value("${greeting}")
  String greeting;
  ...
}

Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot. Hãy bỏ qua các bài kiểm tra cho phòng thí nghiệm này:

$ ./mvnw -DskipTests spring-boot:run

Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web Biểu tượng Xem trước trên web trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

Cập nhật giá trị bí mật

Khi sử dụng cú pháp ngắn sm://greeting, bạn sẽ tự động dùng phiên bản mới nhất của khoá bí mật. Bằng cách tạo một phiên bản mới của khoá bí mật, bạn có thể cập nhật ứng dụng mà không cần thay đổi mã.

Cập nhật giá trị của khoá bí mật bằng cách thêm một phiên bản mới:

$ echo -n "Greetings" |
 gcloud secrets versions add greeting \
 --data-file=-

Khởi động lại ứng dụng và xem phiên bản mới của khoá bí mật đang được trả về.

Ảnh chụp màn hình ứng dụng đang chạy, cho thấy &quot;Greeings World!&quot;

Mở rộng khái niệm này

Kỹ thuật này đặc biệt hữu ích nếu bạn sử dụng các hồ sơ ứng dụng Spring Boot khác nhau. Ví dụ: bạn có thể tạo các khoá bí mật như greeting-dev, greeting-staging, greeting-prod. Và trong mỗi hồ sơ, hãy liên kết với lời chào phù hợp.

Tạo một khoá bí mật greeting-prod:

$ echo -n "Hola" | \
 gcloud secrets create greeting-prod \
 --data-file=- --replication-policy=automatic

Tạo tệp application-prod.properties:

src/main/resources/application-prod.properties

greeting=${sm://greeting-prod}

Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot, nhưng với hồ sơ prod. Hãy bỏ qua các bài kiểm tra cho phòng thí nghiệm này:

$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod

Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web Biểu tượng xem trước trên web trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

Sau một thời gian chờ ngắn, bạn sẽ thấy kết quả:

Ảnh chụp màn hình ứng dụng đang chạy, cho thấy dòng chữ &quot;Hola World!&quot;

6. Tóm tắt

Trong phòng thí nghiệm này, bạn đã tạo một dịch vụ có thể được định cấu hình bằng cách sử dụng các khoá bí mật được lưu trữ trong Secret Manager bằng cách sử dụng tên thuộc tính của Spring có tiền tố là sm:// và chèn giá trị từ tệp applications.properties và chú thích @Value.

7. Xin chúc mừng!

Bạn đã tìm hiểu cách sử dụng Secret Manager API trong Java.

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.