Bảo vệ ứng dụng Spring Boot

springboot được dùng để bảo vệ ứng dụng Spring Boot, có thể xử lý BOOT-INF/classes, BOOT-INF/lib, Spring Boot Loader và việc quét các framework.

1. Thao tác qua giao diện GUI

  1. Chọn Spring Boot trên trang loại ứng dụng.

    Chọn Spring Boot

  2. Chọn ứng dụng Spring Boot cần bảo vệ, Phiên bản Java đi kèm và nền tảng đích, sau đó chọn chế độ đơn giản hoặc chế độ nâng cao.

    Chọn đầu vào, phiên bản Java, nền tảng đích và chế độ

  3. Khi sử dụng chế độ nâng cao, hãy chọn cấu hình đầu ra, các JAR phụ thuộc cần bảo vệ, JavaFX, tham số JVM và quy tắc loại trừ tùy theo nhu cầu; chế độ đơn giản sẽ tự động đề xuất cấu hình đầu ra và các mục cần loại trừ dựa trên kết quả quét tương thích. Ý nghĩa của từng tùy chọn được giải thích trong Cài đặt chế độ nâng cao của Protector4J.

    Cấu hình các tham số nâng cao của Spring Boot

  4. Chọn thư mục đầu ra, kiểm tra tóm tắt các tham số, sau đó nhấn Run protection.

    Chọn thư mục xuất ra và thực hiện việc bảo vệ

2. Ví dụ sử dụng CLI

Lệnh tối thiểu:

p4j springboot app.jar dist

Sử dụng bố cục mặc định là p4jx-fat. Chọn bố cục khác một cách rõ ràng:

p4j springboot app.jar dist --layout fat
p4j springboot app.jar dist --layout separate

Bảo vệ có chọn lọc:

p4j springboot app.jar dist \
  --protect 'com.example.service.impl.**' \
  --exclude 'com.example.dto.**,com.example.config.**'

3. Cấu trúc và bố cục đầu ra

p4jx-fat: Mặc định, lưu trữ một ứng dụng được bảo vệ duy nhất

dist/
├── app.p4jx              # Khi dùng hậu tố jar, tên tệp sẽ là app.jar
├── vlxjre/
├── run.sh
├── run.command
└── run.bat

Đặc điểm:

  • Được cung cấp dưới dạng lưu trữ từ một ứng dụng P4JX duy nhất;
  • Các tệp vật lý mặc định không phải dạng ZIP;
  • Các tài nguyên Spring Boot, phụ thuộc nhúng và metadata được cung cấp thông qua giao diện JAR ảo;
  • Có mức độ bảo vệ cao nhất, phù hợp với các ứng dụng không có phụ thuộc vào bộ quét classpath của bên thứ ba.

fat: Cấu trúc tương thích với Spring Boot

dist/
├── app.jar
├── app.p4jx              # Khi dùng hậu tố jar, tên tệp sẽ là app-protected.jar
├── vlxjre/
└── run.*

Đặc điểm:

  • app.jar giữ nguyên cấu trúc vật lý tiêu chuẩn của BOOT-INF;
  • Phiên bản thực sự của lớp được bảo vệ nằm trong tập tin P4JX kế bên;
  • Phù hợp với các ứng dụng yêu cầu quét cấu trúc JAR vật lý của Spring Boot như ClassGraph, Reflections, v.v.;
  • Hai tập tin này có mối liên kết chặt chẽ, cần được cập nhật và giao hàng cùng nhau.

separate:Bố cục tách biệt tương thích

dist/
├── plain-launcher.jar
├── app.p4jx
├── lib/
├── vlxjre/
└── run.*

Đặc điểm:

  • Tách Spring Boot Loader, các lớp công khai và phụ thuộc ra khỏi nhau;
  • Phù hợp với các môi trường tích hợp cũ yêu cầu đường dẫn lớp dạng phẳng lib/*;
  • Các lớp cần được bảo vệ sẽ được trình khởi tạo được tạo ra tải sẵn trước;
  • Các dự án mới nên ưu tiên sử dụng p4jx-fat hoặc fat được máy quét đề xuất.

Cách chọn bố cục

Các tình huống sử dụngCách bố trí được khuyến nghị
Dịch vụ Spring Boot thông thườngp4jx-fat
Ứng dụng thực tế gọi các công cụ quét như ClassGraph, Reflections, v.v.fat
Khi cần sử dụng thư mục phụ thuộc bên ngoài dạng phẳng, hoặc cần mã hóa riêng các tệp phụ thuộcseparate
Chưa chắc chắnHãy thực thi --compat-scan trước

ZIP overlay chỉ hỗ trợ các công cụ đọc trực tiếp thư mục trung tâm của ZIP, không thể thay thế cấu trúc Spring Boot vật lý cần thiết cho các công cụ quét ClassLoader/classpath.

4. Khởi động

./run.sh --spring.profiles.active=prod

Windows:

run.bat --spring.profiles.active=prod

Đừng sử dụng JRE của hệ thống thay thế cho vlxjre trong thư mục đầu ra.

Các tham số khởi động JVM

Khi đóng gói, có thể cố định các tham số JVM thông qua JVM startup options trong giao diện GUI (một tham số mỗi dòng) hoặc qua CLI:

p4j springboot app.jar dist \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

Thêm vào tạm thời khi triển khai:

APP_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" ./run.sh

Cũng có thể chỉnh sửa trực tiếp script triển khai hiện tại:

  • macOS/Linux: Thêm JVM_OPTS+=("-Xms1g" "-Xmx2g") sau các tệp JVM_OPTS=(...)/JVM_OPTS+=(...) đã được tạo ra tại run.sh.
  • Windows: Thêm set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g" sau các tệp set "JVM_OPTS=..." đã được tạo ra tại run.bat.

Đừng xóa các tham số nội bộ tự tạo như --add-opens, module path do Spring Boot hoặc JavaFX tạo ra. Việc đóng gói lại sẽ ghi đè lên các thay đổi thủ công; chi tiết xem tại Cấu hình tham số khởi động JVM.

5. Phạm vi bảo vệ

Bảo vệ mặc định các lớp ứng dụng dưới BOOT-INF/classes. Nên giữ các lớp hướng Spring sau làm lớp thông thường:

  • @Controller, @RestController, @ControllerAdvice;
  • @Configuration, các lớp cấu hình tự động, các lớp được tăng cường bằng AOT/CGLIB;
  • Jackson DTO, JPA Entity, record và các mô hình kiểm tra;
  • Điểm vào ứng dụng và các lớp được framework tạo ra/trực tiếp đại diện;
  • Các lớp cần được tăng cường mã byte thời chạy.

Bảo vệ các implementation dịch vụ, truy cập thông qua facade hoặc interface công khai. Quy tắc hỗ trợ tên lớp chính xác, pkg.*pkg.**.

6. Bảo vệ các JAR phụ thuộc

--protect-lib có thể bảo vệ các phụ thuộc BOOT-INF/lib tương ứng, hỗ trợ cả ba kiểu bố trí:

p4j springboot app.jar dist \
  --protect-lib 'company-core-*.jar,pricing-*.jar'

Chỉ bảo vệ các phụ thuộc nguồn mã đóng riêng. Đừng mã hóa các gói framework bên thứ ba như Spring, Tomcat, công cụ ghi nhật ký, trình điều khiển cơ sở dữ liệu vì “Bảo vệ nhiều hơn nữa”.

7. quét khả năng tương thích

p4j springboot app.jar --compat-scan
p4j springboot app.jar dist --compat-apply

Hai tùy chọn này không thể sử dụng đồng thời, sự khác biệt giữa chúng là:

Tùy chọnHành viKhi nào nên sử dụng
--compat-scanChỉ quét tập tin JAR đầu vào, in ra các mối nguy cơ và gợi ý cấu hình rồi thoát; không mã hóa, không tạo ra dist, vì vậy không cần thư mục đầu raSử dụng công cụ này để xem báo cáo sau khi lần đầu tiên bảo vệ ứng dụng, nâng cấp Spring Boot hoặc các phụ thuộc khác, điều chỉnh phạm vi bảo vệ hoặc bố cục, cũng như khi khắc phục các vấn đề về tính tương thích.
--compat-applyCông cụ này sẽ tự động kết hợp các khuyến nghị thận trọng sau khi quét, sau đó tiếp tục lập trình và tạo ra kết quả đầu ra; vì vậy cần phải chỉ định thư mục đầu ra.Sử dụng công cụ này để hoàn tất việc đóng gói sau khi đã đọc kết quả quét và chấp nhận các khuyến nghị tự động; nó cũng có thể được dùng cho các lần xây dựng lặp lại với các quy tắc đã được kiểm tra hoặc trong quy trình CI.

Đối với springboot--compat-apply, có thể chọn bố cục dựa trên kết quả quét, thêm các lớp loại trừ, và điều chỉnh các tùy chọn như ZIP overlay, JavaFX và phần mở rộng tệp sau khi nén. Đối với các tùy chọn ngoài các lớp loại trừ, giá trị được chỉ định rõ ràng trong dòng lệnh sẽ có ưu tiên; các lớp loại trừ được đề xuất sẽ được kết hợp mặc định với --exclude. Nếu không muốn thêm các lớp loại trừ tự động, có thể đồng thời sử dụng --no-compat-excludes. Công cụ quét chỉ thực hiện phân tích heuristic tĩnh, những vấn đề đòi hỏi sửa đổi mã nguồn sẽ không được --compat-apply tự động sửa chữa; vẫn cần tiến hành kiểm thử tái hiện trên nền tảng mục tiêu sau khi tạo ra sản phẩm.

Để biết thêm về các lệnh CLI khác, tất cả các tùy chọn, biến môi trường và ví dụ tự động hóa, vui lòng tham khảo Tham khảo tham số CLI.