Tải bản đầy đủ (.docx) (53 trang)

Một số phương pháp bảo mật cho máy chủ Apache. Cài đặt và thử nghiệm module ModSecurity

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.09 MB, 53 trang )

HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA AN TOÀN THÔNG TIN

BÀI TẬP LỚN
MÔN AN TOÀN MẠNG MÁY TÍNH

NGHIÊN CỨU MỘT SỐ PHƯƠNG PHÁP BẢO
MẬT CHO MÁY CHỦ WEB APACHE.
CÀI ĐẶT VÀ THỬ NGHIỆM MODULE
MODSECURITY.

Cán bộ hướng dẫn: Cao Minh Tuấn
Sinh viên thực hiện:
- Phạm Quốc Đạt
- Nguyễn Việt Tiến
- Hoàng Quang Thụy
- Nguyễn Thành Đạt
- Mai Trọng Hoàng
Lớp: AT9A

Hà Nội, 06 - 2016

HÀ NỘI 2016


HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA AN TOÀN THÔNG TIN

BÀI TẬP LỚN
MÔN AN TOÀN MẠNG MÁY TÍNH


Nghiên cứu một số phương pháp bảo mật
cho máy chủ Web Apache.
Cài đặt và thử nghiệm Module ModSecurity.
Nhận xét của cán bộ hướng dẫn: ................................................................................
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................
......................................................................................................................................

Điểm chuyên cần: ........................................................................................................
Điểm báo cáo: ..............................................................................................................
Xác nhận của giáo viên: ..............................................................................................


MỤC LỤC

3


DANH MỤC HÌNH ẢNH VÀ BẢNG BIỂU

4


LỜI NÓI ĐẦU
Sự phát triển của công nghệ thông tin hiện nay cùng với sự phát triển
nhanh chóng của Internet và thương mại điện tử. Nhu cầu cần có một kênh
thông tin đại diện cho Nhà nước, các doanh nghiệp, cá nhân trở nên cần thiết.
Do vậy, các website và ứng dụng web đang trở nên phổ biến và đồng nghĩa với

việc nguy cơ mất an toàn thông tin tăng theo. Chuyện gì sẽ xảy ra nếu một
website bị hack? Nó đồng nghĩa với việc kênh thông tin của Nhà nước, doanh
nghiệp cá nhân bị mất kiểm soát, rò rỉ nhưng thông tin bí mật hay tổn thất về kinh
tế … Để giải quyết vấn đề này, việc bảo mật cho website là điều cần thiết.
Bài viết này:
Nghiên cứu một số phương pháp bảo mật cho máy chủ Web Apache. Cài
đặt và thử nghiệm Module ModSecurity.
Cung cấp cho bạn một số phương pháp để bảo vệ web server mà cụ thể là
Apache Server. Đồng thời tìm hiểu chi tiết hơn về Module ModSecurity, một
Module quan trọng cho Web Server để phòng chống các cuộc tấn công từ
hacker.
Bài viết gồm 2 nội dung chính:
Chương I. Tổng quan máy chủ Web Apache
Chương II. Module ModSecurity
Nhóm sinh viên thực hiện:
- Phạm Quốc Đạt
- Nguyễn Việt Tiến
- Hoàng Quang Thụy
- Nguyễn Thành Đạt
- Mai Trọng Hoàng
Chúng em xin được cảm ơn thầy Cao Minh Tuấn đã giảng dạy và giúp đỡ chúng
em thực hiện đề tài này!

Hà Nội, 06 – 2016

5


CHƯƠNG I. TỔNG QUAN MÁY CHỦ WEB APACHE
1. Giới thiệu về máy chủ web (web server)

Cũng giống như những phần mềm khác mà chúng ta cài đặt trên máy tính,
Web server là một ứng dụng phần mềm. Nó được cài đặt, và chạy trên máy tính
– máy chủ dùng làm Web Server, nhờ có chương trình này mà người sử dụng có
thể truy cập đến các thông tin của trang Web từ một máy tính khác ở trên mạng
(Internet, Intranet).
Máy chủ Web Server là máy chủ có dung lượng lớn, tốc độ cao, được
dùng để lưu trữ thông tin như một ngân hàng dữ liệu, chứa những website đã
được thiết kế cùng với những thông tin liên quan khác. (các mã Script, các
chương trình, và các file Multimedia).
Web Server có khả năng gửi đến máy khách những trang Web thông qua
môi trường Internet (hoặc Intranet) qua giao thức HTTP – giao thức được thiết kế
để gửi các file đến trình duyệt Web (Web Browser), và các giao thức khác.
Tất cả các Web Server đều có một địa chỉ IP (IP Address) hoặc cũng có thể
có một Domain Name. Giả sử khi bạn đánh vào thanh Address trên trình duyệt
của bạn một dòng sau đó gõ phím Enter bạn sẽ gửi một
yêu cầu đến một Server có Domain Name là www.abc.com.vn. Server này sẽ tìm
trang Web có tên là index.html (trang chủ) rồi gửi nó đến trình duyệt của bạn.
Bất kỳ một máy tính – máy chủ nào cũng có thể trở thành một Web Server
bởi việc cài đặt lên nó một chương trình phần mềm Server và sau đó kết nối vào
Internet.
Khi máy tính của bạn kết nối đến một Web Server và gửi đến yêu cầu truy
cập các thông tin từ một trang Web nào đó, Web Server Software sẽ nhận yêu
cầu và gửi lại cho bạn những thông tin mà bạn mong muốn.
Web Server Software còn có thể được tích hợp với CSDL (Database), hay
điều khiển việc kết nối vào CSDL để có thể truy cập và kết xuất thông tin từ
CSDL lên các trang Web và truyền tải chúng đến người dùng.

2. Máy chủ web Apache
Apache hay chương trình máy chủ HTTP là một chương trình dành cho
máy chủ đối thoại qua giao thức HTTP. Apache chạy trên các hệ điều hành tương

tự như Unix, Microsoft Windows, Novell Netware và các hệ điều hành khác.
Apache đóng một vai trò quan trọng trong quá trình phát triển của mạng web thế
giới (World Wide Web).
Được phát triển bởi Apache Software Foundation, là một open-source Web
server miễn phí, tuy nhiên Apache không hề thua kém các phần mềm máy chủ
web khác. Ngược lại, Apache rất ổn định, linh hoạt và mạnh mẽ, được coi là sựlựa-chọn-tốt-nhất cho các giải pháp web server.
Apache web server mang lại nhiều ưu điểm. Có thể kể đến:
6


-

Linh hoạt, mạnh mẽ (Apache có 3 chế độ làm việc : winnt, prefork và worker.
Mạnh mẽ với worker, ổn định với prefork, winnt là mức hoạt động thấp nhất).
Hỗ trợ đầy đủ những giao thức HTTP trước đây như HTTP/1.1.
Có thể cấu hình và mở rộng các module.
Cung cấp source code đầy đủ với license không hạn chế.
Chạy được trên đa dạng Hệ điều hành (Window, Unix, Linux, Netware 5.x,
OS/2
Dễ dàng cài đặt (Các phiên bản Apache được download miễn phí tại trang
web ).

Nhược điểm của Apache web server có lẽ cũng chính là ưu điểm của nó, vì
quá mạnh mẽ nên tiêu tốn nhiều tài nguyên. (Tuy nhiên điều này lại không phải là
vấn đề so với cấu hình của các máy chủ hiện nay).

3. Một số biện pháp bảo mật cho máy chủ web Apache
Theo theo thống kê tháng 9 của Netcraft, Apache là máy chủ web được
dùng nhiều nhất trên Internet (chiếm đến 64,52% thị phần). Cho nên đây là mục
tiêu hàng đầu của các Hacker. Việc bảo mật cho máy chủ web Apache là vô cùng

quan trọng, tránh việc mất quyền điều khiển cũng như mất mát dữ liệu.
Dưới đây là một số phương pháp làm tăng tính an toàn khi sử dụng máy chủ web
Apache:
Những trù bị bảo mật
Là một trong những nhân tố quan trọng nhất, những trù bị bảo mật cho
web server của chúng ta như sau:
-

-

-

Hệ điều hành phải được kiện toàn càng chặt chẽ càng tốt, bao gồm việc
phòng bị cho những tấn công từ bên ngoài lẫn bên trong.
Server không được cung cấp bất cứ dịch vụ nào khác ngoại trừ HTTP:
(80/TCP).
Truy cập từ xa đến server phải được cho phép bởi tường lửa, thiết bị này
chặn trọn bộ những tiếp nối cho lối ra và cho phép những tiếp nối cho lối vào
đến cổng 80/TCP của web server mà thôi.
Web server Apache là dịch vụ duy nhất hiện hữu trên hệ thống.
Chỉ có những modules nào tuyệt đối cần thiết mới được cho phép hoạt
động.
Server nên giảm thiểu tối đa vấn đề tiết lộ những thông tin của chính server Apache server phải chạy bằng UID/GID riêng biệt (tín chỉ cá nhân, tín chỉ
nhóm), không được dùng bất cứ process nào khác của hệ thống.
Các process của Apache phải có giới hạn nhất định đến hệ thư mục
(chrooting);
Không được có bất cứ chương trình dạng shell nào hiện hữu trong môi
trường chrooted (/bin/sh, /bin/csh, v..v..).
7



Cập nhật liên tục
Việc Apache chạy trên hệ điều hành không có nghĩa là bạn không cần cập
nhật. Những lỗ hổng mới và những nguy cơ bảo mật luôn thường trực. Bạn nên
thường xuyên cập nhật để vá những lỗ hổng và sửa những lỗi bảo mật đó.
Nếu đã cài đặt Apache cùng với trình quản lý gói của bản phân phối, bạn
có thể thực hiện cập nhật rất dễ dàng. Và nếu cài đặt từ nguồn, cần đảm bảo
rằng quá trình cập nhật sẽ không làm thay đổi module hay những thành phần
phụ của website. Ngoài ra nếu sử dụng PHP thì trong quá trình cập nhật Apache
bạn phải đồng thời cập nhật cả hai.
Vận hành Apache theo từng đối tượng
Apache thường được cài đặt cho nhiều nhóm hay nhiều người dùng. Một
trong những người hay mắc lỗi nhất là root user (có quyền như admin) mà hậu
quả là tạo ra một số lỗi rất nghiêm trọng. Hay nói theo cách khác cả Apache và
MySQL đều do cùng một đối tượng người dùng hay nhóm người dùng vận hành.
Nếu một người gây ra lỗ hổng, thì người khác có thể phải hứng chịu hậu quả.
Biện pháp tốt nhất để tránh tình trạng này đó là đảm bảo Apache được vận hành
như một Apache dành cho một người dùng hay một nhóm nhất định. Để thực
hiện điều này, bạn chỉ cần mở file httpd.conf và kiểm tra những dòng có dạng:
User Group

Sau đó thay đổi các mục này thành:
User apache Group apache

Nếu gặp lỗi xảy ra trong khi thay đổi có nghĩa là nhóm hay người dùng khai
báo không tồn tại và bạn cần phải tạo mới.
Tắt bỏ những dịch vụ không cần thiết
Có một vài dịch vụ hay tính năng bạn sẽ muốn tắt bỏ hoặc chặn. Tất cả
những dịch vụ này có thể được hủy bỏ trong file httpd.conf. Những dịch vụ/tính
năng này có thể gây ra một số lỗi sau:

-

-

-

Directory browsing: Dịch vụ này được hủy bỏ trong một thẻ Directory
(thường được khởi chạy trong gốc tài liệu) bằng cách sử dụng Options
Directive và cài đặt nó với “-Indexing”.
Server side Includes: Đây là một công cụ khác có thể hủy bỏ trong thẻ
Directory bằng cách sử dụng Options Directive và cài đặt nó với “-Includes”.
CGI execution: Nếu website không sử dụng đến CGI, bạn nên tắt bỏ dịch vụ
này bằng cách sử dụng Options Directive và cài đặt nó với “-ExecCGI” trong
tag thư mục.
Symbolic links: Cài đặt công cụ này trong một thẻ Directory với “FollowSymLinks”.
8


-

None: Bạn có thể tắt bỏ mọi tùy chọn (theo những cách trên) bằng cách sử
dụng “None” với Option Directive.

Hủy bỏ những module không sử dụng
Apache gồm có rất nhiều module. Để xem có bao nhiêu module đang chạy,
dùng lệnh grep –n LoadModule httpd.conf từ trong thư mục cấu hình Apache.
Lệnh này sẽ hiển thị cho bạn mọi module mà Apache đang tải cùng với vị trí dòng
của những module này. Để hủy bỏ những module không cần thiết, bạn chỉ cần bổ
sung kí tự “#” vào đầu dòng của module cần tắt bỏ.
Giới hạn truy cập

Giả sử bạn có một mạng intranet chứa nhiều thông tin quan trong của
công ty và bạn không muốn cho người ngoài mạng riêng của mình truy cập vào
nhóm thông tin này. Để làm được điều đó, bạn chỉ cần giới hạn truy cập vào
mạng nội bộ của bạn bằng cách bổ sung đoạn mã dưới đây vào file httpd.conf
trong thẻ Directory của bạn:
Order Deny, Allow Deny from all Allow from 192.168.1.0/16

Trong đó 192.168.1.0/16 là địa chỉ mạng nội bộ của bạn. Sau khi thực hiện
thay đổi trong file httpd.conf, bạn cần khởi động lại Apache để áp dụng các thay
đổi này.
Hạn chế yêu cầu
Tấn công từ chối dịch vụ (DoS) luôn có thể xay ra khi bạn cho phép khối
lượng yêu cầu lớn trên Apache. Apache có một lệnh điều hướng là
LimitRequestBody được đặt trong thẻ thư mục. Số lượng giới hạn phụ thuộc vào
nhu cầu của website. Theo mặc định thì LimitRequestBody được đặt giá trị vô
hạn.
Sử dụng module mod_security
Một trong những module quan trọng nhất của Apache là mod_security.
Module này xử lý nhiều tác vụ, gồm lọc, lọc biểu thức thông thường, mã hóa URL
và ẩn địa chỉ server. Việc cài đặt mod_security cũng khá phức tạp. Trước tiên
bạn phải bổ sung hai lệnh điều hướng unique_id và security2 vào vùng module
của Apache. Sau đó chạy lệnh:
service apache2 configtest

Khi nhận được thông báo Syntax OK là bạn đã cài đặt thành công.
(*Chi tiết cài đặt và sử dụng mod_sercurity sẽ được giới thiệu ở phần II)
Không cho phép duyệt tìm bên ngoài tài liệu gốc

9



Việc cho phép duyệt bên ngoài tài liệu gốc có thể gây ra nhiều vấn đề. Nếu
không cần thiết phải bật dịch vụ này, tốt nhất bạn nên tắt bỏ nó. Trước tiên, bạn
sẽ phải hiệu thẻ Directory của thư mục gốc như sau:
<Directory />
Order Deny, Allow Deny from all Options None AllowOverride None
</Directory>

Sau đó, nếu cần bổ sung tùy chọn cho bất kì thư mục nào trong tài liệu
gốc, bạn sẽ phải bổ sung một thẻ Directory mới cho mỗi thư mục.
Ẩn số phiên bản của Apache
Một trong những biện pháp phòng ngừa tốt nhất đó là giấu những thông tin
về dịch vụ của bạn đến mức có thể. Một trong những thông tin cần ẩn đi đó là số
phiên bản của Apache. Làm như vậy bạn sẽ ngăn những người dùng không
mong muốn có thể xâm nhập một cách nhanh chóng vào máy chủ web của bạn.
Bạn chỉ cần bổ sung đoạn mã sau vào trong thẻ Directory của tài liệu gốc:
ServerSignature Off ServerTokens Prod

Ẩn file cấu hình httpd.conf
Một trong những biên pháp bảo mật tốt nhất đó là làm ẩn đi file httpd.conf.
Bởi vì file này chứa nhiều thông tin cấu hình cũng như những cài đặt. Nếu mọi
người không thấy nó, nghĩa là họ không thể thay đổi nội dung bên trong, và tất
nhiên những cài đặt của bạn vẫn được giữ nguyên. Để ẩn đi file httpd.conf bạn
chỉ cần sử dụng lệnh sau:
chattr +i /path/to/httpd.conf

Trong đó /path/to/httpd.conf là đường dẫn tới file cấu hình Apache.

10



CHƯƠNG II. MODULE MODSERCURITY.

1. Tổng quan về ModSecurity
1.1. Giới thiệu
Mod_Security là một module mở rộng cho các chương trình web server
như Apache, Nginx, IIS và hoạt động như một firewall tại lớp ứng dụng web.
Cùng với sự gia tăng về phương pháp tấn công web thì mod_security cũng đã
cập nhật những rule và đưa ra nhiều cách phòng chống trong mã nguồn của
chương trình. Một số tính chất mà mod_security có thể dùng làm Web Application
Firewall:
Tính linh động (Flexibility)
Việc phân tích luồng HTTP theo một tiêu chí nhất định trong thực tế
thường gặp vấn đề là làm sao để có thể so trùng mẫu mà bạn muốn. Ngoài ra,
do nhu cầu của từng hệ thống web là khác nhau dẫn đến việc phân tích trên từng
loại ứng dụng cũng khác nhau. Mod_security đã kết hợp với OWASP phát triển
các tập rule mẫu (Core Rule Set) nhằm tạo ra tính linh động cho từng mô hình
web khác nhau, hỗ trợ người quản trị phân tích theo nhu cầu thực tế của hệ
thống đang quản trị.
Tính thụ động (Passivity)
ModSecurity sẽ không thực thi các tác vụ nếu như người quản trị viên
không chỉ định công việc cụ thể cho chương trình, việc này là khá quan trọng
trong một ứng dụng có nhiệm vụ phân tích nguy cơ như ModSecurity. Mọi cảnh
báo sẽ được thực hiện thông qua cơ chế phân tích và quyết định tương tác với
hệ thống sẽ do người quản trị thực hiện.
1.2. Chức năng
ModSecurity hoạt động với chương trình web server (ví dụ: Apache) sẽ thực hiện
các tác vụ như sau:
Parsing
ModSecurity sẽ phân tách các dữ liệu luân chuyển qua hệ thống thành cấu trúc dữ

liệu mà ModSecurity định nghĩa sẵn. Cấu trúc này sẽ được chuyển qua cơ chế so trùng
mẫu trong tập rule để phân tích nguy cơ.
Buffering
Chức năng buffer (đệm) đóng vai trò khá quan trọng trong cơ chế hoạt động của
ModSec. Việc này có ý nghĩa khi các request gởi đến ứng dụng web thì phải thông qua
ModSecurity trước khi đến ứng dụng xử lý và những response cũng sẽ được phân tích
trước khi trả về phía client. Cơ chế này là cách duy nhất để có thể ngăn chặn các cuộc tấn
công thời gian thực, các dữ liệu mà ModSecurity nhận được và phân tích sẽ được lưu trữ
trong RAM (bao gồm request body và response data)
11


Logging
ModSecurity hỗ trợ ghi nhật ký các gói tin HTTP: request headers, request body,
response header, response body nhằm hỗ trợ người quản trị phân tích nguy cơ mà hệ
thống đang gặp phải để có thể ra quyết định kiểm soát.
Rule Engine
Các tập mẫu trong ModSecurity đóng vai trò quan trọng trong việc phát hiện các
dạng tấn công và thực hiện phòng chống. ModSecurity cùng phát triển với dự án OWASP
phát triển các mẫu để phân tích và phòng chống các tấn công hệ thống web (Tham khảo
/>ct)
Các phân nhóm mà CRS hỗ trợ:













HTTP Protection
Real-time Blacklist Lookups
Web-based Malware Detection
HTTP Denial of Service Protections
Common Web Attacks Protection
Automation Detection
Integration with AV Scanning for File Uploads
Tracking Sensitive Data
Trojan Protection
Identification of Application Defects
Error Detection and Hiding

1.3. Cấu trúc rules
Tất cả các hoạt động trong ModSecurity hầu hết sẽ liên quan đến hai phần chính là:
cấu hình (configuration) và các tập luật (rule). Phần cấu hình chỉ định cách thức xử lý dữ
liệu, trong khi các rule sẽ quyết định thực hiện các hành vi (action) với dữ liệu đã được xử
lý.
Một ví dụ về rule: SecRule ARGS "<script>" log,deny,status:404
Cấu trúc chuẩn của một rule trong ModSecurity bao gồm 3 phần chính:
SecRule VARIABLES OPERATOR ACTIONS
VARIABLES: xác định vị trí dữ liệu mà ModSecurity sẽ tìm kiếm mẫu. Trong ví
dụ trên, tham số ARGS nhằm chỉ định tìm kiếm mẫu trong tất cả các tham số trong
request.
OPERATOR: chỉ định cách mà ModSecurity sẽ tìm kiếm mẫu. Các operator được
dùng theo dạng Regular expression nhằm tạo nên cơ chế phân tích linh động cho các rule.
ACTIONS: chỉ định hành động mà ModSecurity sẽ thực hiện khi có một mẫu được

so trùng. Trong ví dụ trên, phần action được viết log, deny, status:404 có nghĩa là: khi
trùng mẫu <script> trong gói tin thì thực hiện ghi log, deny gói tin bằng cách sử dụng mã
trạng thái 404 (Not found).
12


1.4. Quy trình xử lý
Trong ModSecurity mỗi phiên phân tích sẽ thực hiện lần lượt qua 5 bước (pha), tại
mỗi bước ModSecurity sẽ thực thi các rule tương ứng nhằm phát hiện và phòng chống các
khai thác.

Hình : Quy trình xử lý của ModSecurity
Request Header (1)
Đây là bước đầu tiên trong quá trình thực hiện phân tích gói tin. Mục đích
của bước này nhằm cho phép người viết rule tương tác với các request trước khi
thực hiện các yêu cầu trong phần HTTP body. Phần này khá quan trọng để phân
tích các khai thác dựa vào HTTP method cũng như dựa vào URL như SQL
Injection, Reflect XSS, Local file include …
Request body (2)
Bước 2 là quá trình kiểm tra chính trong quá trình client gởi request đến
server, phần này sẽ có hiệu quả khi người dùng cố sử dụng phương thức POST
hoặc PUT để upload tập tin lên phía server. Việc kiểm tra này bảo đảm dữ liệu

13


đưa lên server là an toàn, tránh tình trạng upload mã độc hoặc các dạng tấn
công nhưng Stored XSS, Ajax Injection …
Response headers (3)
Những request đã được xử lý tại server sẽ được trả về cho ModSecurity

kiểm tra trạng thái trong phần respone header. Trước khi phần respone body
được đọc thì ModSecurity sẽ dựa vào tập rule để xác định có cần kiểm tra nội
dung dữ liệu trong phần body hay không.
Ví dụ: mã trạng thái trả về là 404 (Not found) thì lúc này sẽ không cần kiểm tra
nội dung gói tin trả về.
Response body (4)
Sau khi ModSecurity đã hoàn thành việc kiểm tra tại respone header thì nội
dung trong phần body sẽ được kiểm tra so trùng với mẫu trong tập lệnh. Việc này
là khá hiệu quả để phát hiện và phòng chống xâm nhập trong trường hợp bước 1
và 2 không phát hiện được tấn công.
Ví dụ: trong khai thác SQL injection, nếu hacker cố gắng sử dụng một số
công nghệ evasion thì việc phát hiện khi request là khó khăn. Khi khai thác thành
công, ModSecurity sẽ phân tích kết quả trong gói tin trả về để phát hiện nếu như
câu truy vấn thành công.
Logging (5)
Việc ghi log sẽ ghi nhận các cảnh báo cũng như quy trình làm việc của
ModSecurity.
1.5. Khuyến cáo khi triển khai thực tế
Nhằm bảo đảm tính tính linh động trong việc phát hiện cũng như bảo vệ
theo thời gian thực, ModSecurity cần sử dụng một lượng tài nguyên CPU và
RAM để bảo đảm hoạt động đúng mục đích khi triển khai. Việc sử dụng tài
nguyên phụ thuộc nhiều vào phần cấu hình và cách triển khai trên từng hệ thống
khác nhau. Dưới dây là một số điểm chính cần chú ý:
ModSecurity sẽ phân tích các cú pháp mà apache sẽ thực hiện, vì thế hệ
thống của bạn sẽ có thể tăng tiêu thụ tài nguyên CPU để thực hiện tác vụ.
Việc phân tích linh động trong một số trường hợp sẽ cần một lượng tài
nguyên khá lớn để phân tích. Ví dụ: XML, JSON, AJAX …
Việc quản lý dữ liệu upload từ phía client yêu cầu thêm tài nguyên I/O (như
HDD), trong một số trường hợp sẽ gây ra tình trạng trùng lặp dữ liệu trên hệ
thống.

Dữ liệu trong request và resopone được lưu trữ đệm trong RAM để thực
hiện các tác vụ chặn theo thời gian thực.
Mỗi rule trong phần cấu hình sẽ sử dụng CPU (cho phần operartor) và
RAM (dùng để chuyển đổi dữ liệu đầu vào trước khi qua phiên phân tích)
14


Việc sử dụng các Regular expression sẽ tốn các tài nguyên nhiều hơn.
Các hoạt động I/O sẽ tăng cao cho việc ghi nhật ký trong quá trình hoạt
động của ModSecurity (full transaction loging).
Khi triển khai thực tế ModSecurity, bạn cần chú ý đến những điều trên để
có thể xác định được tài nguyên cần thiết để ModSecurity hoạt động ổn định.
Trong trường hợp bạn không thể thay đổi tài nguyên phần cứng, thì tôi khuyên
bạn nên thường xuyên theo dõi trạng thái hoạt động của hệ thống, rút ra những
kinh nghiệm nhằm điều chỉnh hoặc giảm bớt chức năng, ruleset phù hợp mà vẫn
đảm bảo an toàn cho việc hoạt động. Nếu như tổ chức mà bạn đang quản lý sử
dụng một số công nghệ ảo hóa thì việc điều chỉnh tài nguyên sẽ thuận tiện hơn
để ModSecurity hoạt động.
Một cách khác để triển khai ModSecurity trên thực thế là dùng như một
reverse proxy, trong trường hợp này tài nguyên cho ModSecurity sẽ ổn định hơn
so với hệ thống tích hợp (CPU, RAM, I/O hoạt động ở trạng thái cao).

2. Cài đặt - thực nghiệm
2.1. Cài đặt và cấu hình
Trước khi cài đặt, chúng ta phải đảm bảo web server Apache đã hoạt động
tốt. Distro Linux sử dụng là CentOS5 và phiên bản ModSecurity sử dụng là 2.5.
Có thể thực hiện trên các Distro khác như Ubuntu, Fedora…
- Thực hiện tải mã nguồn về:

wget />.......

01:52:06 (161 KB/s) - `modsecurity-apache_2.5.11.tar.gz' saved
[1338425/1338425]
- Thực hiện tra tính toàn vẹn của mã nguồn (việc này không bắt buộc nhưng

chúng ta nên có thói quen kiểm tra để đảm bảo rằng mã nguồn đã không bị
can thiệp vào dưới bất kỳ hình thức nào). Có thể sử dụng MD5 hay PGP để
làm việc này. Ở đây sử dụng PGP
+ Đầu tiên cần download chữ ký
wget />......
02:04:38 (14.8 MB/s) - `modsecurity-apache_2.5.11.tar.gz.asc'
saved [189/189]

+ Download Publick Key:
gpg --keyserver pgp.mit.edu --recv-key E77B534D
.....
gpg: Total number processed: 1
15


gpg:

imported: 1

+ Kiểm tra chữ ký:
gpg --verify modsecurity-apache_2.5.11.tar.gz.asc
......
gpg: Good signature from "Brian Rectanus (work)
<>"
gpg:
aka "Brian Rectanus <>"

gpg:
aka "Brian Rectanus (personal)
<>"

Kiểm tra thành công. Thực hiện giải nén mã nguồn:

-

tar xfvz modsecurity-apache_2.5.11.tar.gz

Kiểm tra các gói thư viện cần thiết, ModSecurity yêu cầu có 4 thành phần sau
trước khi biên dịch:
+ apxs : Kiểm tra bằng cách :

-

whereis -b apxs
......
apxs: /usr/sbin/apxs

Nếu chưa có, chúng ta phải cài thêm gói httpd-devel (hay apache2-dev đối với
dòng debian,ubuntu.. )
yum install httpd-devel

(hoặc apt-get install apache2-dev)

+ libxml2: Kiểm tra bằng cách:
whereis -b libxml2
......
libxml2: /usr/lib/libxml2.a /usr/lib/libxml2.so

/usr/include/libxml2

Nếu chưa có, chúng ta phải cài thêm gói libxml2-devel (hay libxml2-dev đối với
debian,ubuntu…)
yum install libxml2-devel (hoặc apt-get install libxml2-dev)

+ pcre: Kiểm tra bằng cách:
whereis pcre
......
pcre: /usr/include/pcre.h /usr/share/man/man3/pcre.3.gz

Nếu chưa có thì chúng ta phải cài thêm gói pcre-devel :
yum install pcre-devel (hoặc apt-get install pcre-dev)

+ mod_unique_id: Là mod thường đã được biên dịch cùng Apache. Có thể
kiểm tra lại bằng cách tìm trong httpd.conf dòng:
LoadModule unique_id_module modules/mod_unique_id.so

Nếu chưa có, chúng ta phải thêm vào với nội dung như trên.
Chuyển vào thư mục chứa mã nguồn và tiến hành biên dịch:
cd modsecurity-apache_2.5.11/apache2/
+ Tạo Make file:


16


./configure
......
configure: creating ./config.status

config.status: creating Makefile
config.status: creating build/apxs-wrapper
config.status: creating mlogc-src/mlogc-batch-load.pl
config.status: creating t/run-unit-tests.pl
config.status: creating t/run-regression-tests.pl
config.status: creating t/gen_rx-pm.pl
config.status: creating t/csv_rx-pm.pl
config.status: creating t/regression/server_root/conf/httpd.conf
config.status: creating ../tools/rules-updater.pl
config.status: creating mlogc-src/Makefile
config.status: creating mod_security2_config.h

+ Tiến hành biên dịch:
make

Sau khi biên dịch thành công file mod_security2.so sẽ được tạo ra trong thư mục
libs.
Tích hợp ModSecurity vào Apache
Để Apache nhận ra sự tồn tại của ModSecurity chúng ta cần copy
mod_security2.so đến thư mục chứa modules của apache, đối với distro CentOS
là /etc/httpd/modules
-

cp /libs/mod_security2.so /etc/httpd/modules/

Sửa lại file httpd.conf để thực hiện load module ModSecurity:
vi

/etc/httpd/conf/httpd.conf


Thêm dòng
LoadModule security2_module modules/mod_security2.so

Quy định file cấu hình ModSecurity
Chúng ta có thể cấu hình trực tiếp các thông số và rule của ModSecurity vào file
httpd.conf. Nhưng để cho rõ ràng và đảm bảo không sai sót trong quá trình thực
hiện – gây ảnh hưởng Apache, Chúng ta nên tạo một file cấu hình riêng và sau
đó include vào. Trong CentOS các file cấu hình riêng mặc định chứa trong
/etc/httpd/conf.d/
-

vi /etc/httpd/conf.d/modsecurity.conf

Thêm vào các thông số cấu hình cơ bản:
<IfModule security2_module>
# Bat che do loc cua Modsecurity
SecRuleEngine On
# Thiet lap action mac dinh
SecDefaultAction "phase:2,deny,log,status:404"
17


# rule thu nghiem block tat ca request co uri chua "hacker"
SecRule REQUEST_URI "hacker"
</IfModule>

Thực hiện thử nghiệm để kiểm tra hoạt động của ModSecurity. Tiến hành tạo 2
file trong thư mục web, hacker.html và index.html chẳng hạn. Khi chúng ta truy
cập vào file index.html thì trình duyệt trả về kết quả bình thường. Còn khi truy cập
vào hacker.html thì trình duyệt báo lỗi :

404 – Forbidden

Đó là kết quả do ModSecurity đã chặn những URI có chứa chuỗi hacker và cũng
đồng nghĩa với việc ModSecurity đã hoạt động.
2.2. Viết Rules
2.2.1. Cú pháp SecRule
SecRule được sử dụng để tạo các rule cho ModSecurity . Cú pháp rất đơn giản
SecRule Target Operator [Actions]

Target (mục tiêu): Quy định cụ thể mục tiêu của request hoặc response
mà chúng ta muốn kiểm tra. Trong ví dụ kiểm cơ bản được đưa ra trong phần
trước, sử dụng biến có tên REQUEST_URI, trong đó có các URI được request
trên server, để nhận diện và chặn bất cứ Client nào truy cập vào các vị
trí /hacker.html. Hiện có hơn 70 biến có thể được sử dụng để tạo rule.
Ngoài ra còn có một loại biến đặc biệt được gọi là biến collection có thể
chứa nhiều đối số. Một ví dụ về collection làARGS, trong đó có chứa tất cả các
đối số được truyền trong một chuỗi truy vấn hoặc thông qua một request POST.
Phần Operator xác định phương pháp và so sánh khớp dữ liệu để kích
hoạt Action. Với Operator, mặc định là @rx
Cuối cùng, Actions (hành động) là một danh sách các hành động được
thực hiện nếu phù hợp (matching) rule. Action có thể là allow (cho phép) hoặc
deny (từ chối) các request; và quy định cụ thể các mã trạng thái (status code) khi
trả về (response) cho client. Nếu không có action nào được quy định, các action
mặc định của action SecDefaultAction sẽ được sử dụng (rule chứa action này
thường được khai báo đầu tiên).
Để làm rõ hơn, chúng ta xem ví dụ. Giả sử chúng ta là một chủ doanh
nghiệp nhỏ bán sách dạy nấu ăn ở định dạng file PDF trên website. Để lôi kéo
khách hàng mua sách, chúng ta cung cấp một chương mẫu có chứa các công
thức nấu ăn ngon nhất trong cuốn sách, mà họ có thể tải về miễn phí để xem
trước khi quyết định mua.

Công việc kinh doanh đang ổn định, nhưng sau đó đột nhiên chúng ta
nhận được đơn khiếu nại qua email nói rằng trang web của chúng ta rất chậm
hoặc không truy cập được.
18


Khi nhìn vào log chúng ta nhận thấy rằng, một IP kết nối tới server web
tràn ngập với các request cho các chương mẫu. Các chuỗi user-agent thấy được
có tên Red Bullet Downloader . User-agent này của các chương trình Download
nhanh.
Giải pháp đưa ra để giải quyết vấn đề này là dùng Mod Securiry để ngăn
chặn các user-agent này download. Rules được viết như sau.
SecRule REQUEST_HEADERS:User-Agent "Red Bullet" "deny,nolog"

Trong ví dụ trên, REQUEST_HEADERS là một Collection chứa tất cả các
trường trong thông điệp header (message header) được gởi đến bởi client và
trong header này chứa User-agent. Vì vậy, ta sử dụng từ khoá cho user-agent là
“Red Bullet” vì từ Red Bullet này thường xuyên xuất hiện trong các header được
gởi đển từ client. Và Action là deny – là từ chối và nolog là không ghi lại log
2.2.1.1. Biến và bộ chọn lọc Collection
Hiện khoản hơn 70 biến có sẵn. ModSecurity sử dụng hai loại biến: biến
Standard, đơn giản chỉ chứa một giá trị duy nhất, và biến Collection, có thể chứa
nhiều hơn một giá trị. Một ví dụ về một Collection là REQUEST_HEADERS, trong
đó chứa tất cả các trường trong thông điệp header mà Client gởi tới Server,
chẳng hạn như User-agent hoặc Referer.
Để truy cập vào một trường trong collection, chúng ta ghi tên collection,
tiếp theo là dấu hai chấm và sau đó là tên của trường hoặc tuỳ chọn mà chúng ta
muốn truy cập. Ví dụ:
SecRule REQUEST_HEADERS:Referer "bad-referer.com"


Trong trường hợp kiểm tra toàn bộ dữ liệu trên tất cả các collection. Ví dụ,
nếu chúng ta muốn kiểm tra sự hiện diện của chuỗi script có thể sử dụng rules
sau đây:
SecRule ARGS "script"

Nếu muốn kiểm tra thêm các chuỗi truy vấn được
username=john&login=yes, chúng ta có thể mở rộng rule bằng cách.
SecRule ARGS:john|ARGS:login "script"

Các collection có sẵn trong ModSecutity 2.5
– ARGS
– ENV
– FILES
– FILES_NAMES
– FILES_SIZES
– FILES_TMPNAMES
– GEO
– IP
– REQUEST_COOKIES
– REQUEST_COOKIES_NAMES
19

gửi




– REQUEST_HEADERS
– REQUEST_HEADERS_NAMES
– RESPONSE_HEADERS

– RESPONSE_HEADERS_NAMES
– SESSION
– TX
– USER
2.2.1.2. Chuyển đổi giữa các Collection
TX Collection còn được gọi là các Transaction collection. Chúng ta có thể
sử dụng nó để tạo ra các biến phục vụ riêng cho mình.
SecRule REQUEST_URI “passwd” “pass,setvar:tx.hackscore=+5”
SecRule TX:HACKSCORE “@gt 10” deny

Trong hai rule đầu tiên sử dụng action setvar để thiết lập các biến
collection. Thực hiện tạo biến hackscore và tăng giá trị lên 5 nếu rule được thực
thi (matching rule). Đến khi biến hackscore có giá trị bằng 10 thì thực thi rule thứ
hai sẽ được thực thi với action là deny.
(Có thể loại bỏ biến bằng cách sử dụng setvar cú pháp setvar:!tx.hackscore)
2.2.1.3. Lưu trữ các Request
Có ba loại collection trong ModSecurity được sử dụng để lưu trữ liên
tục( persistent storage). Như phần trước đã trình bày, setvar giúp tạo ra một biến
và gán giá trị cho nó. Tuy nhiên, biến sẽ hết hạn và không còn nữa khi các
request hiện tại đã được xử lý. Trong một số trường hợp chúng ta muốn lưu trữ
giá trị biến và truy cập nó cho các request sau này, có thể sử dụng kiểu lưu trữ
này.
Có ba collection có thể được sử dụng cho mục đích này:
– IP
– SESSION
– USER
Collection IP được sử dụng để lưu trữ thông tin về IP của người sử dụng.
Nó có thể được sử dụng để lưu trữ IP ở các trường hợp như: Số lần truy cập
không thành công vào tài nguyên trên server, hoặc số lượng các request của
người dùng…

Trước khi sử dụng một trong các collection, chúng ta cần khởi tạo nó. Điều
này được thực hiện bằng cách sử dụng các action initcol:
SecAction initcol:ip=%{REMOTE_ADDR},nolog,pass

Để thực hiện được rule trên, phải chắc chắn đã khai báo đường dẫn đến
thư mục lưu trữ cho ModSecurity
SecDataDir /var/log/httpd/modsec_data

20


2.2.1.4. Kiểm tra nhiều biến
ModSecurity có thể kiểm tra nhiều biến cùng một lúc, mục đích để kết hợp
so sánh (matching) một chuỗi.
SecRule ARGS|REQUEST_HEADERS "park" deny

Dấu (|) được sử dụng để tách các tên biến. Nó cũng có nhiều chức năng
logic giống như “or” trong lập trình.
2.2.1.5. Sử dụng dấu “ khi viết rule
Chúng ta xem xét các rule sau:
SecRule REQUEST_URI "secret" "deny"
SecRule REQUEST_URI secret deny
SecRule REQUEST_URI "secret place" deny

Hai rule đầu đều đúng và có tác dụng như nhau. Dấu (“) được sử dụng để
chứa các cụm từ cách nhau bởi có dấu space. Các đơn từ thì có thể dùng hoặc
không
dùng.
Sử dụng (“) còn để nhóm các thông điệp ghi log.
SecRule REQUEST_URI "secret place" "deny,log,msg:'Someone tried

to access the secret place!'"

Nếu chúng ta muốn đặt dấu (‘) trong thông điệp cần ghi log. Thực hiện
chèn dấu (\) trước dấu (‘).
SecRule REQUEST_URI "secret place"
trying to hack us!'"

"deny,log,msg:'Someone\'s

2.2.1.6. Tạo rule kết chuỗi – chain
Để kết hợp nhiều rule hoạt động liên tiếp với nhau, ta sử dụng chain.
Ví dụ: Người quản trị web server muốn chặn một số người download nhiều
file gây ảnh hưởng đến web server, nhưng một số khách hàng khác cũng
download mà không gây ảnh hưởng đến webserver bởi họ chỉ download vài file
là xong và ta không chặn những người này. Và người quản trị server quyết định
chặn những người có user-agent có chứa “Red Bullet” và IP của người này nằm
trong dãy IP của một ISP xác định. Với từ chain trong action. Sử dụng nó, chúng
ta có thể tạo ra một chain rule mà nếu phù hợp tất cả các rule trong chain thì
action của chain sẽ được thực hiện.
Ví dụ đây là rule cấm người dùng với user-agent có từ “Red Bullet”
SecRule REQUEST_HEADERS:User-agent “Red Bullet” deny

Rule thứ hai là chỉ những client nằm trong dãy IP 192.168.1.0-192.168.1.255:
SecRule REMOTE_ADDR “^192\.168\.1\.”

Để thoả mãn điều kiện đặt ra như trên, ta sử dụng rule chain để kết hợp hai rule
trên:
SecRule REQUEST_HEADERS:User-agent “Red Bullet” “chain,deny”
SecRule REMOTE_ADDR “^192\.168\.1\.”
21



Có thể thêm nhiều rule vào chain rule. Nếu chúng ta muốn thêm điều kiện là các
rule chỉ hoạt động trước 6:00 giờ tối, ta sẽ thêm một rule thứ ba.
SecRule REQUEST_HEADERS:User-agent “Red Bullet” “chain,deny”
SecRule REMOTE_ADDR “^192\.168\.1\.” “chain”
SecRule TIME_HOUR “@lt 18”

Từ @lt viết tắt của “less-than” là nhỏ hơn. Thuộc cú pháp so sánh số
(matching number), sẽ được trình bày chi tiết ở phần 2.2.3.
2.2.1.7. Rule IDs
Chúng ta có thể quản lý các rule bằng cách đặt ID cho mỗi rule.
SecRule ARGS "login" "deny,id:1000"

Một số cú pháp thông thường
– SecRuleRemoveById: Gỡ bỏ rule có ID là
– SecRuleUpdateActionById: Cập nhật rule có ID là

22


2.2.2. Giới thiệu về biểu thức chính quy – Regular expressions
2.2.2.1. Ví dụ về các biểu thức chính quy

Bảng 1 Các biểu thức chính quy
Trong trường hợp muốn cả từ favorite và favourite đều đúng thì có thể
dùng dấu chấm hỏi ?để quy định có thể có hoặc có thể không ký tự u. Cú pháp
sẽ là favou?rite
Trường hợp trên đối với một ký tự u, nếu có nhiều hơn một ký tự chúng ta
có thể nhóm lại bởi hai dấu ngoặc đơn (). Ví dụ với hai từ previous và previously.

Cú pháp sẽ là previous(ly)?

23


2.2.2.2. Các biểu thức chính quy khác

Bảng 2 Các biểu thức chính quy khác
Ví dụ:
SecRule REMOTE_USER "@within tim,john,alice"

2.2.2.3. Sử dụng @ rx để chặn một server từ xa
Ví dụ chúng ta có 2 rule như sau:
# Rule 1
SecRule REMOTE_HOST "@rx \.microsoft\.com$" deny
# Rule 2
SecRule REMOTE_HOST "\.microsoft\.com$" deny

Cả hai rule đề có tác dụng như sau là chặn các host truy cập từ xa từ tập
đoàn Microsoft. Mục tiêu của @rx mà bỏ qua rule thứ hai bởi hai rule đều có mục
đích như nhau.

24


2.2.3. So sánh số (matching number)

Bảng 3 So sánh số
2.2.4. Phases và sắp xếp rule
Điều quan trọng là hiểu được việc sắp xếp rule của ModSecurity. Điều này

tránh các tình huống mà mọi phương thức, hoạt động đều bất ngờ bị chặn(deny)
hoặc cho phép (allow) trái với ý định.
Có 5 giai đoạn (phase)
1. REQUEST_HEADERS (phase 1)
2. REQUEST_BODY (phase 2)
3. RESPONSE_HEADERS (phase 3)
4. RESPONSE_BODY (phase 4)
5. LOGGING (phase 5)
Một rule được thực hiện đúng từng phase theo thứ tự . Điều này có nghĩa
là ModSecurity duyệt tất cả các rule trong phase 1 (“REQUEST_HEADERS”).
Sau đó, đến phase 2…
Trong mỗi phase, rule được xử lý theo thứ tự mà chúng xuất hiện trong
các tập tin cấu hình. Chúng ta có thể hiểu khi có action, ModSecurity sẽ duyệt
các tập tin năm lần, một lần cho từng phase.
Trong thời gian xử lý ModSecurity chỉ xem xét rule thuộc pha hiện đang xử
lý, và những rule được áp dụng theo thứ tự chúng xuất hiện trong các tập tin cấu
hình.
Phase LOGGING đặc biệt ở chỗ nó luôn luôn được thực hiện cả khi
request đã được cho phép hay từ chối trong các phase trước đó. Ngoài ra, một
25


×