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

Những thông tin bí mật như mật khẩu, khoá API là thông tin nhạy cảm phải được lưu trữ trong một bộ nhớ được mã hoá, an toàn, có thể kiểm soát quyền truy cập và có thể kiểm tra. 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 (dịch vụ được quản lý) để lưu trữ bí mật một cách an toàn và kiểm soát quyền truy cập vào các bí mật riêng lẻ bằng IAM.

Trong Spring Boot, bạn có thể sử dụng Spring Cloud GCP để dễ dàng truy cập vào những bí mật này bằng cách tham chiếu đến chúng như 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 khoá bí mật trong Trình quản lý bí mật, sau đó tạo các dịch vụ vi mô Spring Boot đơn giản và truy xuất khoá bí mật đó.

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

  • Cách tạo ứng dụng Java khởi động mùa xuân và định cấu hình Trình quản lý bí mật.

Bạn cần có

  • Một dự án trong Google Cloud
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Quen thuộc với các trình soạn thảo văn bản tiêu chuẩn của Linux như Vim, EMAC hoặc Nano

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

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

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

Người mới tập Trung cấp Thành thạo

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

Người mới tập 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 tiến độ riêng

  1. Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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

Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT_ID.

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

Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài 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í 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 trong Đám mây.

Kích hoạt Cloud Shell

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

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Nếu trước đây chưa từng khởi động Cloud Shell, bạn sẽ được trình bày một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:

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

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện 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 mình đã được xác thực và dự án đã được đặt thành mã dự á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

Kết quả 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

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể đặt chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Định cấu hình Khoá bí mật

Để sử dụng Secret Manager (Trình quản lý bí mật), trước tiên hãy bật API này:

$ gcloud services enable secretmanager.googleapis.com

Sau đó, hãy tạo một khoá bí mật có tên 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, xác định tên tệp cho đối số --data-file.

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

$ gcloud secrets list

4. Tạo dịch vụ REST khởi động mùa xuân mới

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

Trong pom.xml, hãy thêm phần phụ thuộc cho người khởi động của 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>

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

spring.config.import=sm://

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

Hãy xem tài liệu về Trình quản lý bí mật của Spring Cloud GCP để biết thêm thông tin về định dạng của tài sản. Xin lưu ý rằng yêu cầu về 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 trình điều khiển REST mới bằng cách thêm 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 theo đúng phiên bản JDK:

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

Hãy bỏ qua các xét nghiệm cho phòng thí nghiệm này và khởi động ứ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.pngtrong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

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

1e9a7884ff113c14.pngS

5. Truy xuất Khoá bí mật

Bạn có thể sử dụng chú giải @Value để tham chiếu đến thuộc tính bí mật bằng cách sử dụ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 thử nghiệm 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.pngtrong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

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

Ảnh chụp màn hình ứng dụng đang chạy, có dòng chữ &quot;Hello World!&quot; (Xin chào thế giới!)

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 hơn này thay vì tên của Người quản lý bí mật:

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 thử nghiệm 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 Bản xem trước trên webtrong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

Đang cập nhật giá trị của khoá bí mật

Bằng cách sử dụng cú pháp ngắn sm://greeting, bạn sẽ tự động sử 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 mã thông báo bí mật, bạn có thể cập nhật ứng dụng của mình mà không cần thay đổi mã.

Cập nhật giá trị của mã 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 nhiều hồ sơ ứng dụng Spring Boot. Ví dụ: bạn có thể tạo các khoá bí mật, chẳng hạn như greeting-dev, greeting-staging, greeting-prod. Và trong mỗi hồ sơ, hãy ánh xạ đến lời chào phù hợp.

Tạo khoá bí mật cho 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 bằng cấu hình prod. Hãy bỏ qua các thử nghiệm 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 bản xem trước trên webtrong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

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

Ảnh chụp màn hình ứng dụng đang chạy, cho thấy &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ể định cấu hình bằng các khoá bí mật được lưu trữ trong Trình quản lý bí mật bằng cách sử dụng tên thuộc tính của Spring có tiền tố là sm:// rồi chèn giá trị từ tệp applications.properties và chú giải @Value.

7. Xin chúc mừng!

Bạn đã tìm hiểu cách sử dụng Secret Manager API (API Trình quản lý bí mật) 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 chung Ghi nhận tác giả Creative Commons 2.0.