Các loại tấn công mạng như DoS và DDoS đã trở thành mối đe dọa phổ biến đối với cộng đồng người sử dụng công nghệ. Hệ thống, từ nhỏ đến lớn, đều phải đối mặt với rủi ro của những cuộc tấn công mạng này. Trong hướng dẫn này của Blog, chúng tôi sẽ chỉ cho bạn cách cài đặt, cấu hình và sử dụng mod_evasive trên máy chủ để bảo vệ Apache trước các cuộc tấn công DoS và DDoS trên hệ điều hành Centos 7.
Giới thiệu về DOS và DDoS
Module Apache mod_evasive, còn được biết đến với tên gọi mod_dosevasive, là một công cụ mạnh mẽ được thiết kế để đối phó với các cuộc tấn công từ chối dịch vụ (DoS), tấn công từ chối dịch vụ phân tán (DDoS) và các cuộc tấn công brute force trên máy chủ web Apache. Chức năng chính của mod_evasive là tạo ra một hệ thống phòng thủ linh hoạt và có khả năng báo cáo về các hành vi xâm phạm thông qua email và syslog.
Module này hoạt động bằng cách xây dựng một bảng động nội bộ theo dõi địa chỉ IP và URI. Nó có khả năng từ chối các yêu cầu từ địa chỉ IP đã được xác định trước, như một biện pháp đối phó với những nỗ lực tấn công đặc biệt. Điều này giúp giảm thiểu rủi ro từ các cuộc tấn công có tổ chức và bảo vệ máy chủ web khỏi việc bị quá tải hoặc bị chặn hoạt động.
Ngoài ra, mod_evasive cũng có khả năng gửi thông báo qua email và syslog để cảnh báo về các hoạt động đáng ngờ. Điều này giúp quản trị viên hệ thống có thể phản ứng kịp thời và triển khai biện pháp bảo mật phù hợp.
- Yêu cầu trang giống nhau nhiều lần trong vài giây.
- Thực hiện đồng thời hơn 50 yêu cầu trên cùng một tiến trình con mỗi giây.
- Thực hiện bất kỳ yêu cầu nào trong khi tạm thời bị liệt vào danh sách đen.
Nếu đáp ứng một trong các điều kiện bên trên, một phản hồi 403 sẽ được gửi và địa chỉ IP được lưu lại. Thông báo email có thể được gửi đến chủ sở hữu server hoặc một lệnh hệ thống có thể được thực thi để chặn địa chỉ IP.
Yêu cầu để chống tấn công DOS và DDoS cho Apache trên Centos 7
Để thực hiện các bước trong bài viết này, bạn cần đạt được những yêu cầu sau:
- Máy chủ CentOS 7 64 bit (có thể hoạt động với CentOS 6).
- Người dùng non-root có quyền sudo.
- Web server Apache đang chạy trên máy chủ.
Bước 1 – Cài đặt mod_evasive
Trong bước này, chúng ta sẽ thực hiện việc cài đặt các gói cần thiết để kích hoạt mod_evasive. Tiếp theo, chúng ta sẽ cài đặt mod_evasive.
Đầu tiên, để bắt đầu, hãy cài đặt kho lưu trữ yum EPEL (Extra Packages for Enterprise Linux) trên máy chủ của bạn. EPEL là một nhóm ưu đãi đặc biệt của Fedora, được tạo ra để duy trì và quản lý một tập hợp các gói phần mềm mã nguồn mở chất lượng cao cho Enterprise Linux. Bạn có thể thực hiện điều này bằng cách chạy lệnh sau để cài đặt và kích hoạt kho lưu trữ EPEL trên máy chủ của bạn.
Trên CentOS 7, bạn hãy gõ lệnh:
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
Trên CentOS 6:
sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Hãy xác minh kho lưu trữ EPEL đã được kích hoạt bằng cách sử dụng lệnh:
sudo yum repolist
Nếu kho lưu trữ được kích hoạt, bạn sẽ thấy nó được liệt kê trong output:
epel/x86_64
Tiếp theo, bạn cần bảo vệ các base package từ EPEL bằng cách sử dụng plugin yum protectbase:
sudo yum install yum-plugin-protectbase.noarch -y
Plugin “protectbase” được thiết kế với mục đích bảo vệ một số kho lưu trữ yum khỏi việc bị cập nhật từ những kho lưu trữ khác. Điều này đồng nghĩa với việc những gói trong kho được đánh dấu là bảo vệ sẽ không chịu ảnh hưởng từ các cập nhật hoặc ghi đè do các gói từ các nguồn không được bảo vệ, ngay cả khi chúng có phiên bản mới. Điều này giúp duy trì tính ổn định và đồng nhất của hệ thống, đặc biệt là khi cần giữ nguyên phiên bản cụ thể của một số gói phần mềm trong môi trường sản xuất.
Bây giờ bạn đã sẵn sàng cài đặt mod_evasive. Chạy lệnh sau để cài đặt:
sudo yum install mod_evasive -y
Bước 2 – Xác nhận cài đặt
Khi mod_evasive đã được cài đặt, bạn cần xác nhận rằng file cấu hình cũng đã được cài đặt và module đang được tải.
Trong quá trình này, file cấu hình mod_evasive /etc/httpd/conf.d/mod_evasive.conf
đã được thêm vào. Chạy lệnh sau để xác nhận:
sudo ls -al /etc/httpd/conf.d/mod_evasive.conf
Output sẽ tương tự như sau:
-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf
Mặc định, dòng LoadModule
sẽ được thêm vào đầu file cấu hình mod_evasive.conf
. Mở file và thêm dòng này nếu chưa có. Dòng này cho phép web server Apache tải và sử dụng module mod_evasive.
Trên CentOS 7 sẽ có dạng:
LoadModule evasive20_module modules/mod_evasive24.so
Trên CentOS 6, dòng này sẽ như sau:
LoadModule evasive20_module modules/mod_evasive20.so
Hãy liệt kê các module đã tải cho web server Apache và tìm mod_evasive bằng lệnh:
sudo httpd -M | grep evasive
Output sẽ hiển thị như sau:
evasive20_module (shared)
Bước 3 – Cấu hình mod_evasive
Sau khi đã hoàn tất quá trình cài đặt và xác nhận, bước tiếp theo là xem xét cấu hình của module. Module mod_evasive có thể dễ dàng tùy chỉnh thông qua tập tin cấu hình mod_evasive.conf.
Một trong những tùy chọn cấu hình quan trọng mà bạn có thể điều chỉnh là DOSEmailNotify. Tùy chọn này cho phép máy chủ gửi thông báo qua email tới địa chỉ đã được chỉ định mỗi khi một địa chỉ IP nào đó bị thêm vào danh sách đen của máy chủ. Nội dung của email thông báo sẽ hiển thị thông điệp “mod_evasive HTTP Blacklisted 111.111.111.111”.
Ví dụ, nếu bạn muốn gửi cảnh báo mod_evasive đến địa chỉ vinascript@example.com
, hãy chỉnh sửa file bằng lệnh:
sudo nano /etc/httpd/conf.d/mod_evasive.conf
Bỏ chú thích dòng DOSEmailNotify
bằng cách loại bỏ dấu # ở đầu dòng và thay đổi địa chỉ email thành của bạn:
DOSEmailNotify vietnix@example.com
Một tham số khác mà bạn có thể muốn thiết lập là DOSWhitelist
. Khi sử dụng tùy chọn này, địa chỉ IP của các client đáng tin cậy có thể được thêm vào danh sách trắng để đảm bảo họ sẽ không bị từ chối truy cập. Mục đích của danh sách trắng là bảo vệ phần mềm, script, local search bot hoặc các tool tự động không bị từ chối khi yêu cầu lượng dữ liệu lớn từ máy chủ.
Để thêm vào danh sách trắng một địa chỉ IP, ví dụ như 111.111.111.111, bạn hãy thêm một mục vào file cấu hình như sau:
DOSWhitelist 111.111.111.111
Wildcards có thể được sử dụng đến 3 octet cuối cùng của địa chỉ IP nếu cần thiết.
Để cho phép truy cập từ nhiều địa chỉ IP khác nhau, bạn có thể thêm các dòng DOSWhitelist trong file cấu hình như sau:
DOSWhitelist 111.111.111.111
DOSWhitelist 222.222.222.222
DOSPageCount
và DOSSiteCount
là hai tham số nên thay đổi để tránh trường hợp khách hàng bị chặn truy cập không cần thiết.
DOSPageCount
là giới hạn cho số lượng yêu cầu tối đa đến một trang từ một địa chỉ IP trong một khoảng thời gian nhất định (thường là 1 giây). Khi ngưỡng cho khoảng thời gian đó đã vượt quá, địa chỉ IP của client sẽ được thêm vào danh sách bị chặn. Giá trị mặc định được đặt khá thấp ở mức 2. Bạn có thể thay đổi thành giá trị cao hơn, ví dụ như 20, bằng cách chỉnh sửa trong /etc/httpd/conf.d/mod_evasive.conf
như sau:
DOSPageCount 20
DOSSiteCount
giới hạn tổng số yêu cầu được thực hiện đến cùng một trang web theo địa chỉ IP trong một khoảng thời gian nhất định. Theo mặc định, thời gian này là 1 giây. Để thay đổi nó thành một giá trị lớn hơn như 100 giây, bạn hãy gõ lệnh sau:
DOSSiteCount 100
Còn một số tham số khác bạn có thể thay đổi để trang web đạt được hiệu suất tốt hơn.
Một trong số đó là DOSBlockingPeriod
. Đây là thời gian (tính bằng giây) mà một client (địa chỉ IP) sẽ bị chặn nếu được thêm vào danh sách bị chặn. Trong thời gian này, tất cả các yêu cầu tiếp theo từ client sẽ dẫn đến lỗi 403 (Forbidden) và timer sẽ được đặt lại (mặc định là 10 giây).
Ví dụ, nếu bạn muốn tăng thời gian chặn lên 300 giây, hãy gõ lệnh sau:
DOSBlockingPeriod 300
Một tham số khác quan trọng là DOSLogDir, đây là một tùy chọn cấu hình được sử dụng để chỉ định thư mục tạm thời mà mod_evasive sẽ sử dụng. Mặc định, /tmp được chọn làm thư mục để lưu trữ các khóa. Tuy nhiên, điều này có thể gây ra vấn đề bảo mật nếu hệ thống của bạn cho phép người dùng shell truy cập vào /tmp. Nếu có người dùng shell non-privileged, tốt nhất là tạo một thư mục chỉ có thể ghi bởi người dùng Apache (thường là apache) và sau đó đặt tham số này trong tệp cấu hình mod_evasive.conf.
Ví dụ, để đặt thư mục được sử dụng bởi mod_evasive thành /var/log/mod_evasive
, hãy tạo thư mục bằng cách sử dụng lệnh:
sudo mkdir /var/log/mod_evasive
Tiếp theo, đặt sở hữu cho người dùng apache
:
sudo chown -R apache:apache /var/log/mod_evasive
Sau đó, chỉnh sửa cấu hình mod_evasive và thay đổi thư mục như sau:
DOSLogDir "/var/log/mod_evasive"
Tham số tiếp theo trong danh sách là DOSSystemCommand. Khi một giá trị được chỉ định, lệnh này sẽ tự động thực thi mỗi khi một địa chỉ IP được thêm vào danh sách đen. Bằng cách sử dụng tham số này, bạn có thể tích hợp mod_evasive với tường lửa hoặc các lệnh shell khác trên máy chủ để tự động chặn các địa chỉ IP xuất hiện trong danh sách đen.
Bước 4 – Tải module mod_evasive
Sau khi đã thay đổi file cấu hình, bạn cần khởi động lại web server Apache để thay đổi có hiệu lực. Hãy chạy lệnh sau để khởi động lại Apache.
Trên CentOS 7, bạn hãy dùng lệnh:
sudo systemctl restart httpd.service
Trên CentOS 6, dùng lệnh sau:
sudo service httpd restart
Lưu ý: mod_evasive có thể xung đột với FrontPage Server Extensions. Bạn nên kiểm tra cài đặt của web server Apache để đảm bảo mod_evasive hoạt động tốt.
Bước 5 – Kiểm tra mod_evasive
Hãy thực hiện một bài test ngắn để xem module hoạt động đúng cách hay không. Bạn sẽ sử dụng một script perl test.pl được viết bởi các nhà phát triển mod_evasive. Để thực thi script, bạn cần cài đặt gói perl
trên server:
sudo yum install -y perl
Test script được cài đặt cùng với mod_evasive tại đường dẫn sau:
/usr/share/doc/mod_evasive-1.10.1/test.pl
Mặc định, kịch bản kiểm thử yêu cầu cùng một trang từ máy chủ web Apache 100 lần liên tiếp để kích hoạt mod_evasive. Trong bước trước, bạn đã điều chỉnh mod_evasive để cho phép nhiều yêu cầu hơn trong một giây đến cùng một trang. Để đảm bảo tất cả các cơ chế báo cáo của mod_evasive được kích hoạt, bạn cần sửa đổi kịch bản để thực hiện 200 yêu cầu liên tiếp thay vì 100.
Chỉnh sửa /usr/share/doc/mod_evasive-1.10.1/test.pl
bằng lệnh dưới đây:
sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl
Sau đó, bạn tìm dòng sau:
for(0..100) {
Tiếp theo, thay 100
bằng 200
:
for(0..200) {
Cuối cùng, lưu file và thoát.
Để thực thi script, bạn chạy lệnh sau:
sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl
Bạn nên thấy output tương tự như sau:
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
...
Script tạo 100 yêu cầu đến web server của bạn. Mã phản hồi 403 cho thấy truy cập bị từ chối bởi web server. mod_evasive cũng lưu vào syslog khi địa chỉ IP bị chặn. Để kiểm tra log file, bạn hãy sử dụng lệnh:
sudo tailf /var/log/messages
Output chỉ ra địa chỉ IP đã bị chặn bởi mod_evasive:
Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.
Nếu bạn đã cấu hình mod_evasive để gửi email cảnh báo khi một địa chỉ IP bị chặn, một email sẽ được gửi tới hộp thư đến với nội dung sau:
mod_evasive HTTP Blacklisted 127.0.0.1
Lời kết
Thông qua bài viết này, bạn đã nắm được cách phòng ngừa tấn công DOS và DDoS bằng mod_evasive. Đây là một phương án hiệu quả để đối phó với các cuộc tấn công từ bên ngoài. Tuy nhiên, giải pháp này có nhược điểm là giới hạn và chỉ đặc biệt hữu ích trong phạm vi băng thông và khả năng xử lý tổng của máy chủ, cũng như khả năng đáp ứng với các yêu cầu không hợp lệ.
Để tăng cường hiệu suất bảo vệ, đặc biệt là trong trường hợp tấn công phức tạp, có thể tích hợp mod_evasive với tường lửa. Điều này giúp đảm bảo hiệu quả tốt nhất khi ngăn chặn các cuộc tấn công một cách linh hoạt.
Tuy nhiên, nếu bạn đối mặt với cuộc tấn công DDoS lớn, phức tạp và kéo dài, một giải pháp chống DDoS dựa trên phần cứng có thể là sự lựa chọn thích hợp. Hãy cân nhắc chuyển đến các giải pháp phần cứng để đảm bảo bảo vệ tối đa cho hệ thống của bạn.