BangMaple's Blog. Nơi sẻ chia kiến thức!

Bảo mật Java Web Application thông qua Apache HTTP Server như là Reverse-Proxy

Không có nhận xét nào

Chào các bạn,

Trong bài viết này mình sẽ hướng dẫn các bạn các bảo mật ứng dụng Java Web thông qua Apache HTTP Server, cụ thể là sẽ thực hành trên phần mềm XAMPP.

Trong lập trình Java Web, chúng ta khá là vất vả trong việc xử lý dữ liệu ở tầng Business Logic. Việc thiết lập thêm cho việc kiểm tra request và lọc dữ liệu từ request khá là khó khăn trong việc mở rộng một dự án hoặc thậm chí có thể làm chậm máy chủ và có nguy cơ làm tăng rủi ro an ninh an toàn thông tin.

Organize your application code in three-tier architecture - Create ...
Hình 1 - Mô hình 3 lớp

Tại bài viết này mình chỉ tập trung vào Reverse-Proxy, nên khái niệm về Proxy thông thường bạn có thể dễ dàng tìm kiếm được tài nguyên có sẵn trên Google Search.
Hình 2 - Mô phỏng Reverse-Proxy
Đầu tiên nhìn vào tấm hình, ta có thể dễ dàng nhận biết được Reverse-Proxy có thể được coi như là một lớp "phòng thủ" bổ sung cho server chạy ứng dụng Java Web.

Nó có thể giúp bạn che giấu được địa chỉ IP của máy chủ chạy ứng dụng Java Web. Reserve-Proxy Server có thể được tích hợp nhiều hơn một tính năng để nâng cao tính bảo mật và phòng thủ trước những mối nguy hại trong môi trường Internet như là tấn công DDoS, tránh những công cụ dò lỗ hỏng bảo mật tự động, ... 

Ngoài ra Reserve-Proxy còn có thể đảm nhiệm thêm nhiệm vụ Caching giúp cho việc người dùng yêu cầu dữ liệu bên phía máy chủ Web Application nhưng không nhất thiết phải yêu cầu lần 2 tới máy chủ khi dữ liệu ở máy chủ chạy Web Application không thay đổi và việc trả dữ liệu được diễn ra ở Reserve-Proxy nên việc yêu cầu dữ liệu nhanh hơn khá nhiều.
What is Web Cache Poisoning? | Acunetix
Hình 3 - Caching

Tăng cường tính sẵn sàng (Availability) là điều tất yếu đối với những máy chủ chạy 24/7. Bạn sẽ cảm thấy không hài lòng với dịch vụ khi mà một máy chủ chính chạy ứng dụng Web bị sập, việc có những máy chủ cạnh bên hỗ trợ cung cấp các dịch vụ web là cần thiết kết hợp với Reverse-Proxy và bạn sẽ có thể có thêm được tính năng Cân bằng tải (Load Balancing) cho máy chủ của mình. 
Khi gặp một lượng lướng request từ người dùng, Reserve-Proxy có thể chuyển giao một phần request cho các máy chủ khác giúp tăng tính sẵn sàng của nó.

Hiệu năng của máy chủ chạy Web Application càng tăng vì bây giờ máy chủ chạy Java Web Application sẽ không cần phải làm thêm nhiệm vụ mã hoá và giải mã SSL.

High availability
Hình 4 - Tính sẵn sàng

Từ bây giờ, mình sẽ minh hoạ máy chủ chạy Java Web Application là Apache Tomcat.
Trong XAMPP có sẵn Apache HTTP Server, bạn có thể host ứng dụng Web PHP lên trên đây, trong bài viết này chúng ta sẽ bỏ qua cơ chế host ứng dụng Web của PHP mà làm thành Reverse-Proxy.

WAF] Hướng dẫn cài đặt compile module ModSecurity với Apache Linux ...
Hình 5 - ModSecurity
Mình sẽ giới thiệu một module của Apache HTTP Server đó là ModSecurity. Theo cơ chế hoạt động của Apache HTTP Server là khi request được gửi lên thì các module có quyền thao tác trên các request đó.

Còn ModSecurity là một Apache HTTP Server module dạng tường lửa cho ứng dụng web có dạng mã nguồn mở. Chủ yếu để tăng cường bảo mật đối với các dạng lỗ hỏng bảo mật chung sử dụng bộ rules của OWASP ModSecurity. 

Để có thể nhận diện được mối nguy hại, ModSecurity được nhúng vào trong Apache HTTP Server cho phép nó có thể rà soát những giao tiếp HTTP thông qua các luồng yêu cầu và gửi trả dữ liệu đến điểm cuối. Được dựa trên việc cấu hình các rule mà công cụ sẽ quyết định nên xử lý các trường hợp đó như thế nào như là cho phép, loại bỏ, chuyển đi, trả về status code, ...
How ModSecurity protects Wordpress websites - Sysally
Hình 6 - Minh hoạ các hoạt động của ModSecurity
Bây giờ hãy thiết lập nó lên thôi nào!

Đầu tiên bạn cần tải xuống XAMPP thông qua đường dẫn: https://www.apachefriends.org/. Bạn không nên bỏ cài đặt Apache Web Server và Apache Tomcat vì là cần thiết.
Hình 7 - Giao diện sau khi cài đặt XAMPP.
Thông qua đường dẫn C:\xampp\apache\modules là nơi chứa các module của Apache HTTP Server, nơi chúng ta sẽ cài đặt ModSecurity lên đó.
Hình 8 - Nơi chứa Apache HTTP Server modules
Chúng ta sẽ tải xuống module ModSecurity thông qua đường dẫn: https://www.apachelounge.com/download/
Hình 9 - Những tập tin cần chú ý
Chúng ta sẽ đưa tệp tin mod_security2.so vào đường dẫn Nơi_cài_đặt_XAMPP\apache\modules, tệp tin yajl.dll vào đường dẫn Nơi_cài_đặt_XAMPP\apache\bin, tệp tin modsecurity.conf-recommended vào đường dẫn Nơi_cài_đặt_XAMPP\apache\conf.

Sau khi import module thì chúng ta sẽ phải sử dụng module bằng cách LoadModule, chúng ta vào đường dẫn Nơi_cài_đặt_XAMPP\apache\conf\ và mở tệp tin httpd.conf và tìm để xác nhận module sẽ được load.
Hình 10 - Xác nhận các module trong hình sẽ được load
Chúng ta sẽ phải có những tệp tin như hình dưới và tệp httpd.conf đã được chỉnh sửa như trên. Và đỡ mất công đôi bên cấu hình những thứ mất thời gian gỡ lỗi thì mình sẽ cung cấp cho bạn các tệp tin cần thiết ấy tại đây: https://drive.google.com/file/d/1fDd-O8G4FeCDrTmAjbIFlIatO42e4_wM/
Hình 11 - Các tệp tin thiết yếu
Hãy đặt các tệp tin trong tệp nén vào đúng vị trí này.

Để có thể kết nối qua Java Web Application của Apache Tomcat, chúng ta kết nối gián tiếp qua Apache HTTP Server thông qua giao thức AJP, mở tệp tin ajp.conf để xem chi tiết như sau để xác nhận và chỉnh sửa sau này.
Hình 12 - Cấu hình chi tiết tệp tin ajp.conf
Chúng ta cần tệp ajp.conf để có thể chạy chung khi tệp httpd.conf được load. Giao thức AJP có port mặc định là 8009 nên chúng ta cần phải bật giao thức AJP bên Apache Tomcat với tệp tin server.xml bên đó.

Vào Nơi_cài_đặt_XAMPP\tomcat\conf\server.xml để bật port 8009 của giao thức AJP.
Hình 13 - Xác nhận giao thức AJP đã được bật
Đến đây là gần như hoàn tất, bạn có thể tải xuống project Java Web đơn giản để thử các lỗ hỏng bảo mật tại đây: https://drive.google.com/file/d/1rYdtnjURcIZCngBJcIHnQ8mKU_o-8LZ1/

Sau đó bạn đổi tên gói .war đã tải về thành ROOT.war rồi sau đó đặt vào đường dẫn Nơi_cài_đặt_XAMPP\tomcat\webapps\ và cuối cùng là xoá thư mục ROOT đi. Kết quả sẽ được như hình dưới.
Hình 14 - Xác nhận thư mục webapps của Apache Tomcat
Sau đó hãy khởi động Apache HTTP Server Apache Tomcat lên. Bạn sẽ thấy có thêm một port 8009.
Hình 15 - XAMPP sau khi cấu hình AJP

Bạn truy cập Web Application thông qua địa chỉ http://localhost:80 thay vì phải vào :8080 để thông qua Proxy.
Hình 16 - Sau khi vào localhost
Chúng ta sẽ thử tấn công dạng XSS (Reflected) như sau để lấy cookie: <script>alert(document.cookie)</script> 

Ngay lập tức chúng ta sẽ "ăn" HTTP Status Code 403 là không có quyền truy cập vì ModSecurity đã filter đi và không thể đến Apache Tomcat Server được.

Hình 17 - Lỗi 403
Chúng ta mở tệp modsec_audit.log trong đường dẫn Nơi_cài_đặt_XAMPP\apache\logs và thấy ModSecurity đã nhận ra được đây là tấn công dạng XSS và từ chối.
Hình 18 - Log của ModSecurity
Tệp nén mình cung cấp có bao gồm thêm kho rules OWASP dành cho ModSecurity:  https://github.com/coreruleset/coreruleset

Ngoài ra, bạn cũng có thể chỉnh sửa cấu hình của ModSecurity trong tệp modsecurity.conf. Cụ thể là nếu bạn muốn vô hiệu hoá các chức năng của ModSecurity thì chỉ cần set dòng số 7 giống hình dưới thành SecRuleEngine Off hoặc SecRuleEngine DetectionOnly là xong.
Hình 19 - Configuration của ModSecurity
Bạn cũng có thể tận dụng tệp log để tạo API cho việc quản lý mở rộng sau này.

Việc áp dụng các rules tự tạo khả thi nên bạn hoàn toàn có thể phát triển thêm cho ModSecurity rules.

Nhưng bạn sẽ không thể sử dụng module ModSecurity nếu bạn không thông qua port 80 mà qua port 8080 vì nó vẫn còn hiệu lực hoá nên kết quả sẽ như sau nếu bạn thử tấn công XSS.
Hình 20 - Tấn công XSS thành công
Nên bạn cần phải vô hiệu hoá port 8080 của Apache Tomcat bằng cách vào conf\server.xml của Tomcat và comment lại block như hình dưới.
Hình 21 - Vô hiệu hoá port 8080
Việc làm này sẽ làm XAMPP không nhận diện được Apache Tomcat Server của bạn có hoạt động hay không nên từ nay chúng ta sẽ mở tệp catalina_start.bat để chạy và bạn thấy port 8009 được hoạt động.
Hình 22 - Console của Apache Tomcat
Sau khi disable port 8080. Bạn sẽ không thể nào kết nối đến Apache Tomcat Server trực tiếp được nữa, điều này sẽ tăng phần nào về tính bảo mật. Test truy cập port 8080.
Hình 23 - Port 8080 đã bị shutdown
Hi vọng bạn sẽ học được cách để tăng tính bảo mật cho ứng dụng Java Web của mình mà không phải làm giảm hiệu năng của Apache Tomcat.

Cảm ơn bạn đã theo dõi bài này.
-------------------
Tài liệu tham khảo thêm:

Không có nhận xét nào :

Đăng nhận xét