Thứ hai, 21/10/2013 | 00:00 GMT+7

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 PHPbả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

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 POSTREQUEST_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 ĐỘNGtừ chốighi 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>


Tags:

Các tin liên quan

Cách cấu hình Varnish cho Drupal với Apache trên Debian và Ubuntu
2013-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