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 CHƯƠNG I. TỔNG QUAN MÁY CHỦ WEB APACHE 1. Giới thiệu về máy chủ web (web server) 2. Máy chủ web Apache 3. Một số biện pháp bảo mật cho máy chủ web Apache CHƯƠNG II. MODULE MODSERCURITY. (có tất tần tật)
Trang 1HỌ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:
Lớp: AT9A
Hà Nội, 06 - 2016
Trang 2HỌ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:
Trang 3MỤC LỤC
Trang 4DANH MỤC HÌNH ẢNH VÀ BẢNG BIỂU
Trang 5LỜ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àngChú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
Trang 6CHƯƠ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 http://www.abc.com.vn 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:
Trang 7- 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,
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:
- 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 )
Trang 8Cậ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”
Trang 9“ 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
Trang 10Việ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:
Ẩ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
Trang 11CHƯƠ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 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
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)
Trang 12ModSecurity 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 https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project)
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)
Trang 131.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
Trang 14đư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)
Trang 15Việ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
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
http://www.modsecurity.org/download/modsecurity-apache_2.5.11.tar.gz
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
http://www.modsecurity.org/download/modsecurity-apache_2.5.11.tar.gz.asc
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
Trang 16yum install httpd-devel (hoặc apt-get install apache2-dev)
+ libxml2: Kiểm tra bằng cách:
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:
Trang 17
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.confconfig.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
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/
Trang 18# 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 :
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
Trang 19Khi 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 gửi là
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
Trang 202.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)
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
Trang 212.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
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" "deny,log,msg:'Someone\'s trying to hack us!'"
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:
Trang 22Có 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à
Trang 232.2.2.Giới thiệu về biểu thức chính quy – Regular expressions
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)?
Trang 24SecRule 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
Trang 25Có 5 giai đoạn (phase)
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
Trang 26khi phase LOGGING bắt đầu, chúng ta không thể thực hiện bất kỳ action ngăn chặn nào vì response đã được gửi cho người truy cập.
Vì vậy, chúng ta phải cẩn thận không để cho bất kỳ action nào trái quy định được truyền vào rule ở phase 5 Nếu không sẽ gây lỗi làm Apache không khởi động được Nếu chúng ta đặt rule sau đây trước các rule thuộc phase 5 sẽ ngăn chặn được lỗi này xảy ra (nhưng phải đặt sau các rule của phase trước đó)
SecDefaultAction "phase:5,pass"
2.2.5.Chức năng chuyển đổi
ModSecurity cung cấp một số chức năng chuyển đổi mà chúng ta có thể
áp dụng cho các biến và các collection Những biến đổi được thực hiện trên một bản sao của dữ liệu được kiểm tra, có nghĩa là các HTTP request hoặc response ban đầu vẫn được giữ nguyên, không thay đổi
Chức năng này rất quan trọng Nếu chúng ta muốn phát hiện tấn công XSS (cross-site scripting), chúng ta phải phát hiện mã JavaScript bất kể trường hợp nó được viết in hay viết thường Để làm điều này, chức năng chuyển đổi có thể được áp dụng để so sánh một chuỗi viết hoa với chuỗi viết thường
SecRule ARGS "<script" "deny,t:lowercase"
Rule trên sẽ chặn tất cả các URL chứa chuỗi >;<;script bất kể chữ hoa thường, vd sCript; >;<;scripT