Thứ năm, 30/07/2015 | 00:00 GMT+7

Cách bảo vệ chống lại DoS và DDoS với mod_evasive cho Apache trên CentOS 7

Mô-đun mod_evasive Apache, trước đây được gọi là mod_dosevasive, giúp bảo vệ khỏi các cuộc tấn công DoS, DDoS (Từ chối dịch vụ phân tán) và bạo lực trên web server Apache. Nó có thể cung cấp hành động né tránh trong các cuộc tấn công và báo cáo lạm dụng qua email và cơ sở log hệ thống. Mô-đun hoạt động bằng cách tạo một bảng động nội bộ gồm các địa chỉ IP và URI cũng như từ chối bất kỳ địa chỉ IP đơn lẻ nào từ bất kỳ địa chỉ nào sau đây:

  • Yêu cầu cùng một trang nhiều hơn một vài lần mỗi giây
  • Thực hiện hơn 50 yêu cầu đồng thời trên cùng một con mỗi giây
  • Đưa ra bất kỳ yêu cầu nào trong khi tạm thời bị đưa vào blacklist

Nếu bất kỳ điều kiện nào ở trên được đáp ứng, phản hồi 403 sẽ được gửi và địa chỉ IP được ghi lại. Theo tùy chọn, thông báo qua email có thể được gửi đến chủ sở hữu server hoặc có thể chạy lệnh hệ thống để chặn địa chỉ IP.

Trong hướng dẫn này, ta sẽ thảo luận về cách cài đặt, cấu hình và sử dụng mod_evasive trên server của bạn.

Yêu cầu

Trước khi bắt đầu với hướng dẫn này, bạn nên có những điều sau:

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

Trong phần này, ta sẽ cài đặt các gói cần thiết để mod_evasive hoạt động và cuối cùng là cài đặt mod_evasive.

Đầu tiên, ta cần cài đặt repository yum EPEL (Extra Packages for Enterprise Linux) trên server . EPEL là Group lợi ích đặc biệt của Fedora tạo ra, duy trì và quản lý một bộ phần mềm bổ trợ open-souce chất lượng cao cho Enterprise Linux. Chạy lệnh sau để cài đặt và kích hoạt kho EPEL trên server của bạn:

Trên CentOS 7:

  • 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 để ta xác minh repo EPEL được bật bằng cách sử dụng:

  • sudo yum repolist

Nếu được bật, bạn sẽ thấy repo sau được liệt kê trong kết quả :

epel/x86_64                                                            Extra Packages for Enterprise Linux 7 - x86_64 

Bây giờ, ta hãy bảo vệ các gói cơ sở từ EPEL sử dụng yum Plugin protectbase.

  • sudo yum install yum-plugin-protectbase.noarch -y

Mục đích của plugin protectbase là bảo vệ một số repository yum nhất định khỏi các bản cập nhật từ các repository khác. Các gói trong repositories được bảo vệ sẽ không được cập nhật hoặc overrides bởi các gói trong repositories không được bảo vệ ngay cả khi kho không được bảo vệ có version mới hơn.

Bây giờ ta đã sẵn sàng để cài đặt module mod_evasive. Chạy lệnh sau để cài đặt nó:

  • sudo yum install mod_evasive -y

Bước 2 - Xác minh cài đặt

Bây giờ mod_evasive đã được cài đặt, hãy xác minh file cấu hình đã được cài đặt và module đang được tải.

Trong khi cài đặt, file cấu hình mod_evasive /etc/httpd/conf.d/mod_evasive.conf đã được thêm vào. Để xác minh lần chạy này:

  • sudo ls -al /etc/httpd/conf.d/mod_evasive.conf

Đầu ra phải tương tự như:

-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf 

Theo mặc định, dòng LoadModule sau sẽ được thêm vào đầu file cấu hình mod_evasive.conf . Mở file và thêm dòng nếu nó chưa có. Dòng này yêu cầu web server Apache tải và sử dụng module mod_evasive.

Trên CentOS 7, dòng sẽ đọc như sau:

/etc/httpd/conf.d/mod_evasive.conf
LoadModule evasive20_module modules/mod_evasive24.so 

Trên CentOS 6, dòng sẽ như sau:

/etc/httpd/conf.d/mod_evasive.conf
LoadModule evasive20_module modules/mod_evasive20.so 

Hãy để ta liệt kê các module được tải cho web server Apache và tìm mod_evasive:

  • sudo httpd -M | grep evasive

Đầu ra sẽ hiển thị:

 evasive20_module (shared) 

Bước 3 - Cấu hình mod_evasive

Bây giờ cài đặt đã hoàn tất và được xác minh, ta hãy xem xét cấu hình của module . mod_evasive có thể được tùy chỉnh dễ dàng thông qua file cấu hình mod_evasive.conf . Ta sẽ thảo luận về một số tham số cấu hình trong hướng dẫn này. Vui lòng tham khảo file cấu hình để biết thông tin về tất cả các tham số - nó chứa mô tả của từng tham số.

Một trong những tùy chọn cấu hình bạn cần thay đổi là DOSEmailNotify . Đây là một chỉ thị rất hữu ích. Nếu giá trị này được đặt, một email sẽ được gửi đến địa chỉ email được chỉ định khi nào một địa chỉ IP được đưa vào blacklist . Nội dung email sẽ hiển thị mod_evasive HTTP Blacklisted 111.111.111.111

Ví dụ: nếu bạn muốn gửi cảnh báo mod_evasive, sammy@example.com , hãy chỉnh sửa file :

  • sudo nano /etc/httpd/conf.d/mod_evasive.conf

Bỏ comment DOSEmailNotify bằng cách xóa dấu # ở đầu dòng và thay đổi địa chỉ email thành của bạn:

/etc/httpd/conf.d/mod_evasive.conf
DOSEmailNotify   sammy@example.com 

Lưu ý: mod_evasive sử dụng /bin/mail để gửi cảnh báo qua email. Bạn cần có một server thư được cài đặt và hoạt động, hãy tham khảo hướng dẫn này để biết thông tin về cách cài đặt một server thư đơn giản để các thông báo qua email hoạt động.

Một tham số khác mà bạn có thể cần đặt là DOSWhitelist . Sử dụng tùy chọn này, địa chỉ IP của các client tin cậy có thể được thêm vào danh sách trắng đảm bảo chúng không bao giờ bị từ chối. Mục đích của danh sách trắng là để bảo vệ phần mềm, tập lệnh, bot tìm kiếm local hoặc các công cụ tự động khác không bị từ chối vì yêu cầu lượng lớn dữ liệu từ server .

Để đưa địa chỉ IP vào danh sách trắng, ví dụ: 111.111.111.111, hãy thêm mục nhập vào file cấu hình như sau:

/etc/httpd/conf.d/mod_evasive.conf
DOSWhitelist    111.111.111.111 

Các ký tự đại diện được dùng trên tối đa 3 octet cuối cùng của địa chỉ IP nếu cần.

Để lập danh sách trắng nhiều địa chỉ IP từ các dải IP khác nhau, bạn có thể thêm các dòng DOSWhitelist riêng biệt trong file cấu hình như sau:

/etc/httpd/conf.d/mod_evasive.conf
DOSWhitelist    111.111.111.111 DOSWhitelist    222.222.222.222 

DOSPageCountDOSSiteCount là hai tham số khác được khuyến khích thay đổi thành các giá trị ít linh hoạt hơn để tránh client bị chặn không cần thiết.

DOSPageCount là giới hạn cho số lượng yêu cầu cho cùng một trang trên mỗi trang (thường được đặt thành một giây) bởi một địa chỉ IP. Sau khi vượt quá ngưỡng cho khoảng thời gian đó, đị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 nó thành giá trị cao hơn, chẳng hạn 20, bằng cách chỉnh sửa phần sau trong /etc/httpd/conf.d/mod_evasive.conf :

/etc/httpd/conf.d/mod_evasive.conf
DOSPageCount 20 

DOSSiteCount là giới hạn tổng số yêu cầu cho cùng một trang web theo địa chỉ IP trên mỗi trang web (mặc định là 1 giây). Để thay đổi nó thành một giá trị lớn hơn, chẳng hạn như 100 giây:

/etc/httpd/conf.d/mod_evasive.conf
DOSSiteCount 100 

Có một vài thông số khác bạn có thể thay đổi để đạt được hiệu suất tốt hơn.

Một là DOSBlockingPeriod , là khoảng thời gian (tính bằng giây) mà một ứng dụng client (địa chỉ IP) sẽ bị chặn nếu họ đượ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 (Bị cấm) và bộ hẹn giờ được đặt lại (mặc định là 10 giây).

Ví dụ: nếu bạn muốn tăng khoảng thời gian chặn lên 300 giây:

/etc/httpd/conf.d/mod_evasive.conf
DOSBlockingPeriod    300 

Một cái khác là DOSLogDir dùng để chỉ folder tạm thời được mod_evasive sử dụng. Theo mặc định /tmp sẽ được sử dụng cho cơ chế khóa, cơ chế này mở ra một số vấn đề bảo mật nếu hệ thống của bạn mở cho user shell. Trong trường hợp bạn có user shell không có quyền , bạn cần tạo một folder chỉ có thể ghi cho user mà Apache đang chạy (thường là apache ), sau đó đặt tham số này trong file mod_evasive.conf của bạn.

Ví dụ: để đặt folder được mod_evasive sử dụng thành /var/log/mod_evasive , hãy tạo folder bằng cách sử dụng:

  • sudo mkdir /var/log/mod_evasive

Sau đó, đặt quyền sở hữu cho user apache :

  • sudo chown -R apache:apache /var/log/mod_evasive

Bây giờ hãy chỉnh sửa cấu hình mod_evasive và thay đổi folder như sau:

/etc/httpd/conf.d/mod_evasive.conf
DOSLogDir           "/var/log/mod_evasive" 

Một tham số khác là DOSSystemCommand . Nếu một giá trị được đặt, lệnh được chỉ định sẽ được thực thi khi nào một địa chỉ IP bị đưa vào blacklist . Sử dụng tham số này, bạn có thể tích hợp mod_evasive với firewall được cài đặt trên server của bạn hoặc tập lệnh shell và chặn các địa chỉ IP bị mod_evasive đưa vào blacklist trong firewall .

Bước 4 - Tải module mod_evasive

Khi ta đã áp dụng các thay đổi trong file cấu hình, ta cần khởi động lại web server Apache để chúng có hiệu lực. Chạy lệnh sau để khởi động lại Apache.

Trên CentOS 7:

  • sudo systemctl restart httpd.service

Trên CentOS6:

  • sudo service httpd restart

Lưu ý: Xin lưu ý mod_evasive dường như xung đột với Tiện ích mở rộng server FrontPage. Bạn cũng có thể cần kiểm tra cài đặt web server Apache của bạn đảm bảo rằng mod_evasive có thể hoạt động tốt. Đề nghị chỉnh Apache là để có một giá trị rất cao về MaxRequestsPerChild nhưng không giới hạn (Giá trị zero ám chỉ không giới hạn) và có KeepAlive kích hoạt với KeepAliveTimeout cài đặt hợp lý lâu dài.

Bước 5 - Kiểm tra mod_evasive

Hãy để ta thực hiện một bài kiểm tra ngắn để xem liệu module có hoạt động chính xác hay không. Ta sẽ sử dụng tập lệnh perl test.pl do các nhà phát triển mod_evasive viết. Để thực thi tập lệnh, trước tiên ta cần cài đặt gói perl trên server bằng cách sử dụng:

  • sudo yum install -y perl

Tập lệnh thử nghiệm được cài đặt với mod_evasive tại vị trí sau:

/usr/share/doc/mod_evasive-1.10.1/test.pl 

Theo mặc định, tập lệnh kiểm tra yêu cầu cùng một trang từ web server Apache của bạn 100 lần liên tiếp để kích hoạt mod_evasive. Trong phần cuối cùng, ta đã sửa đổi mod_evasive để có thể chấp nhận nhiều hơn các yêu cầu mỗi giây đến cùng một trang. Ta cần thay đổi tập lệnh thành 200 yêu cầu liên tiếp thay vì 100 đảm bảo ta kích hoạt tất cả các phương thức thông báo của mod_evasive.

Chỉnh sửa /usr/share/doc/mod_evasive-1.10.1/test.pl :

  • sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl

Tìm dòng sau:

/usr/share/doc/mod_evasive-1.10.1/test.pl
for(0..100) { 

Thay 100 bằng 200 :

/usr/share/doc/mod_evasive-1.10.1/test.pl
for(0..200) { 

Lưu và thoát.

Để thực thi tập lệnh, hãy chạy:

  • sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl

Bạn sẽ thấy kết quả tương tự như:

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 ... 

Tập lệnh thực hiện 100 yêu cầu đến web server của bạn. mã phản hồi 403 cho biết quyền truy cập bị từ chối bởi web server . mod_evasive cũng ghi vào log hệ thống khi địa chỉ IP bị chặn. Kiểm tra file log bằng cách sử dụng:

  • sudo tailf /var/log/messages

Nó sẽ hiển thị một dòng tương tự như:

Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack. 

cho biết địa chỉ IP bị chặn bởi mod_evasive.

Nếu bạn đã cấu hình mod_evasive để gửi cảnh báo qua email khi IP bị chặn, bạn sẽ có một email trong hộp thư đến của bạn với nội dung sau:

mod_evasive HTTP Blacklisted 127.0.0.1 

Kết luận

mod_evasive rất tốt trong việc chống lại server đơn, các cuộc tấn công theo tập lệnh cũng như các cuộc tấn công phân tán. Tuy nhiên, nó chỉ hữu ích đối với tổng băng thông của server và dung lượng bộ xử lý để xử lý và phản hồi các yêu cầu không hợp lệ. Vì lý do này, bạn nên tích hợp module này với firewall server của bạn để được bảo vệ tối đa. Nếu không có cơ sở hạ tầng thực sự tốt và firewall , DDoS nặng vẫn có thể khiến bạn offline . Nếu một cuộc tấn công rất nặng và dai dẳng, bạn có thể cần phải chuyển sang giải pháp giảm thiểu DDoS dựa trên phần cứng.


Tags:

Các tin liên quan

Cách cài đặt LAMP (Linux, Apache, MySQL, PHP) trên Fedora 22
2015-07-08
Cách thiết lập mod_rewrite cho Apache trên Ubuntu 14.04
2015-06-27
Cách cài đặt Apache Tomcat 8 trên CentOS 7
2015-06-19
Cách cài đặt Apache Tomcat 8 trên Ubuntu 14.04
2015-06-19
Cách tạo chứng chỉ SSL trên Apache cho Debian 8
2015-06-19
Cách cài đặt Apache Tomcat 7 trên CentOS 7 qua Yum
2015-06-15
Cách cấu hình Apache để sử dụng các trang lỗi tùy chỉnh trên Ubuntu 14.04
2015-06-09
Cách cấu hình Apache để sử dụng các trang lỗi tùy chỉnh trên CentOS 7
2015-06-09
Cách thiết lập ModSecurity với Apache trên Ubuntu 14.04 và Debian 8
2015-06-05
Cách chạy trang web Django với Apache, mod_wsgi và MySQL trên FreeBSD 10.1
2015-05-29