1. Giới thiệu
Chào các fan hâm mộ Linux,
Bài viết này chủ yếu dựa trên hai tài liệu là
http://www.securityfocus.com/infocus/1739 của Ivan, tác giả mod_security và
http://www.securityfocus.com/infocus/1786 của Artur Maj. Bà con có thể xem đây là một bản dịch tiếng Việt của hai tài liệu trên, kèm theo những suy nghĩ riêng của bản thân tôi dựa vào kinh nghiệm thực tế khi triển khai reverse proxy
-0-.
Bài viết này có thể xem là một case study thuộc tập tài liệu "Bảo vệ máy chủ an toàn với phần mềm tự do".
Nhiệm vụ của chúng ta là bảo vệ một hay nhiều content web-server
-1- nằm trong vùng Internal
-2-, các web-server này có thể là Apache httpd, hoặc Microsoft IIS, hoặc có thể chỉ là một web-server đơn giản được embedded vào một ứng dụng nào đó. Để hoàn thành nhiệm vụ, chúng ta sẽ tập trung vào xây dựng một firewall/ids hoạt động ở tầng application, trong tài liệu này gọi là reverse-proxy, sử dụng Apache httpd
-3- trên nền Linux.
2. Reverse proxy là gì?
Một proxy, theo định nghĩa, là một thiết bị đứng giữa server và client, tham gia vào "cuộc trò chuyện" giữa hai bên. Khái niệm proxy mà chúng ta thường dùng hàng ngày tốt hơn nên được gọi là một forward proxy: một thiết bị đứng giữa một client và tất cả server mà client đó muốn truy cập vào. Một reverse proxy làm công việc hoàn toàn ngược lại: nó đứng giữa một server và tất cả client mà server này phải phục vụ. Reverse proxy giống như một nhà ga kiêm một trạm kiểm soát, các request từ client, bắt buộc phải ghé vào reverse proxy, tại reverse proxy sẽ kiểm soát, lọc bỏ các request không hợp lệ, và luân chuyển các request hợp lệ đến đích cuối cùng là các server. Chú ý là một reverse proxy có thể luân chuyển request cho nhiều server cùng lúc.
Lợi thế lớn nhất của việc sử dụng reverse proxy là ở khả năng quản lí tập trung. Một khi đã đẩy được tất cả traffic đi qua một trạm kiểm soát duy nhất (là reverse proxy), chúng ta có thể áp dụng nhiều "đồ nghề" khác để tăng cường an ninh cho hệ thống của mình. Dĩ nhiên, bất kì sản phẩm hay công nghệ nào cũng có ưu và khuyết điểm của nó, đi cùng với single point of access bao giờ cũng là "bóng ma" single point of failure. Single point of failure có thể được giải quyết bằng cách xây dựng cluster. Đây là một vấn đề hoàn toàn vượt qua khỏi phạm vi của bài viết này, tôi chỉ xin giới thiệu bồ nào muốn tìm hiểu về cluster trên Linux thì thử ghé vào
http://www.linux-ha.org. Ngoài ra áp dụng reverse proxy đúng cách sẽ giúp tăng cường performance cũng như nâng cao scalability của các web-application chạy trên các content server. Chút xíu nữa, tôi sẽ đi vào chi tiết các ưu điểm của reverse proxy cũng như làm thế nào để khai thác các ưu điểm đó.
3. Cài đặt máy chủ reverse-proxy
3.1. Chọn và cài đặt hệ điều hành cho reverse proxy
Dĩ nhiên là tôi sử dụng linux cho máy chủ reverse proxy. Tôi không mô tả quá trình cài đặt linux ở đây bởi có rất nhiều tài liệu hay trên Internet nói về đề tài này, và hơn nữa tôi nghĩ là một khi đã nghĩ đến chuyện làm reverse proxy thì chắc chắn chuyện cài đặt Linux không là vấn đề.Linux có quá trời distro, thế mrro chọn distro nào? Theo tôi thì distro nào cũng như nhau cả thôi, nhưng nếu ai đó hỏi tôi câu hỏi trên thì câu trả lời sẽ là Trustix
-4-. Bất kể chọn distro nào, nhớ là sau khi cài đặt xong, hãy dành một chút thời gian để secure cái distro của mình lại trước khi đọc tiếp
-5-. Phần tiếp theo chúng ta sẽ bàn về việc cài đặt Apache httpd cũng như các module kèm theo của nó.
3.2. 1.3.x hay 2.x?
Trước tiên, tôi nghĩ cần phải trả lời câu hỏi là chúng ta sẽ chọn phiên bản Apache nào để làm reverse proxy đây, 1.3.x hay 2.x? Tôi chọn 2.x vì ba lý do: thứ nhất là tôi "nghe đồn" là có rất nhiều 0-day trong phiên bản 1.3.x
. Lý do thứ hai là Apache 2.x cung cấp một bộ filtering API tốt hơn so với phiên bản 1.3.x, cho phép các module có thể nhìn thấy và tương tác với nội dung của các request cũng như các response tương ứng từ trả lời từ server. Điều này rất quan trọng đối với một reverse proxy đóng vai trò là một application gateway bởi vì nó phải kiểm tra tất cả thông tin đi xuyên qua nó trước khi chuyển giao cho bên nhận.
-6-. Lý do cuối cùng là Apache httpd 2.x có performance cao hơn hẳn 1.3.x khi phục vụ các static content như file HTML và file hình ảnh. Tôi quan tâm đến vấn đề này là vì tôi có ý định giảm tải cho các content server bên trong bằng cách tách content ra làm hai loại là dynamic (các loại file CGI/Perl, PHP) và static (các file HTML và file hình ảnh), các content server chỉ phục vụ dynamic content, còn tất cả static content thì đưa qua máy chủ reverse proxy luôn. Lúc đó khi các request của client đi vào reverse proxy, nếu request đó có đích đến là một static content, máy chủ reverse proxy sẽ trả lời luôn cho client mà không cần forward request đó đến content server ở phía sau, chỉ những request đến các dynamic content mới được forward để các content server xử lí. Tôi sẽ đi vào chi tiết vấn đề này ở phần sau, chỉ lưu ý một điều là cuối cùng tôi lại không dùng Apache httpd cho mục đích này mà lại sử dụng một máy chủ web khác chuyên trị static content.
3.3. Chọn module cho Apache httpd
Ngoài những module mà tài liệu "Securing Apache 2: step by step" đề nghị, chúng ta phải chọn thêm các module sau đây:
- mod_rewrite, mod_proxy, mod_proxy_http: các module này sẽ hỗ trợ chúng ta trong việc thiết lập reverse proxy.
- mod_security: module này giúp chúng ta cấu hình reverse proxy thành một application firewall để chống lại các dạng tấn công thường thấy vào các web-application chạy trên content server.
-7-
- mod_ssl: module này giúp chúng ta mã hóa dữ liệu của các kết nối từ client đến server thông qua giao thức SSL và TLS, biến giao thức HTTP không an toàn thành giao thức HTTPS rất bảo mật.
-8-
Phần quan trọng tiếp theo là chọn một MPM phù hợp với mục đích làm reverse proxy của chúng ta. MPM là viết tắt của cụm từ Multi-Processing Module, là một cải thiện đáng kể của Apache httpd 2.x so với Apache 1.x. Trong kiến trúc của Apache 2.x, MPM đóng vai trò hết sức quan trọng, nó chịu trách nhiệm lắng nghe trên các cổng mạng, chấp nhận các yêu cầu kết nối từ phía client, và chuyển các yêu cầu đó vào bên trong để Apache httpd xử lí
-9-. Trong trường hợp này tôi chọn MPM worker. MPM worker sử dụng thread để phục vụ các request, do đó nó có khả năng phục vụ một lượng lớn các request nhưng lại tốn rất ít tài nguyên so với các process-based MPM khác như prefork. Đồng thời MPM worker vẫn khai thác đặc tính ổn định của cá process-based MPM bằng cách tạo ra nhiều process để trước, mỗi process có nhiều thread để sẵn sàng phục vụ client
-10-.
3.4. Biên dịch và cài đặt Apache httpd
Câu hỏi kế tiếp là biên dịch các module theo kiểu nào. Như chúng ta đều biết, có hai cách biên dịch các module trong Apache httpd. Cách thứ nhất, gọi là phương pháp động, là biên dịch các module thành các thư viện liên kết chia sẻ (tương tự như các thư viện DLL trên Windows). Với cách này, các module sẽ được biên dịch thành các file .so, và sẽ được tải lên khi Apache httpd khởi động nếu cần (tùy theo các câu lệnh LoadModule trong file cấu hình conf/httpd.conf). Cách biên dịch thứ hai, gọi là phương pháp tĩnh, là gom tất cả module nhét vào trong file bin/httpd luôn (link statically). Khi khởi động và trong quá trình chạy, Apache httpd không cần phải tải thêm module nào nữa. Phương pháp tĩnh được xem là lựa chọn tốt hơn hết.
Chọn phương pháp tĩnh, chúng ta không cần dùng đến module mod_so (module cần thiết để tải các file .so trong phương pháp động). Hơn nữa, theo khuyến cáo của Apache, sử dụng phương pháp tĩnh sẽ giúp tăng 5% về mặt performance so với phương pháp động.
Chúng ta tải Apache httpd 2.x ở
http://httpd.apache.org/download.cgi và tải mod_security tại
http://www.modsecurity.org sử dụng các lệnh sau:
Code: localhost$ wget http://www.tux.org/pub/net/apache/dist/httpd/httpd-2.0.54.tar.gz
localhost$ wget http://www.modsecurity.org/download/modsecurity-1.8.7.tar.gz
localhost$ tar -xzf httpd-2.0.54.tar.gz -C /usr/local/src
localhost$ tar -xzf modsecurity-1.8.7.tar.gz -C /usr/local/src
Tài liệu kèm theo của mod_security chỉ hướng dẫn cách biên dịch mod_security thành một thư viện chia sẻ của Apache httpd, do đó chúng ta cần phải chuẩn bị đôi chỗ để có thể biên dịch tĩnh mod_security:
Code: localhost$ cd /usr/local/src
localhost$ mkdir -p httpd-2.0.54/modules/security
localhost$ cp modsecurity-1.8.7/apache2/mod_security.c httpd-2.0.54/modules/security
localhost$ cp httpd-2.0.54/modules/echo/Makefile.in httpd-2.0.54/modules/security
Okay, xong xuôi, bắt đầu biên dịch như sau:
Code: localhost$ cd /usr/local/src/httpd-2.0.54
localhost$ ./configure \
--with-mpm=worker \
--disable-charset-lite \
--disable-include \
--disable-env \
--disable-status \
--disable-autoindex \
--disable-asis \
--disable-cgid \
--disable-cgi \
--disable-negotiation \
--disable-imap \
--disable-actions \
--disable-userdir \
--disable-alias \
--disable-so \
--with-module=security:mod_security.c \
--enable-modules='ssl rewrite proxy proxy_http'
Nếu quá trình biên dịch thành công, chúng ta sẽ tiếp tục như sau để cài Apache httpd vào hệ thống (tại thư mục mặc định là /usr/local/apache):
Code: localhost$ make
localhost$ su
localhost# umask 022
localhost# make install
localhost# chown -R root:sys /usr/local/apache
3.5. Đổi "root" của server
Phần này xin vui lòng tham khảo tài liệu "Securing Apache 2:Step by Step."
(còn tiếp)
Phần sau:
4. Cấu hình Apache httpd làm reverse proxy-
----------------------
-0-: Thực tế phần tiếng Việt của tài liệu "Securing Apache 2: Step-by-Step" tôi sao chép khá nhiều từ bản dịch và mở rộng tài liệu "Securing Apache: Step-by-Step"
http://www.securityfocus.com/infocus/1694) của hnd (aka conmale)
-1-: ngoài web-server ra, giải pháp reverse proxy (hoặc tương tự) có thể áp dụng cho các dịch vụ khác như VNC (xem thử
http://sourceforge.net/projects/vnc-reflector/), mail (xem thử tài liệu "Qmail as the mail gateway" của
hnd@diendantinhoc.org). Chỉ duy nhất một dịch vụ tui chưa làm được reverse proxy là FTP, bồ nào có thông tin về ftp reverse proxy thì cho tui vài xu.
-
2-: chúng ta vẫn có thể thiết lập reverse proxy để bảo vệ cho các web-server nằm ở ngay vùng DMZ, hoặc thiết lập một reverse-proxy đặt ngay trong vùng Internal để bảo vệ các web-server ở vùng Internal từ các mối hiểm họa đến từ bên trong.
-3-: Ngoài Apache httpd ra, còn có rất nhiều software khác có thể được ứng dụng để làm reverse proxy mà đáng kể nhất là pound. Thao khảo thêm tại địa chỉ
http://www.apsis.ch/pound/.
-4-: Trustix là một distro nhỏ gọn (trọn bộ cài đặt chỉ có một CD duy nhất) được xây dựng dựa trên RedHat với hai mục tiêu chính là bảo mật và ổn định. Phiên bản stable mới nhất của Trustix là 2.2, phiên bản unstable là 3.0 RC2. Tham khảo thêm tại
http://www.trustix.org
-5-: Tham khảo tài liệu Linux Security HOWTO có tại
http://www.tldp.org để biết thêm chi tiết. Phần mềm Bastille-Linux cũng sẽ rất hữu dụng trong việc secure cho các Linux server.
-6-: Chỉ có sử dụng Apache 2.x thì những luật cản lọc OUTPUT của mod_security mới có tác dụng.
-7-: Tham khảo thêm tài liệu về mod_security tại địa chỉ
http://www.modsecurity.org và loạt kí sự của conmale về các vụ tấn công DDoS vào HVA.
-8-: Kể từ phiên bản Apache httpd 2.0, mod_ssl đã được chính thức đưa vào Apache httpd. Tham khảo thêm tài liệu về mod_ssl tại địa chỉ
http://www.modssl.org.
-9-: Chọn lựa MPM cho Apache 2.x là một vấn đề cực kì quan trọng, ảnh hưởng rất nhiền đến performance của server, do đó tôi đề nghị những ai quan tâm đến Apache 2.x, nên tham khảo thêm tài liệu về MPM tại
http://httpd.apache.org/docs-2.0/mpm.html
-10-: Tại sao thread lại "ngon" hơn process về performance? Những ai quan tâm đến vấn đề này xin tìm các tìm đọc các tài liệu sau đây:
- Advanced Linux programming
http://www.advancedlinuxprogramming.com)
- Understanding the Linux kernel.
Tác giả
Mrro