Cách thiết lập mod_security với Apache trên Debian / Ubuntu
Khúc dạo đầu
Mod security là một Tường lửa Ứng dụng Web (WAF) miễn phí 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ó là một module bổ sung giúp dễ dàng cài đặt và cấu hình.
Để hoàn thành hướng dẫn này, bạn cần cài đặt LAMP trên server của bạn .
Cài đặt mod_security
Modsecurity có sẵn trong repository lưu trữ Debian / Ubuntu:
apt-get install libapache2-modsecurity
Xác minh xem module mod_security đã được tải chưa.
apachectl -M | grep --color security
Bạn sẽ thấy một module có tên là security2_module (shared)
cho biết rằng module đã được tải.
Cài đặt của Modsecurity bao gồm file cấu hình được khuyến khích phải được đổi tên:
mv /etc/modsecurity/modsecurity.conf{-recommended,}
Reload Apache
service apache2 reload
Bạn sẽ tìm thấy một file log mới cho mod_security trong folder log Apache:
root@server:~# ls -l /var/log/apache2/modsec_audit.log
-rw-r----- 1 root root 0 Oct 19 08:08 /var/log/apache2/modsec_audit.log
Cấu hình mod_security
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. Tệp cấu hình mặc định được đặt thành DetectionOnly ghi lại các yêu cầu theo luật phù hợ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
:
nano /etc/modsecurity/modsecurity.conf
Tìm dòng này
SecRuleEngine DetectionOnly
và thay đổi nó thành:
SecRuleEngine On
Nếu bạn đang thử điều này trên server production , chỉ thay đổi chỉ thị này sau khi thử nghiệm tất cả các luật của bạn.
Một chỉ thị khác để sửa đổi là SecResponseBodyAccess
. Điều này cấu hình xem các cơ quan 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 tài nguyên server và cũng làm tăng kích thước file log.
Tìm thấy điều này
SecResponseBodyAccess On
và thay đổi nó thành:
SecResponseBodyAccess Off
Bây giờ ta sẽ giới hạn dữ liệu tối đa có thể được đăng lên ứng dụng web của bạn. Hai chỉ thị cấu hình những điều này:
SecRequestBodyLimit
SecRequestBodyNoFilesLimit
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 nào tải lên, giá trị này có thể bị giảm đáng kể.
Giá trị được đề cập trong file cấu hình là
SecRequestBodyLimit 13107200
là 12,5 MB.
Tương tự với điều này là chỉ thị SecRequestBodyNoFilesLimit
. Sự khác biệt duy nhất là chỉ thị này giới hạn kích thước của dữ liệu POST trừ tải file lên - giá trị này phải ở mức "thấp nhất có thể."
Giá trị trong file cấu hình là
SecRequestBodyNoFilesLimit 131072
là 128KB.
Dọc theo dòng của các chỉ thị này là một chỉ thị khác ảnh hưởng đến hiệu suất server : 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 đặt một giá trị phù hợp nếu bạn có RAM dự phòng.
SecRequestBodyInMemoryLimit 131072
Đây là giá trị (128KB) được chỉ định trong file cấu hình.
Kiểm tra SQL Injection
Trước khi tiếp tục cấu hình các luật , ta sẽ tạo một tập lệnh PHP dễ bị chèn SQL và thử nó. Xin lưu ý đây chỉ là một tập lệnh đăng nhập PHP cơ bản không có xử lý phiên. Đảm bảo thay đổi password MySQL trong tập lệnh bên dưới để nó sẽ kết nối với database :
/var/www/login.php
<html>
<body>
<?php
if(isset($_POST['login']))
{
$username = $_POST['username'];
$password = $_POST['password'];
$con = mysqli_connect('localhost','root','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>A Secret for you....</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. Nhập thông tin đăng nhập phù hợp sẽ hiển thị thông báo “Bí mật dành cho bạn”.
Ta cần thông tin xác thực trong database . Tạo database MySQL và bảng, sau đó chèn tên user và password .
mysql -u root -p
Thao tác này sẽ đưa bạn đến dấu nhắc mysql>
create database sample;
connect sample;
create table users(username VARCHAR(100),password VARCHAR(100));
insert into users values('jesin','pwd');
insert into users values('alice','secret');
quit;
Mở trình duyệt của bạn, chuyển đến http://yourwebsite.com/login.php
và nhập cặp thông tin đăng nhập phù hợp.
Username: jesin
Password: pwd
Bạn sẽ thấy một thông báo cho biết đăng nhập thành công. Bây giờ, hãy quay lại và nhập sai cặp thông tin đăng nhập– bạn sẽ thấy thông báo Tên user hoặc password không hợp lệ .
Ta có thể xác nhận tập lệnh hoạt động đúng. Công việc tiếp theo là ta hãy thử với SQL injection để vượt 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 --
quá trình tiêm này sẽ không hoạt động nếu không có khoảng trống đó. Để trống trường mật khẩu và nhấn nút đăng nhập.
Thì đấy! Tập lệnh hiển thị thông báo dành cho user đã xác thực.
Cài đặt luật
Để làm cho cuộc sống của bạn dễ dàng hơn, có rất nhiều luật đã được cài đặt cùng với mod_security. Chúng được gọi là CRS (Bộ luật cốt lõi) và nằm trong
root@server:~# ls -l /usr/share/modsecurity-crs/
total 40
drwxr-xr-x 2 root root 4096 Oct 20 09:45 activated_rules
drwxr-xr-x 2 root root 4096 Oct 20 09:45 base_rules
drwxr-xr-x 2 root root 4096 Oct 20 09:45 experimental_rules
drwxr-xr-x 2 root root 4096 Oct 20 09:45 lua
-rw-r--r-- 1 root root 13544 Jul 2 2012 modsecurity_crs_10_setup.conf
drwxr-xr-x 2 root root 4096 Oct 20 09:45 optional_rules
drwxr-xr-x 3 root root 4096 Oct 20 09:45 util
Tài liệu có sẵn tại
root@server1:~# ls -l /usr/share/doc/modsecurity-crs/
total 40
-rw-r--r-- 1 root root 469 Jul 2 2012 changelog.Debian.gz
-rw-r--r-- 1 root root 12387 Jun 18 2012 changelog.gz
-rw-r--r-- 1 root root 1297 Jul 2 2012 copyright
drwxr-xr-x 3 root root 4096 Oct 20 09:45 examples
-rw-r--r-- 1 root root 1138 Mar 16 2012 README.Debian
-rw-r--r-- 1 root root 6495 Mar 16 2012 README.gz
Để tải các luật này, ta cần yêu cầu Apache xem xét các folder này. Chỉnh sửa file modsecurity.conf
.
nano /etc/apache2/mods-enabled/modsecurity.conf
Thêm các lệnh sau bên trong <IfModule security2_module> </IfModule>
:
Include "/usr/share/modsecurity-crs/*.conf"
Include "/usr/share/modsecurity-crs/activated_rules/*.conf"
Thư mục activated_rules
tương tự như folder mods-enabled
của Apache. Các luật có sẵn trong các folder :
/usr/share/modsecurity-crs/base_rules
/usr/share/modsecurity-crs/optional_rules
/usr/share/modsecurity-crs/experimental_rules
Symlink phải được tạo ra bên trong activated_rules
folder để kích hoạt này. Hãy để ta kích hoạt các luật chèn SQL.
cd /usr/share/modsecurity-crs/activated_rules/
ln -s /usr/share/modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf .
Apache phải được reload để các luật có hiệu lực.
service apache2 reload
Bây giờ, hãy mở trang đăng nhập mà ta đã tạo trước đó và thử sử dụng truy vấn SQL injection trên trường tên user . Nếu bạn đã thay đổi lệnh SecRuleEngine
thành Bật , bạn sẽ thấy lỗi 403 Forbidden . Nếu nó được để cho 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
.
Viết luật mod_security 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ừ "spam" nhất định được nhập vào biểu mẫu HTML. Đầu tiên, ta sẽ tạo một tập lệnh PHP lấy đầu vào từ hộp văn bản và hiển thị lại cho user .
/var/www/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 bảo mật modsecurity. Ta sẽ đặt các luật của bạn trong một file mới riêng biệt.
nano /etc/modsecurity/modsecurity_custom_rules.conf
Thêm phần sau vào file này:
SecRule REQUEST_FILENAME "form.php" "id:'400001',chain,deny,log,msg:'Spam detected'"
SecRule REQUEST_METHOD "POST" chain
SecRule REQUEST_BODY "@rx (?i:(pills|insurance|rolex))"
Lưu file và reload Apache. Mở http://yourwebsite.com/form.php
trong trình duyệt và nhập văn bản có chứa bất kỳ từ nào sau đây: thuốc, bảo hiểm, rolex.
Bạn sẽ thấy trang 403 và một mục log hoặc chỉ một mục log dựa trên cài đặt SecRuleEngine
. 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) (thuốc | bảo hiểm | rolex) . 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, HÀNH ĐỘNG là từ chối và ghi log với thông báo "Đã phát hiện thư rác". Hành động chuỗi mô phỏng AND logic để phù hợp với cả ba luật .
Không bao gồm Server và Thư mục
Đô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 như phpMyAdmin dưới dạng modsecurity và sẽ chặn các truy vấn SQL là rất hợp lý. 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.
Để tắt bảo mật modsecurity cho một VirtualHost hoàn chỉnh, hãy đặt như sau
<IfModule security2_module>
SecRuleEngine Off
</IfModule>
bên trong phần <VirtualHost>
.
Đối với một folder cụ thể:
<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 bảo mật modsecurity, 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>
Đọc thêm
Tài liệu bảo mật modsecurity chính thức https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual
<div class = “author”> Được đệ trình bởi: <a rel=p>author[ href=osystemhttp://jesin.tk/[> Jesin A </a> </div>
Các tin liên quan
Cách cấu hình Varnish cho Drupal với Apache trên Debian và Ubuntu2013-10-21
Cách cài đặt Apache Wave trên VPS CentOS 6.4 x64
2013-09-18
Cách cấu hình bộ nhớ đệm nội dung bằng module Apache trên VPS
2013-08-16
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Apache và Nginx
2013-08-12
Cách cấu hình web server Apache trên Ubuntu hoặc Debian VPS
2013-08-07
Cách thiết lập Apache với Chứng chỉ SSL đã ký miễn phí trên VPS
2013-07-17
Cách bắt đầu với mod_pagespeed với Apache trên Ubuntu và Debian Cloud Server
2013-07-09
Cách bắt đầu với mod_pagespeed với Apache trên server cloud CentOS và Fedora
2013-07-09
Cách tạo chứng chỉ SSL trên Apache trên Arch Linux
2012-11-09
Cách cài đặt LAMP (Linux, Apache, MySQL, PHP) trên Fedora
2012-11-06