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 SecRequestBodyLimit và SecRequestBodyNoFilesLimit 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 :
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 :
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 :
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 :
 <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 .
' 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> ).
        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:
<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 .
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 SecRule là SecRule 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 POST và REQUEST_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 .
Các tin liên quan
Cách chạy trang web Django với Apache, mod_wsgi và MySQL trên FreeBSD 10.12015-05-29
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 chuyển hướng www thành không có www bằng Apache trên Ubuntu 14.04
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 cung cấp các ứng dụng Django với Apache và mod_wsgi trên CentOS 7
2015-03-19
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 Ubuntu 14.04
2015-03-18
Cách cấu hình Apache bằng Ansible trên Ubuntu 14.04
2015-02-18
 

