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

springboot bảo vệ ứng dụng Spring Boot và xử lý BOOT-INF/classes, BOOT-INF/lib, bộ nạp Spring Boot cùng việc quét framework.

1. Thao tác trên giao diện đồ họa

  1. Ở trang loại ứng dụng, chọn Spring Boot.

    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à các nền tảng mục tiêu, rồi chọn chế độ đơn giản hoặc nâng cao.

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

  3. Ở chế độ nâng cao, hãy chọn bố trí đầu ra, các JAR phụ thuộc cần bảo vệ, cấu hình JavaFX, tùy chọn khởi chạy JVM và quy tắc loại trừ. Chế độ đơn giản suy ra bố trí và các mục loại trừ từ lượt quét tương thích. Ý nghĩa từng tùy chọn xem tại Thiết lập chế độ nâng cao của Protector4J.

    Thiết lập tùy chọn nâng cao cho Spring Boot

  4. Chọn thư mục xuất, xem lại phần tóm tắt rồi bấm Chạy bảo vệ.

    Chọn thư mục xuất và chạy bảo vệ

2. Ví dụ dòng lệnh

Dạng ngắn nhất:

p4j springboot app.jar dist

Mặc định dùng bố trí p4jx-fat. Để chọn rõ một bố trí khác:

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

Chỉ bảo vệ một phần ứng dụng:

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

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

p4jx-fat: bố trí mặc định, một kho lưu trữ đã bảo vệ duy nhất

dist/
├── app.p4jx              # thành app.jar khi dùng hậu tố jar
├── vlxjre/
├── run.sh
├── run.command
└── run.bat

Đặc điểm:

  • toàn bộ ứng dụng được bàn giao dưới dạng một kho lưu trữ P4JX;
  • tệp vật lý mặc định không phải là ZIP;
  • tài nguyên Spring Boot, các phụ thuộc lồng nhau và siêu dữ liệu được cung cấp qua khung nhìn JAR ảo;
  • phạm vi bảo vệ rộng nhất, hợp với ứng dụng không phụ thuộc vào trình quét classpath bên thứ ba.

fat: bố trí tương thích Spring Boot

dist/
├── app.jar
├── app.p4jx              # thành app-protected.jar khi dùng hậu tố jar
├── vlxjre/
└── run.*

Đặc điểm:

  • app.jar giữ nguyên cấu trúc vật lý chuẩn của BOOT-INF;
  • phần cài đặt thật của các lớp được bảo vệ nằm trong kho lưu trữ P4JX ngay bên cạnh;
  • hợp với ứng dụng cần quét cấu trúc vật lý của JAR Spring Boot, chẳng hạn khi dùng ClassGraph hay Reflections;
  • hai tệp phụ thuộc lẫn nhau, phải cập nhật và bàn giao cùng nhau.

separate: bố trí tương thích tách rời

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

Đặc điểm:

  • bộ nạp Spring Boot, các lớp không được bảo vệ và các phụ thuộc được để riêng;
  • hợp với môi trường tích hợp cũ đòi hỏi classpath phẳng lib/*;
  • trình khởi chạy sinh ra sẽ nạp trước các lớp được bảo vệ;
  • dự án mới nên ưu tiên p4jx-fat, hoặc chọn giữa p4jx-fatfat theo khuyến nghị của trình quét.

Cách chọn bố trí

Tình huốngBố trí khuyến nghị
Dịch vụ Spring Boot thông thườngp4jx-fat
Ứng dụng thật sự dùng trình quét như ClassGraph hoặc Reflectionsfat
Cần thư mục phụ thuộc bên ngoài dạng phẳng, hoặc mã hóa riêng từng tệp phụ thuộcseparate
Chưa chắc chắnChạy --compat-scan trước

Lớp phủ ZIP chỉ giúp được những công cụ đọc thẳng thư mục trung tâm của ZIP. Nó không thay thế cấu trúc Spring Boot vật lý mà ClassLoader và trình quét classpath cần đến.

4. Khởi chạy

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

Trên Windows:

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

Đừng thay thư mục vlxjre trong đầu ra bằng JRE của hệ thống.

Khi đóng gói cho Windows, bạn còn có thể tạo thêm trình khởi chạy gốc. Nó dùng được với cả ba bố trí và tồn tại song song với các tập lệnh khởi chạy — xem Tạo trình khởi chạy EXE Windows.

Tùy chọn khởi chạy JVM

Bạn có thể cố định tùy chọn ngay khi đóng gói, bằng cách nhập mỗi dòng một tùy chọn ở mục Tùy chọn khởi chạy JVM trên giao diện, hoặc chỉ định trên dòng lệnh:

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

Để thêm tùy chọn cho một lần chạy của gói đã triển khai:

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

Bạn cũng có thể sửa thẳng tập lệnh đã triển khai:

  • macOS và Linux: trong run.sh, thêm JVM_OPTS+=("-Xms1g" "-Xmx2g") sau các dòng JVM_OPTS=(...)JVM_OPTS+=(...) đã sinh.
  • Windows: trong run.bat, thêm set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g" sau dòng set "JVM_OPTS=..." đã sinh.

Đừng xóa những tùy chọn mà trình đóng gói sinh ra cho Spring Boot hay JavaFX, chẳng hạn --add-opens và đường dẫn mô-đun. Đóng gói lại sẽ ghi đè mọi sửa đổi thủ công — chi tiết xem Tùy chọn khởi chạy JVM.

5. Phạm vi bảo vệ

Mặc định các lớp ứng dụng nằm dưới BOOT-INF/classes được bảo vệ. Những lớp gắn với Spring sau đây thường nên để không bảo vệ:

  • lớp @Controller, @RestController@ControllerAdvice;
  • lớp @Configuration, lớp tự động cấu hình và lớp được AOT hoặc CGLIB bổ sung;
  • DTO của Jackson, thực thể JPA, record và mô hình kiểm tra dữ liệu;
  • điểm vào của ứng dụng và mọi lớp mà framework trực tiếp tạo hoặc bọc proxy;
  • lớp cần bổ sung bytecode lúc chạy.

Hãy bảo vệ phần cài đặt của các service và truy cập chúng qua facade hoặc giao diện công khai. Quy tắc chấp nhận tên lớp chính xác, cùng pkg.*pkg.**.

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

--protect-lib bảo vệ những phụ thuộc khớp mẫu trong BOOT-INF/lib và dùng được với cả ba bố trí.

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

Chỉ bảo vệ các phụ thuộc mã nguồn đóng của riêng bạn. Đừng mã hóa các gói framework bên thứ ba như Spring, Tomcat, thư viện ghi nhật ký hay trình điều khiển cơ sở dữ liệu với ý nghĩ «bảo vệ càng nhiều càng tốt».

7. Quét 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 dùng chung được. Khác biệt như sau:

Tùy chọnTác dụngKhi nào dùng
--compat-scanChỉ quét tệp JAR đầu vào, in ra rủi ro và khuyến nghị cấu hình rồi kết thúc. Không mã hóa và không tạo dist, nên không cần thư mục xuất.Hãy xem báo cáo trước ở lần bảo vệ đầu tiên, sau khi nâng cấp Spring Boot hoặc phụ thuộc khác, sau khi đổi phạm vi bảo vệ hay bố trí, và khi truy tìm sự cố tương thích.
--compat-applyQuét xong thì gộp các khuyến nghị an toàn, tiếp tục mã hóa và ghi kết quả, nên bắt buộc phải có thư mục xuất.Dùng để hoàn tất đóng gói khi bạn đã đọc kết quả quét và chấp nhận khuyến nghị. Cũng hợp với các lần dựng lặp lại và quy trình CI đã kiểm chứng quy tắc.

Với springboot, --compat-apply có thể chọn bố trí, thêm quy tắc loại trừ và điều chỉnh lớp phủ ZIP, JavaFX cùng hậu tố kho lưu trữ. Với mọi mục ngoài các quy tắc loại trừ, giá trị bạn chỉ định rõ trên dòng lệnh được ưu tiên. Các lớp loại trừ được khuyến nghị sẽ gộp sẵn với mẫu --exclude bạn tự viết; nếu không muốn thêm tự động, hãy truyền kèm --no-compat-excludes. Trình quét chỉ phân tích tĩnh theo phỏng đoán, nên những vấn đề buộc phải sửa mã sẽ không được --compat-apply khắc phục, và ứng dụng sau khi đóng gói vẫn cần kiểm thử hồi quy trên nền tảng mục tiêu.

Các lệnh khác, toàn bộ tùy chọn, biến môi trường và ví dụ tự động hóa nằm trong Tham chiếu dòng lệnh.