Hướng dẫn bảo vệ Apache khỏi bị tấn công DoS bằng công cụ mod_evasive trên CentOS
Giới thiệu
Modun mod_evasive Apache trước đây được gọi với cái tên là mod_dosevasive giúp chống lại DoS, DDoS (Distributed Denial of Service) và những kiểu tấn công vét cạn trên Apache web server. Nó có thể ngăn chặn khả năng tấn công và báo lại cho người dùng thông qua email và các hệ thống liên quan. Modun này hoạt động bên cạnh việc tạo ra một mảng động bên trong địa chỉ IP và URIs, nó còn ngăn chặn truy cập các địa chỉ IP với những trường hợp sau:
- Truy cập cùng một trang quá nhiều lần trong một giây.
- Truy cập đồng thời hơn 50 lệnh trong một giây
- Truy cập các thông tin được liệt vào danh sách đen.
Nếu gặp bất cứ một trong các trường hợp trên thì hệ thống sẽ gửi lại lỗi 403 và ghi lại địa chỉ IP đó. Thêm nữa , một thông báo bằng email sẽ được gửi tới máy chủ hoặc một lệnh trong hệ thống sẽ hoạt động để chặn địa chỉ IP đó lại.
Trong phần này ViCloud sẽ hướng dẫn cách cài đặt, cấu hình và sử dụng mod_evasive trên máy chủ.
Yêu cầu căn bản
- Một Cloud Server chạy hệ điều hành CentOS 7 64-bit của ViCloud.
- Hướng dẫn cấu hình thiết lập ban đầu máy chủ Cloud Server CentOS 7;
- Hướng dẫn tạo người dùng Sudo trên CentOS.
- Đã cài đặt ứng dụng Apache web server.
Bước 1 - Cài mod_evasive
Ta sẽ cài các gói hỗ trợ cho mod_evasive trước sau đó là tiến hành cài mod_evasive.
Đầu tiên là cài EPEL (Extra Packages for Enterprise Linux) trên máy chủ. EPEL được sinh ra để bảo trì cũng như quản lý một nhóm các gói phần mềm phụ trợ mã nguồn mở chất lượng cao phục vụ cho Enterprise Linux. Ta chạy dòng lệnh sau để cài và hữu hiệu hóa EPEL .
Với CentOS 7:
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
Với CentOS 6:
sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Xác minh EPEL hoạt động:
sudo yum repolist
Nếu hoạt động thì kết quả trả về:
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64
Bảo vệ các gói cơ bản trong EPEL sử dụng yum plugin protectbase.
sudo yum install yum-plugin-protectbase.noarch -y
Mục đích của protectbase plugin là bảo vệ kho lưu trữ yum khi update dữ liệu từ các kho lưu trữ khác. Các gói này sẽ không được update hay bị chồng lên bởi các gói từ kho không rõ nguồn gốc ngay cả khi kho cung cấp đó thuộc phiên bản mới nhất.
Giờ sẽ cài đặt mod_evasive module:
sudo yum install mod_evasive -y
Bước 2 - Xác minh cài đặt
Giờ thì ta sẽ xác minh file cấu hình của nó.
Trong quá trình cài đặt, file cấu hình của mod_evasive /etc/httpd/conf.d/mod_evasive.conf sẽ được thêm vào, để xác minh ta chạy dòng lệnh:
sudo ls -al /etc/httpd/conf.d/mod_evasive.conf
Đầu ra hiển thị:
-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf
Theo mặc định thì dòng LoadModule sẽ được thêm vào vị trí đầu tiên của file mod_evasive.conf. Mở file và thêm dòng này nếu không thấy nó xuất hiện. Dòng này sẽ thông báo cho Apache web server để tải và sử dụng modun mod_evasive.
Với CentOS 7:
LoadModule evasive20_module modules/mod_evasive24.so
Với CentOS 6:
LoadModule evasive20_module modules/mod_evasive20.so
Tiếp theo là liệt kê danh sách modun được tải trên Apache webserver và tìm modun mod_evasive:
sudo httpd -M | grep evasive
Đầu ra hiển thị:
evasive20_module (shared)
Bước 3 - Định cấu hình mod_evasive
Giờ thì cài đặt cũng như xác nhận đã xong , chúng ta sẽ điịnh cấu hình cho modun này. mod_evasive có thể dễ dàng tùy chỉnh thông qua file cấu hình mod_evasive.conf .Chúng tôi sẽ giải thích vài thông số cấu hình trong phần này , bạn có thể tham khảo trên file cấu hình đó để biết thông tin chi tiết về các thông số của nó.
Một mục ta cần thay đổi là DOSEmailNotify. Đây là một mục rất hữu ích, nếu chúng ta đặt giá trị cho nó thì một thông báo email sẽ được gửi tới người dùng ngay khi có địa chỉ IP nào đó bị liệt vào danh sách đen. Đoạn email sẽ thông báo mod_evasive HTTP Blacklisted 111.111.111.111
Ví dụ nếu bạn muốn cảnh báo mod_evasive alerts hoạt động với email sammy@example.com, chỉ cần chỉnh file:
sudo nano /etc/httpd/conf.d/mod_evasive.conf
Hữu hiệu hóa dòng lệnh DOSEmailNotify bằng cách bỏ ký tự # và đổi địa chỉ email là xong:
DOSEmailNotify sammy@example.com
Note: mod_evasive sử dụng /bin/mail
để gửi cảnh báo qua email. Nên bạn cần tham khảo thêm cách cài đặt một mail server .
Một thông số khác cần lưu ý là DOSWhitelist. Những địa chỉ IP của các khách hàng thân thiết sẽ được liệt kê vào danh sách trắng (an toàn) để chúng không bao giờ bị chặn. Mục đích là để bảo vệ phần mềm, các tập lệnh, hệ thống truy cập cục bộ hay là các công cụ tự động khác để khỏi bị chặn khi truy cập quá nhiều trữ lượng data từ máy chủ.
Để liệt kê một địa chỉ IP vào danh sách trắng, ví dụ là 111.111.111.111, ta chỉ cần thêm vào là xong:
DOSWhitelist 111.111.111.111
Nó có thể quản lý tới 24 địa chỉ IP .
Vì địa chỉ IP rất đa dạng ở nhiều phạm vi khác nhau nên bạn có thể thêm các danh sách trắng riêng biệt cho các địa chỉ IP khác.
DOSWhitelist 111.111.111.111DOSWhitelist 222.222.222.222
DOSPageCount và DOSSiteCount là hai thông số cần thay đổi để giảm sự xung đột giá trị tránh việc truy cập của khách hàng bị chặn trong trường hợp không cần thiết.
DOSPageCount là số lượng giới hạn truy cập cùng một trang trên một đơn vị thời gian ( thường là 1 giây) với mỗi địa chỉ IP. Một khi nó vuợt ngưỡng cho phép thì địa chỉ IP của khách hàng sẽ bị liệt vào danh sách bị chặn. Vì giá trị mặc định rất thấp là 2 nên ta sẽ tăng lên đến giá trị là 20 bằng cách chỉnh file sau /etc/httpd/conf.d/mod_evasive.conf:
DOSPageCount 20
DOSSiteCount là số lượng giới hạn truy cập của một địa chỉ IP trên một website trong một khoảng thời gian nhất định( mặcđịnh là 1 giây), ta cần thay đổi giá trị lớn hơn là 100 giây.
DOSSiteCount 100
Thêm một vài thông số nữa bạn cần thay đổi để nó hoạt động tốt hơn.
Một là DOSBlockingPeriod, là khoảng thời gian mà một địa chỉ IP của khách hàng bị chặn khi bị đưa vào danh sách đen. Trong thời gian này tất cả các yêu cầu truy cập con khác sẽ bị phản hồi về giá trị lỗi là 403(Fobidden) và sẽ được reset lại trong 10 giây.
Nếu ta muốn tăng thời gian chặn ở mức 300 giây thì sửa như sau:
DOSBlockingPeriod 300
Một thông số khác là DOSLogDir mà mod_evasive sử dụng trong danh mục tạm thời. Mặc định thì /tmp sẽ sử dụng như một cơ chế khóa, nó chỉ mở khi hệ thống của bạn cho phép mở với người dùng shell, trong trường hợp có người dùng shell không đặc quyền thì bạn cần phải tạo một mục có thể ghi dữ liệu cho user Apache sau đó cài các thông số trong file mod_evasive.conf đó.
Ví dụ tạo danh mục tới địa chỉ /var/log/mod_evasive, sử dụng lệnh:
sudo mkdir /var/log/mod_evasive
Sau đó cài quyền sở hữu cho người dùng apache user:
sudo chown -R apache:apache /var/log/mod_evasive
Giờ thì sửa cấu hình mod_evasive và thay đổi theo hướng dẫn dưới đây:
DOSLogDir "/var/log/mod_evasive"
Một thông số khác là DOSSystemCommand. Khi cài đặt giá trị cho nó thì lệnh chỉ thực hiện khi có địa chỉ IP thuộc danh sách đen. Bạn có thể tích hợp mod_evasive với firewall được cài đặt trên server hoặc shell script và dùng mod_evasive trên firewall để chặn địa chỉ IP khi bị liệt vào danh sách đen.
Bước 4 - Nạp modun mod_evasive
Khi thay đổi cấu hình xong thì ta sẽ khởi tạo lại Apache webserver để lưu thay đổi, chạy dòng lệnh sau:
Với CentOS 7:
sudo systemctl restart httpd.service
Với CentOS6:
sudo service httpd restart
Note: mod_evasive xuất hiện có thể xung đột cấu hình với FrontPage Server Extensions. Nên bạn cần check cài đặt Apache web server để đảm bảo mod_evasive hoạt động đúng chức năng của nó. Gợi ý điều chỉnh Apache ở gia trị thật cao cho MaxRequestsPerChild
và hữu hiệu hóa KeepAlive
cùng vớiKeepAliveTimeout
.
Bước 5 - Kiểm tra mod_evasive
Để kiểm tra modun có hoạt động đúng chức năng của nó hay không ta sử dụng một tập lệnh perl test.pl được tạo ra bởi các nhà phát triển công cụ mod_evasive , để thực hiện thì chúng ta cần cài gói perl trên server sử dụng lệnh:
sudo yum install -y perl
Tập lệnh kiểm tra được lưu ở vị trí này:
/usr/share/doc/mod_evasive-1.10.1/test.pl
Theo mặc định thì tập lệnh kiểm tra sẽ truy cập một trang từ Apache webserver 100 lần trên giây để kích hoạt công cụ mod_evasive hoạt động. Phần cuối ta sẽ điều chỉnh sao cho thích ứng với yêu cầu truy cập của từng trang web ,chúng ta nên thay đổi giá trị là 200 thay vì 100 để chắc chắn mod_evasive hoạt động đúng.
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:
for(0..100) {
Thay 100 bằng 200:
for(0..200) {
Lưu và thoát.
Chạy tập lệnh dùng:
sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl
Kết quả hiển thị:
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 truy cập với web server. Mã 403 ngụ ý truy cập đã bị chặn bởi webserver. mod_evasive cũng ghi vào hệ thống khi địa chỉ IP bị chặn, ta có thể check:
sudo tailf /var/log/messages
Kết quả trả về:
Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.
ngụ ý địa chỉ IP bị chặn bởi mod_evasive.
Nếu bạn đã cấu hình cho mod_evasive gửi cảnh báo email khi một địa chỉ IP bị chặn thì bạn sẽ nhận được thông báo trên email như sau:
mod_evasive HTTP Blacklisted 127.0.0.1
Kết luận
mod_evasive là một công cụ bảo vệ hữu hiệu cho mỗi server , tránh khỏi nguy cơ tấn công trực diện cũng như phân tán. Tuy nhiên nó chỉ hữu dụng tùy thuộc vào phạm vi của server cũng như dung lượng xử lý để xử lý và phản hồi lại những truy cập không khả dụng. Chính vì thế cần tích hợp modun này với firewall để bảo vệ một cách tối đa, nếu không thì một DDoS mạnh vẫn có thể tấn công offline một cách dễ dàng . Và nếu nó quá mạnh và dai dẳng thì bạn sẽ phải chuyển tới giải pháp là giảm thiểu tấn công DDoS dựa trên phần cứng chứ không phải phần mềm nữa.