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?
Bạn đánh giá thế nào về kinh nghiệm xây dựng ứng dụng web HTML/CSS?
Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đă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.)
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
.
- 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
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell .
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:
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
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.
- 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 trong 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ả:
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 trong 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ả:
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 trong 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ề.
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 trong 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ả:
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
- Dự án Spring trên GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring trên kho lưu trữ GitHub của GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java trên Google Cloud: https://cloud.google.com/java/
- Kiểm soát quyền truy cập vào giá trị bí mật trong Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Ghi nhật ký kiểm tra trong Trình quản lý bí mật: https://cloud.google.com/secret-manager/docs/audit-logging
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.