Cách ngăn chặn cuộc tấn công DDoS với Nginx

Các cuộc tấn công DDoS (Distributed Denial of Service), thông qua những chiến thuật truyền thông kỹ thuật số mang tính lạm dụng, khiến tài nguyên máy chủ bị quá tải. Những kiểu tấn công này là cuộc đột kích có tổ chức trong thế giới máy tính. Vô số hành động chống đối khó chịu kết hợp cùng với nhau để tạo ra mối đe dọa với sức mạnh đủ ghê gớm, buộc một máy chủ phải tạm dừng.

Tệ nhất là, có nhiều phương tiện để tiến hành những “cuộc chiến tranh” web du kích chống lại các máy chủ như vậy. May mắn thay, các máy chủ có thể được cấu hình để chống lại những cuộc tấn công như vậy.

Nginx, một hệ thống máy chủ rất phổ biến cho các máy Unix, đi kèm với đủ chức năng tích hợp để hạn chế đáng kể hiệu quả của các cuộc tấn công DDoS.

Dưới đây là một vài tùy chọn hiệu quả để xử lý các mối đe dọa như vậy với Nginx.

Sao lưu file cấu hình

Trước khi bạn thay đổi bất kỳ cài đặt nào, hãy đảm bảo bạn tạo bản sao lưu nhanh cấu hình của máy chủ. Lệnh sau hoạt động cho mục đích này:

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup-original

Sao lưu file cấu hình

Sau khi hoàn thành, bạn đã sẵn sàng để tiếp tục.

Kiểm tra traffic

Theo dõi lưu lượng truy cập (traffic) trên máy chủ giúp bạn dễ dàng tối ưu hóa việc bảo mật và thực hiện các chiến thuật bổ sung. Nginx có một mô-đun được tạo riêng cho mục đích này.

Thiết lập trang trạng thái

Nginx thường đi kèm với một mô-đun có tên là “stub status” (http_stub_status_module), cho phép loại chức năng này được tích hợp vào môi trường máy chủ khá dễ dàng. Đầu tiên, kiểm tra nó bằng cách sử dụng lệnh sau:

nginx -V

Thiết lập trang trạng thái

Hoặc sử dụng lệnh sau để tìm thấy nó nhanh hơn:

nginx -V 2>&1 | grep -o with-http_stub_status_module

Đầu ra lệnh

Nếu đầu ra của bạn trông giống như đầu ra ở trên, thì mọi thứ đều ổn. Nếu không, bạn sẽ cần cài đặt hoặc biên dịch lại cài đặt Nginx của mình với mô-đun đi kèm.

Thiết lập trang trạng thái bạn có thể kiểm tra rất đơn giản, nhưng bạn cũng cần giới hạn quyền truy cập ở mức tối thiểu (chỉ máy tính) để duy trì bảo mật. Bắt đầu bằng cách mở file cấu hình chính của máy chủ được tìm thấy tại /etc/nginx/nginx.conf.

Mở file cấu hình máy chủ

Mở nó và thêm đoạn code sau vào “http directive” để kích hoạt mô-đun, thay thế thông tin của riêng bạn vào “localhost,” “/status_page”“127.0.0.1”.

server {
 listen 80;
 listen [::]:80;
 server_name localhost;
 ##
 # Status Page Settings
 ##
 location /status_page {
 stub_status on;
 allow 127.0.0.1;
 allow ::1;
 deny all;
 }
 }

Lưu ý: Bạn sẽ cần đặc quyền sudo để sửa đổi file này.

Bạn sẽ cần đặc quyền sudo để sửa đổi file này

Bây giờ, hãy kiểm tra cấu hình của bạn:

sudo nginx -t

Kiểm tra cấu hình

Nếu tất cả đều ổn, hãy gửi cho máy chủ tín hiệu load lại:

sudo systemctl reload nginx

Load lại máy chủ

Để truy cập trang trạng thái của bạn, hãy truy cập vị trí server_name, theo sau bởi “/status_page” trong trình duyệt web hoặc bằng cách sử dụng công cụ dòng lệnh như curl. (Điều này hữu ích nếu cache trình duyệt không tự động cập nhật). Sau đây là lệnh curl để truy cập trang trong các ví dụ:

curl localhost/status_page

Lệnh curl để truy cập trang trong các ví dụ

Trong trình duyệt, kết quả lệnh trên trông giống như hình ảnh sau đây.

Kết quả lệnh

Kiểm tra nhật ký truy cập

Nếu bạn nhận thấy lưu lượng truy cập bất thường khi kiểm tra trang trạng thái được cấu hình ở trên, có thể bạn nên kiểm tra nhật ký truy cập của máy chủ. Nhật ký truy cập của máy chủ có thể được tìm thấy tại “/var/log/nginx/access.log”. Nhật ký liệt kê các phương thức HTTP được sử dụng, ngày/giờ của các lần thử truy cập, user agent và những trang được truy cập.

Kiểm tra nhật ký truy cập

Giới hạn kết nối

Trong số nhiều chiến thuật hữu ích ngăn chặn các cuộc tấn công DDoS đáng để thử, một trong những cách đơn giản và hiệu quả nhất là hạn chế tốc độ lưu lượng truy cập đến.

Tốt nhất, bạn nên hạn chế truy cập vừa đủ để ngăn chặn các bot độc hại áp đảo máy chủ của bạn, trong khi vẫn duy trì mức giá hợp lý. Trong Nginx, điều này có thể được thực hiện bằng các directive (chỉ thị) limit_req_zonelimit_req. Đoạn code sau đặt ra các điều kiện ràng buộc về bộ nhớ và tốc độ để sử dụng ở bất kỳ vị trí nào mà máy chủ của bạn được cấu hình để hiển thị:

limit_req_zone $binary_remote_addr zone=speedbump:10m rate=10r/s;

“Zone” chỉ định tên và dung lượng (tính bằng Megabyte trong trường hợp này) của không gian bộ nhớ, nơi lưu trữ yêu cầu của người dùng. “Rate” thiết lập tổng số yêu cầu Nginx sẽ chấp nhận mỗi giây (10 yêu cầu trong ví dụ này). Hãy coi code này như một quy tắc và phần theo sau là việc sử dụng quy tắc đó:

limit_req zone=speedbump burst=20;

Code trên thực sự làm nhiều thứ hơn một chút so với việc chỉ thực hiện quy tắc giới hạn. Nó cũng thêm một hàng đợi nhỏ lên đến 20 yêu cầu để xử lý nhẹ nhàng các kết nối hợp pháp, hiển thị nhanh hơn một chút so với bình thường, vượt quá cả quy tắc và hàng đợi dẫn đến lỗi 503 cho máy khách. Cả hai directive trông giống như sau trong nginx.conf:

Cả hai directive trông giống như sau trong nginx.conf

Lập danh sách đen địa chỉ IP

Nếu có được địa chỉ IP đang thực hiện tấn công DDoS máy chủ của mình, bạn chỉ cần đưa nó vào danh sách đen và loại bỏ bất kỳ kết nối nào có nguồn gốc từ địa chỉ IP này.

Thêm code sau vào directive máy chủ của bạn:

location / {
 deny 123.123.123.0/28;
 # ...
 }

Chặn yêu cầu đối với các file nhất định

Nếu cuộc tấn công DDoS đang nhắm mục tiêu vào một số file nhất định trên máy chủ - ví dụ file xmlrpc.php trên WordPress (đây là file thường bị nhắm mục tiêu trong hầu hết các máy chủ WordPress), bạn có thể chặn tất cả các yêu cầu đối với nó. Thêm code này vào directive máy chủ của bạn:

location /xmlrpc.php {
 deny all;
 }

Thực hiện theo quy trình trên và bạn sẽ có thể hạn chế hầu hết các cuộc tấn công DDoS. Hãy chắc chắn kiểm tra tài liệu Nginx để biết các tùy chọn bảo mật bổ sung mà bạn có thể áp dụng.

Chúc bạn thực hiện thành công!

Thứ Ba, 03/09/2019 12:05
54 👨 313