Bảo vệ ứng dụng Web Tomcat

tomcat chuyển đổi WAR thành một cấu trúc Tomcat tự chứa đầy đủ. Khi chạy, nó sử dụng các thành phần Tomcat có sẵn trong bộ mã hóa mà không cần truy cập vào phiên bản Tomcat được cài đặt trên máy người dùng.

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

  1. Chọn Tomcat WAR trên trang loại ứng dụng.

    Chọn Tomcat WAR

  2. Chọn tệp WAR đầu vào, 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 Tomcat 9/10.1 hoặc để hệ thống tự phát hiện, đồng thời thiết lập các thông số như Context Path, tham số JVM và quy tắc loại trừ tùy theo nhu cầu; chế độ đơn giản sẽ đề xuất phiên bản Tomcat thông qua việc quét khả năng tương thích. Ý nghĩa của các tùy chọn được giải thích trong Cài đặt chế độ nâng cao của Protector4J.

    Cấu hình phiên bản Tomcat, Context Path và các quy tắc loại trừ

  4. Chọn thư mục đầu ra, kiểm tra tóm tắt các thông 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

Đường dẫn Context được chỉ định:

p4j tomcat app.war dist --context /app

Quét khả năng tương thích và đề xuất ứng dụng được bảo vệ tự động:

p4j tomcat app.war --compat-scan
p4j tomcat app.war dist --compat-apply --context /app

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

Tùy chọnHành viThời điểm sử dụng
--compat-scanChỉ quét tập tin WAR đầu vào, in ra các rủi ro và đề xuất cấu hình rồi thoát; không tiến hành mã hóa hay tạo ra dist, vì vậy không cần thư mục đầu raSử dụng nó để xem báo cáo trước tiên sau khi bảo vệ ứng dụng lần đầu, nâng cấp các phụ thuộc liên quan đến Tomcat, điều chỉnh phạm vi bảo vệ hoặc cấu hình JSP, cũng như khi khắc phục các vấn đề về tính tương thích
--compat-applySau khi quét, các khuyến nghị thận trọng sẽ được tự động kết hợp, sau đó tiếp tục mã hóa và tạo ra kết quả đầu ra; vì vậy cần phải chỉ định thư mục đầu ra.Khi đã đọc kết quả quét và chấp nhận các khuyến nghị tự động, có thể sử dụng chúng để hoàn tất việc đóng gói; nó cũng có thể được dùng cho việc 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 tomcat--compat-apply, có thể thêm các lớp loại trừ dựa trên kết quả quét, đồng thời điều chỉnh các tùy chọn như phiên bản Tomcat, ZIP overlay và phần mở rộng tệp nén. Đối với ba tùy chọn cuối cùng, 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ẽ mặc định được kết hợp 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 đề cần sửa đổi mã nguồn sẽ không được --compat-apply tự động sửa chữa; sau khi tạo ra, 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.

Đối với 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.

Mặc định --tomcat-version chính là auto. Khi cần thiết, có thể chỉ định rõ ràng 9 hoặc 10.1.

p4j tomcat app.war dist --context /app --tomcat-version 10.1

3. Cấu trúc đầu ra

dist/
├── bin/
│   ├── catalina.sh
│   ├── startup.sh
│   ├── shutdown.sh
│   └── *.bat
├── conf/p4jx/
│   ├── contexts.list
│   ├── protected-classes.list
│   └── allowed-prefixes.list
├── protected/
│   └── app.p4jx
├── lib/
│   ├── p4jx-tomcat-runtime.jar
│   └── tomcat-runtime-deps.jar
├── vlxjre/
├── run.sh
└── run.bat

Mặc định sẽ không tạo ra tệp WAR vật lý. web.xml, các tài nguyên tĩnh, các lớp công khai, dữ liệu siêu dữ liệu mẫu và các implementation bảo vệ đều nằm trong protected/<context>.p4jx, sau đó được P4JX WebResourceSet trình bày cho Tomcat.

4. Khởi động và dừng

Chạy ở mặt tiền:

./run.sh

Khởi động nền theo phong cách Tomcat:

./bin/startup.sh
./bin/shutdown.sh

Windows sử dụng tệp tương ứng là .bat. Nhật ký sẽ được ghi vào thư mục đầu ra logs/.

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

Khi đóng gói, bạn có thể nhập một tham số mỗi dòng trong JVM startup options của giao diện GUI, hoặc sử dụng CLI:

p4j tomcat app.war dist \
  --context /app \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

Sau khi triển khai, hãy thực hiện việc chỉnh sửa trực tiếp:

  • macOS/Linux: Chỉnh sửa bin/catalina.sh, thêm JVM_OPTS+=("-Xms1g" "-Xmx2g") sau JVM_OPTS=(...) bên trong run_java(); điều này sẽ có hiệu lực khi chương trình được khởi động ở chế độ nền hoặc chế độ ngoại tuyến với startup.sh.
  • Màn hình chính của Windows: Chỉnh sửa bin\catalina.bat, thêm set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g" sau chuỗi set "JVM_OPTS=..." hiện có.
  • Chế độ nền Windows: Thêm set "APP_JAVA_OPTS=-Xms1g -Xmx2g" trước khi gọi catalina.bat từ bin\startup.bat. Nếu muốn sử dụng chung một bộ tham số vĩnh viễn cho cả chế độ nền và chế độ tiền cảnh, nên tạo lại chúng thông qua GUI/CLI.

Khi khởi động tạm thời, cũng có thể thiết lập APP_JAVA_OPTS ngay trước lệnh. Các ví dụ đầy đủ về CMD, PowerShell và script có thể được xem tại Cấu hình tham số khởi động JVM.

5. Lựa chọn phiên bản Tomcat

Không gian tên API WARTomcatYêu cầu về Java
javax.servlet.*Tomcat 9Java 8/11/17/21/25
jakarta.servlet.*Tomcat 10.1Java 11/17/21/25

Việc phát hiện tự động ưu tiên xác định không gian tên API từ các lớp ứng dụng và mô tả triển khai, trong khi tên tệp JAR chỉ được dùng làm bằng chứng hỗ trợ. Khi phát hiện sự kết hợp giữa javaxjakarta, công cụ sẽ từ chối việc đoán tự động.

6. JSP

Khi WAR chứa JSP, chúng sẽ được tự động biên dịch sơ bộ thành các lớp servlet và bản đồ URL ngay trong giai đoạn mã hóa. Lý do là việc biên dịch JSP động tại thời gian chạy sẽ tạo ra các lớp mới từ thư mục làm việc của Tomcat, điều này không phù hợp với việc bảo vệ các giới hạn định nghĩa lớp tại thời gian chạy.

Có thể kiểm soát một cách rõ ràng:

--precompile-jsp
--no-precompile-jsp

Trong môi trường sản xuất, nên giữ nguyên chế độ tiền biên dịch tự động mặc định. Nếu vô hiệu hóa nó, các ứng dụng chứa JSP có thể gặp sự cố khi truy cập trang.

7. Phạm vi bảo vệ và quy tắc loại trừ

Mặc định sẽ bảo vệ các lớp ứng dụng thuộc WEB-INF/classes, trong khi các lớp phụ thuộc vào WEB-INF/lib sẽ không được bảo vệ theo mặc định. Có thể loại trừ các lớp hướng tới Web:

p4j tomcat app.war dist \
  --context /app \
  --exclude 'com.example.web.**,com.example.dto.**'

Nên ưu tiên loại trừ các lớp servlet/filter/listener, DTO, tệp cấu hình, lớp thực thể, các lớp kết nối JNI và những lớp cần được tăng cường bởi container. Việc quét khả năng tương thích sẽ đưa ra những khuyến nghị thận trọng.

8. Thêm ứng dụng vào cùng một gói Tomcat

p4j tomcat second.war dist \
  --append-app \
  --context /second

Ràng buộc:

  • Đường dẫn context không được trùng với các ứng dụng đã tồn tại;
  • Các ứng dụng cũ và mới phải sử dụng cùng một phiên bản chính của Tomcat, phiên bản Java và nền tảng đích.
  • Khi không cung cấp --append-app, công cụ sẽ từ chối ghi vào các gói Tomcat hiện có;
  • Chọn “Append application to an existing Tomcat folder” trong giao diện GUI và chọn trực tiếp thư mục hiện có.

9. Lưu ý khi sử dụng Java 8

Mục tiêu Java 8 sẽ tự động kích hoạt tính năng ZIP overlay, giúp Tomcat WebResourceSet có thể mở các tập tin nén được bảo vệ.