Thứ sáu, 05/06/2015 | 00:00 GMT+7

Cách thiết lập ModSecurity với Apache trên Ubuntu 14.04 và Debian 8

ModSecurity là một firewall ứng dụng web miễn phí (WAF) hoạt động với Apache, Nginx và IIS. Nó hỗ trợ công cụ luật linh hoạt để thực hiện các hoạt động đơn giản và phức tạp và đi kèm với Bộ luật cốt lõi (CRS) có các luật cho việc đưa vào SQL, tập lệnh trang web chéo, Trojan, tác nhân user xấu, chiếm quyền điều khiển phiên và nhiều cách khai thác khác. Đối với Apache, nó được tải như một module bổ sung giúp dễ dàng cài đặt và cấu hình.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

  • Một server Ubuntu 14.04 hoặc Debian 8.

  • Tài khoản user tiêu chuẩn có quyền sudo, bạn có thể cài đặt account này theo hướng dẫn cài đặt server ban đầu cho Ubuntu 14.04 hoặc Debian 8 .

  • LAMP mà bạn có thể cài đặt theo hướng dẫn dành cho Ubuntu 14.04 hoặc Debian 8 .

Bước 1 - Cài đặt ModSecurity

Trong bước này, ta sẽ cài đặt ModSecurity.

Đầu tiên, hãy cập nhật các file index gói .

  • sudo apt-get update

Sau đó, cài đặt ModSecurity.

  • sudo apt-get install libapache2-mod-security2 -y

Bạn có thể xác minh module ModSecurity đã được tải bằng lệnh sau.

  • sudo apachectl -M | grep --color security2

Nếu kết quả đọc security2_module (shared) , điều này cho biết rằng module đã được tải.

Cài đặt của ModSecurity bao gồm một file cấu hình được khuyến khích phải được đổi tên.

  • sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

Cuối cùng, reload Apache.

  • sudo service apache2 reload

Một file log mới cho ModSecurity sẽ được tạo trong folder log Apache tại /var/log/apache2/modsec_audit.log .

Bước 2 - Cấu hình ModSecurity

Ngoài ra, ModSecurity không làm bất cứ điều gì vì nó cần các luật để hoạt động. Trong bước này, trước tiên ta sẽ kích hoạt một số chỉ thị cấu hình.

Để tìm và thay thế các chỉ thị cấu hình trong bước này, ta sẽ sử dụng sed , một editor stream . Bạn có thể đọc loạt bài hướng dẫn về sed để tìm hiểu thêm về công cụ này.

Hướng dẫn cơ bản để bật

Tệp cấu hình ModSecurity mặc định được đặt thành DetectionOnly , file này ghi lại các yêu cầu theo luật khớp và không chặn bất kỳ thứ gì. Điều này có thể được thay đổi bằng cách chỉnh sửa file modsecurity.conf và sửa đổi chỉ thị SecRuleEngine . Nếu bạn đang thử điều này trên server production , chỉ thay đổi chỉ thị này sau khi kiểm tra tất cả các luật của bạn.

  • sudo sed -i "s/SecRuleEngine DetectionOnly/SecRuleEngine On/" /etc/modsecurity/modsecurity.conf

Chỉ thị SecResponseBodyAccess cấu hình xem các phần tử phản hồi có được lưu vào cache hay không (tức là được đọc bởi ModSecurity). Điều này chỉ cần thiết nếu cần phát hiện và bảo vệ rò rỉ dữ liệu. Do đó, để nó bật sẽ sử dụng hết tài nguyên của Server và cũng làm tăng kích thước file log , vì vậy ta sẽ tắt nó đi.

  • sudo sed -i "s/SecResponseBodyAccess On/SecResponseBodyAccess Off/" /etc/modsecurity/modsecurity.conf

Hướng dẫn tùy chọn để sửa đổi

Có các lệnh khác mà bạn có thể cần tùy chỉnh bằng cách chỉnh sửa /etc/modsecurity/modsecurity.conf . Các SecRequestBodyLimitSecRequestBodyNoFilesLimit giới hạn dữ liệu tối đa có thể được đăng lên ứng dụng web của bạn.

Đặc biệt, chỉ thị SecRequestBodyLimit chỉ định kích thước dữ liệu POST tối đa. Nếu bất kỳ thứ gì lớn hơn được gửi bởi client , server sẽ phản hồi với lỗi 413 Thực thể Yêu cầu Quá lớn . Nếu ứng dụng web của bạn không có các file tải lên nào, giá trị này có thể được giữ nguyên. Giá trị được cấu hình trước được chỉ định trong file cấu hình là 13107200 byte (12,5MB). Nếu bạn muốn thay đổi giá trị này, hãy tìm dòng sau đây modsecurity.conf :

Thay đổi chỉ thị `modsecurity.conf` tùy chọn
SecRequestBodyLimit 13107200 

Tương tự, SecRequestBodyNoFilesLimit giới hạn kích thước của dữ liệu POST trừ tải lên file . Giá trị này nên được đặt càng thấp càng tốt để giảm khả năng bị tấn công từ chối dịch vụ (DoS) khi ai đó đang gửi các phần thể yêu cầu có kích thước rất lớn. Giá trị được cấu hình trước trong file cấu hình là 131072 byte (128KB). Nếu bạn muốn thay đổi giá trị này, hãy tìm dòng sau đây modsecurity.conf :

Thay đổi chỉ thị `modsecurity.conf` tùy chọn
SecRequestBodyNoFilesLimit 131072 

Một chỉ thị ảnh hưởng đến hiệu suất server là SecRequestBodyInMemoryLimit . Chỉ thị này khá dễ hiểu; nó chỉ định lượng dữ liệu “phần thân yêu cầu” (dữ liệu POSTed) sẽ được giữ trong bộ nhớ (RAM), bất kỳ thứ gì khác sẽ được đặt trong đĩa cứng (giống như swap ). Vì Server sử dụng SSD nên đây không phải là vấn đề nhiều. Tuy nhiên, điều này có thể được thay đổi nếu bạn còn RAM. Giá trị được cấu hình trước cho chỉ thị này là 128KB. Nếu bạn muốn thay đổi giá trị này, hãy tìm dòng sau đây modsecurity.conf :

Thay đổi chỉ thị `modsecurity.conf` tùy chọn
SecRequestBodyInMemoryLimit 131072 

Bước 3 - Kiểm tra SQL Injection

Trước khi cấu hình một số luật , ta sẽ tạo một tập lệnh PHP dễ bị tấn công bởi SQL injection để kiểm tra khả năng bảo vệ của ModSecurity.

Lưu ý: đây là tập lệnh đăng nhập PHP cơ bản không có xử lý phiên hoặc vệ sinh biểu mẫu. Nó chỉ được dùng làm ví dụ để kiểm tra các luật SQL injection và ModSecurity. Nó sẽ được gỡ bỏ trước khi kết thúc hướng dẫn.

Đầu tiên, truy cập dấu nhắc MySQL.

  • mysql -u root -p

Tại đây, hãy tạo một database MySQL được gọi là mẫu và kết nối với nó.

  • create database sample;
  • connect sample;

Sau đó, tạo một bảng chứa một số thông tin đăng nhập - tên user sammy và mật khẩu password .

  • create table users(username VARCHAR(100),password VARCHAR(100));
  • insert into users values('sammy','password');

Cuối cùng, thoát khỏi dấu nhắc MySQL.

  • quit;

Tiếp theo, tạo tập lệnh đăng nhập trong root tài liệu của Apache.

  • sudo nano /var/www/html/login.php

Dán tập lệnh PHP sau vào file . Đảm bảo thay đổi password MySQL trong tập lệnh bên dưới thành password bạn đã đặt trước đó để tập lệnh có thể kết nối với database :

/var/www/html/login.php
 <html> <body> <?php     if(isset($_POST['login']))     {         $username = $_POST['username'];         $password = $_POST['password'];         $con = mysqli_connect('localhost','root','your_mysql_password','sample');         $result = mysqli_query($con, "SELECT * FROM `users` WHERE username='$username' AND password='$password'");         if(mysqli_num_rows($result) == 0)             echo 'Invalid username or password';         else             echo '<h1>Logged in</h1><p>This is text that should only be displayed when logged in with valid credentials.</p>';     }     else     { ?>         <form action="" method="post">             Username: <input type="text" name="username"/><br />             Password: <input type="password" name="password"/><br />             <input type="submit" name="login" value="Login"/>         </form> <?php     } ?> </body> </html> 

Tập lệnh này sẽ hiển thị một biểu mẫu đăng nhập. Mở trình duyệt của bạn và chuyển đến http:// your_server_ip /login.php để xem. Nếu bạn nhập đúng cặp thông tin đăng nhập, ví dụ: sammy trong trường Tên user và password trong trường Mật khẩu , bạn sẽ thấy thông báo Đây là văn bản chỉ hiển thị khi đăng nhập bằng thông tin đăng nhập hợp lệ . Nếu bạn chuyển trở lại màn hình đăng nhập và sử dụng thông tin đăng nhập không chính xác, bạn sẽ thấy thông báo Tên user hoặc password không hợp lệ .

Công việc tiếp theo là thử một SQL injection để bỏ qua trang đăng nhập. Nhập thông tin sau cho trường tên user .

Tên user SQL injection
' or true --  

Lưu ý phải có một khoảng trống sau -- để tiêm này hoạt động. Để trống trường password và nhấn nút đăng nhập. Tập lệnh hiển thị thông báo dành cho user đã xác thực! Trong bước tiếp theo, ta sẽ ngăn chặn điều này.

Bước 4 - Cài đặt luật

Trong bước này, ta sẽ cài đặt một số luật ModSecurity.

Bật CRS

Để làm cho mọi thứ dễ dàng hơn, có rất nhiều luật đã được cài đặt cùng với ModSecurity. Chúng được gọi là CRS (Bộ luật cốt lõi) và nằm trong folder /usr/share/modsecurity-crs . Để tải các luật này, ta cần cấu hình Apache để đọc các file .conf trong các folder này, vì vậy hãy mở file security2.conf để chỉnh sửa.

sudo nano /etc/apache2/mods-enabled/security2.conf 

Thêm hai lệnh sau, được đánh dấu màu đỏ, bên trong trước dòng cuối cùng trong file ( </IfModule> ).

Đã cập nhật security2.conf
        IncludeOptional /etc/modsecurity/*.conf         IncludeOptional "/usr/share/modsecurity-crs/*.conf"         IncludeOptional "/usr/share/modsecurity-crs/activated_rules/*.conf" </IfModule> 

Lưu và đóng file .

Loại trừ Thư mục / Tên domain (Tùy chọn)

Đôi khi, việc loại trừ một folder cụ thể hoặc một domain nếu nó đang chạy một ứng dụng, chẳng hạn như phpMyAdmin, là hợp lý vì ModSecurity sẽ chặn các truy vấn SQL. Tốt hơn là nên loại trừ phần backend quản trị của các ứng dụng CMS như WordPress. Nếu bạn đang làm theo hướng dẫn này trên một server mới, bạn có thể bỏ qua bước này.

Để tắt ModSecurity cho một VirtualHost hoàn chỉnh, hãy đặt các lệnh sau bên trong khối <VirtualHost>[...]</VirtualHost> trong file server ảo của nó.

<IfModule security2_module>     SecRuleEngine Off </IfModule> 

Để bỏ qua một folder cụ thể (ví dụ: /var/www/wp-admin ):

<Directory "/var/www/wp-admin">     <IfModule security2_module>         SecRuleEngine Off     </IfModule> </Directory> 

Nếu bạn không muốn tắt hoàn toàn ModSecurity trong một folder , hãy sử dụng lệnh SecRuleRemoveById để xóa một luật hoặc chuỗi luật cụ thể bằng cách chỉ định ID của nó.

<LocationMatch "/wp-admin/update.php">     <IfModule security2_module>         SecRuleRemoveById 981173     </IfModule> </LocationMatch> 

Kích hoạt luật tiêm SQL

Tiếp theo, ta sẽ kích hoạt file luật chèn SQL. Các file luật cần phải được symlinked để activated_rules folder , mà là tương tự như Apache mods-enabled folder . Để thay đổi activated_rules folder .

  • cd /usr/share/modsecurity-crs/activated_rules/

Sau đó, tạo một softlink từ file modsecurity_crs_41_sql_injection_attacks.conf .

  • sudo ln -s ../base_rules/modsecurity_crs_41_sql_injection_attacks.conf .

Cuối cùng, reload Apache để các luật có hiệu lực.

  • sudo service apache2 reload

Bây giờ, hãy mở trang đăng nhập mà ta đã tạo trước đó và thử sử dụng cùng một truy vấn SQL injection trên trường tên user . Vì ta đã thay đổi chỉ thị SecRuleEngine thành On trong bước 2, lỗi 403 Forbidden được hiển thị. (Nếu SecRuleEngine được để tùy chọn DetectionOnly , quá trình tiêm sẽ thành công nhưng nỗ lực sẽ được ghi vào file modsec_audit.log .)

Bởi vì tập lệnh đăng nhập PHP này chỉ nhằm mục đích kiểm tra ModSecurity, bạn nên xóa nó ngay bây giờ khi quá trình kiểm tra đã hoàn tất.

  • sudo rm /var/www/html/login.php

Bước 5 - Viết các luật của bạn

Trong phần này, ta sẽ tạo một chuỗi luật chặn yêu cầu nếu một số từ nhất định thường được liên kết với spam được nhập vào biểu mẫu HTML.

Đầu tiên, ta sẽ tạo một tập lệnh PHP mẫu lấy đầu vào từ một hộp văn bản và hiển thị lại cho user . Mở một file có tên là form.php để chỉnh sửa.

  • sudo nano /var/www/html/form.php

Dán mã sau:

/var/www/html/form.php
<html>     <body>         <?php             if(isset($_POST['data']))                 echo $_POST['data'];             else             {         ?>                 <form method="post" action="">                         Enter something here:<textarea name="data"></textarea>                         <input type="submit"/>                 </form>         <?php             }         ?>     </body> </html> 

Các luật tùy chỉnh có thể được thêm vào các file cấu hình nào hoặc được đặt trong các folder ModSecurity. Ta sẽ đặt các luật của bạn trong một file mới riêng biệt có tên là modsecurity_custom_rules.conf .

sudo nano /etc/modsecurity/modsecurity_custom_rules.conf 

Dán phần sau vào file này. Hai từ mà ta đang chặn là từ khóa1 và từ khóa bị chặn2 .

modsecurity_custom_rules.conf
SecRule REQUEST_FILENAME "form.php" "id:'400001',chain,deny,log,msg:'Spam detected'" SecRule REQUEST_METHOD "POST" chain SecRule REQUEST_BODY "@rx (?i:(blockedword1|blockedword2))" 

Cú pháp cho SecRuleSecRule VARIABLES OPERATOR [ACTIONS] . Ở đây, ta đã sử dụng chuỗi hành động để so khớp các biến REQUEST_FILENAME với form.php , REQUEST_METHOD với POSTREQUEST_BODY với chuỗi biểu thức chính quy (@rx) (blockedword1|blockedword2) . Dấu ?i: không phân biệt chữ hoa chữ thường. Khi kết hợp thành công cả ba luật này, ACTION là từ chối và ghi log với thông báo msg "Spam detected." Hành động chuỗi mô phỏng AND logic để phù hợp với cả ba luật .

Lưu file và reload Apache.

sudo service apache2 reload 

Mở http:// your_server_ip /form.php trong trình duyệt. Nếu nhập văn bản có chứa từ khóa1 hoặc từ khóa bị chặn2, bạn sẽ thấy trang 403.

Bởi vì tập lệnh biểu mẫu PHP này chỉ dùng để kiểm tra ModSecurity, bạn nên xóa nó ngay bây giờ khi quá trình kiểm tra đã hoàn tất.

  • sudo rm /var/www/html/form.php

Kết luận

Trong hướng dẫn này, bạn đã học cách cài đặt và cấu hình ModSecurity cũng như thêm các luật tùy chỉnh. Để tìm hiểu thêm, bạn có thể xem tài liệu ModSecurity chính thức .


Tags:

Các tin liên quan

Cách chạy trang web Django với Apache, mod_wsgi và MySQL trên FreeBSD 10.1
2015-05-29
Cách chuyển hướng www thành không có www bằng Apache trên Ubuntu 14.04
2015-05-04
Cách chuyển hướng www thành không có www bằng Apache trên CentOS 7
2015-05-04
Cách thiết lập server Apache, MySQL và Python (LAMP) mà không cần khung trên Ubuntu 14.04
2015-04-29
Cách cấu hình bộ đệm nội dung Apache trên CentOS 7
2015-04-13
Cách cấu hình bộ đệm nội dung Apache trên Ubuntu 14.04
2015-04-10
Cách cài đặt database Apache Accumulo NoSQL thân thiện với dữ liệu lớn trên Ubuntu 14.04
2015-03-19
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên CentOS 7
2015-03-19
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Ubuntu 14.04
2015-03-18
Cách cấu hình Apache bằng Ansible trên Ubuntu 14.04
2015-02-18