Hiện nay, các cuộc tấn công DDoS vì mục đích xấu ngày càng nhiều. Dẫn đến việc chống tấn công DDoS là một trong những ưu tiên hiện nay. NGINX và NGINX Plus là hai phương pháp chống DDoS tương đối hiệu quả. Vậy Anti DDoS NGINX là gì? Vì sao nên sử dụng nó?
Tấn công từ chối dịch vụ phân tán (DDoS) là một loại tấn công làm vô hiệu hóa dịch vụ của các trang web. Nó gửi một lượng lớn lưu lượng truy cập từ nhiều máy đến server trang web. Khi đó server không còn khả năng đáp ứng được các dịch vụ vì không còn tài nguyên nữa.
Thông thường, các hacker sẽ làm nghẽn một hệ thống với số lượng rất lớn các kết nối và request. Từ đó, máy chủ không thể nhận thêm truy cập mới nữa. Hoặc kết nối đến nó sẽ bị chậm lại đến mức không thể sử dụng được.
Tấn công DDoS ở application layer
Các cuộc tấn công DDoS ở lớp ứng dụng (Layer 7/HTTP) được thực hiện bởi các chương trình phần mềm (bot). Chúng có thể được điều chỉnh để khai thác tối đa các lỗ hổng của hệ thống. Đặc biệt là các hệ thống không thể xử lý được các lưu lượng lớn.
Các hacker chỉ cần mở một số lượng lớn kết nối. Sau đó giữ cho chúng hoạt động bằng cách gửi đều đặn các truy cập. Khi đó, tài nguyên của hệ thống đó sẽ nhanh chóng bị cạn kiệt. Các cuộc tấn công này đều được thực hiện bởi bot.
Do đó các hacker có thể dễ dàng thực hiện mở số lượng lớn các kết nối. Đồng thời gửi rất nhiều request đến hệ thống một cách nhanh chóng.
Các đặc điểm
Dựa vào những đặc điểm của tấn công DDoS, ta có thể tìm ra các cách chống DDoS với NGINX cụ thể. Chẳng hạn:
- Lưu lượng truy cập thường bắt đầu từ một tập hợp các địa chỉ IP cố định. Chúng thuộc về các máy được sử dụng để thực hiện tấn công. Do đó, mỗi địa chỉ IP chịu trách nhiệm cho rất nhiều kết nối và yêu cầu. Việc này khá là bất thường khi so với những người dùng thực. Tuy nhiên, cần lưu ý rằng không phải tất cả những lưu lượng này đều có mục đích tấn công DDoS. Việc sử dụng forward proxy cũng có biểu hiện tương tự. Sở dĩ vì địa chỉ IP của server forward proxy được sử dụng làm địa chỉ client cho các yêu cầu từ tất cả các client thực mà nó phục vụ. Dù vậy, nó cũng thường có lưu lượng thấp hơn nhiều so với các cuộc tấn công DDoS.
- Lưu lượng truy cập được tạo bởi các bot. Các lưu lượng cũng được tạo ra để áp đảo các máy chủ. Do đó, tỉ lệ truy cập thường cao hơn rất nhiều so với khả năng một người dùng có thể tạo ra.
- Header User-Agent thường là một giá trị dạng non-standard (không chuẩn).
- Header Referer thường là một giá trị có thể liên kết với cuộc tấn công.
Xem thêm: User Agent là gì? Cách thay đổi UA trên Chrome, Safari, Firefox và Microsoft Edge
Chống DDoS với NGINX
Anti DDoS NGINX là gì? Tại sao nên dùng nó để ngăn chặn các cuộc tấn công DDoS? Đầu tiên, NGINX và NGINX Plus là máy chủ web có nhiều tính năng phù hợp để giải quyết các cuộc tấn công DDoS. Nó có khả năng điều chỉnh và kiểm soát lưu lượng đến trang web khi nó được ủy quyền cho máy chủ backend.
Khả năng bảo vệ vốn có của NGINX
NGINX được thiết kế để trở thành một “bộ giảm shock” cho các trang web và ứng dụng. Nó có kiến trúc non-blocking và event-driven. Từ đó cho nó khả năng giải quyết với một lượng request khổng lồ. Đồng thời không làm tăng quá nhiều việc sử dụng tài nguyên.
Các yêu cầu mới từ mạng không gián đoạn các phiên làm việc của NGINX. Vì vậy, NGINX có khả năng ngăn chặn trang web khỏi các cuộc tấn công.
Giới hạn tần suất của các yêu cầu
Tần suất chấp nhận các yêu cầu của NGINX và NGINX Plus có thể được giới hạn đến một giá trị xác định cho người dùng thực. Ví dụ: người dùng thực truy cập trang đăng nhập chỉ có thể gửi các yêu cầu đến sau mỗi 2 giây. NGINX và NGINX Plus có thể được cấu hình để cho phép một địa chỉ IP máy khách duy nhất đăng nhập sau mỗi 2 giây (tương đương 30 yêu cầu/phút).
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
server {
# ...
location /login.html {
limit_req zone=one;
# ...
}
}
Chỉ thị limit_req_zone định cấu hình một vùng bộ nhớ dùng chung, gọi là one. Dùng để lưu trữ trạng thái của các yêu cầu cho key được chỉ định. Trong trường hợp này là địa chỉ IP của máy khách ($binary_remote_addr). Chỉ thị limit_req trong block location cho /login.html tham chiếu đến vùng bộ nhớ được chia sẻ.
Giới hạn số lượng kết nối
Người dùng có thể giới hạn số lượng kết nối có thể được mở bởi một địa chỉ IP của máy khách, đến một giá trị thích hợp cho người dùng thực. Ví dụ: Mỗi địa chỉ IP của ứng dụng khách mở không được vượt quá 10 kết nối đến khu vực /store trên một trang web.
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
# ...
location /store/ {
limit_conn addr 10;
# ...
}
}
Chỉ thị limit_conn_zone định cấu hình một vùng bộ nhớ dùng chung addr để lưu trữ các yêu cầu cho khóa được chỉ định. Trong trường hợp này là địa chỉ IP của máy khách, $binary_remote_addr. Chỉ thị limit_conn trong block location cho /store tham chiếu đến vùng bộ nhớ được chia sẻ. Đồng thời giới hạn tối đa 10 kết nối từ mỗi địa chỉ IP của máy khách.
Chặn các kết nối chậm
Các kết nối ghi dữ liệu quá thường xuyên thường là biểu hiện để giữ kết nối mở càng lâu càng tốt. Từ đó làm giảm khả năng chấp nhận các kết nối mới của máy chủ. Vì vậy thông qua NGINX và NGINX Plus, các kết nối này có thể được chủ động chặn lại.
Slowloris là một ví dụ của loại tấn công này. Chỉ thị client_body_timeout kiểm soát thời gian NGINX đợi giữa các lần ghi của client body. Chỉ thị client_header_timeout sẽ kiểm soát thời gian NGINX đợi giữa các lần ghi của header máy khách. Chúng ta sẽ mặc định giá trị cho cả hai lệnh là 60 giây. Trong ví dụ này, NGINX sẽ được cấu hình để chờ không quá 5 giây giữa các lần ghi.
server {
client_body_timeout 5s;
client_header_timeout 5s;
# ...
}
Từ chối địa chỉ IP
Nếu xác định được một địa chỉ IP đang sử dụng để tấn công DDoS, NGINX và NGINX Plus có thể từ chối các kết nối của chúng. Việc này có thể được thực hiện với chỉ thị deny. Lấy ví dụ với dải địa chỉ nghi ngờ là 123.123.123.1 đến 123.123.123.16:
location / {
deny 123.123.123.0/28;
# ...
}
Cho phép các địa chỉ IP xác định
Nếu quyền truy cập đến trang web hay ứng dụng chỉ được phép từ một hay nhiều tập hợp hoặc dải IP cụ thể, chỉ thị allow và deny có thể được sử dụng cùng với nhau. Từ đó, chỉ cho phép những địa chỉ xác định truy cập vào trang web hay ứng dụng. Lấy ví dụ khi cần hạn chế quyền truy cập chỉ vào các địa chỉ trong một mạng cục bộ cụ thể:
location / {
allow 192.168.1.0/24;
deny all;
# ...
}
Ở đây, chỉ thị deny all chặn tất cả địa chỉ IP không nằm trong dải được chỉ định bởi allow.
Sử dụng bộ nhớ đệm (caching) để ổn định lưu lượng
Khi xảy ra xác cuộc tấn công DDoS, lưu lượng truy cập sẽ bị tăng đột biến. Phần lớn lưu lượng này có thể được phục vụ thông qua cấu hình NGINX và NGINX Plus. Cụ thể là bằng cách bật caching và đặt các thông số caching nhất định. Từ đó có thể giảm tải các yêu cầu từ backend. Một số cài đặt hữu ích bao gồm:
- Tham số updating đến chỉ thị proxy_cache_use cho NGINX biết khi nào cần cập nhật một đối tượng được lưu trong bộ nhớ cache cũ. Khi đó, nó sẽ gửi một request cho bản cập nhật. Sau đó tiếp tục phân phối cache object cũ cho những client request nó trong thời gian đang update bản cập nhật từ máy chủ backend. Có khi các request lặp đi lặp lại cho một file nhất định. Đây thường là dấu hiệu của các cuộc tấn công DDoS. Lúc đó số lượng yêu cầu đến các máy chủ backend sẽ được giảm đáng kể.
- Khóa định nghĩa bởi chỉ thị proxy_cache_key thường bao gồm các biến nhúng. Khóa mặc định $scheme$proxy_host$request_uri gồm ba biến. Nếu giá trị bao gồm biến $query_string, thì một cuộc tấn công gửi các chuỗi truy vấn ngẫu nhiên có thể gây ra lượng caching dư thừa. Do đó, không nên thêm biến $query_string vào key nếu không cần thiết.
Chặn các yêu cầu
NGINX và có thể được cấu hình để chặn một số loại yêu cầu sau:
- Request đến một URL cụ thể đã được xác định làm mục tiêu tấn công.
- Các request mà header User-Agent được đặt thành một giá trị bất thường so với các truy cập hợp lệ khác.
- Các request mà header Referer được đặt thành một giá trị có thể được liên kết với cuộc tấn công.
- Request mà trong đó các header khác có giá trị có thể liên kết với việc tấn công.
Lấy ví dụ, sau khi xác định được một cuộc tấn công DDoS nhắm vào URL /foo.php, mọi request đến trang có thể được chặn lại:
location /foo.php {
deny all;
}
Hoặc nếu cuộc tấn công DDoS yêu cầu một giá trị header User-Agent dạng foo hoặc bar:
location / {
if ($http_user_agent ~* foo|bar) {
return 403;
}
# ...
}
Biến http_name tham chiếu đến một header yêu cầu, như ví dụ trên là header User-Agent. Một cách tiếp cận tương tự có thể được sử dụng với các header khác.
Giới hạn kết nối đến máy chủ backend
NGIX hoặc NGINX Plus có khả năng xử lý nhiều kết nối đồng thời tốt hơn các máy chủ backend đang cân bằng tải. Với NGINX Plus, lượng kết nối đến mỗi máy chủ backend có thể được giới hạn. Lấy ví dụ khi muốn giới hạn không quá 200 kết nối đến mỗi server backend:
upstream website {
server 192.168.100.1:80 max_conns=200;
server 192.168.100.2:80 max_conns=200;
queue 10 timeout=30s;
}
Tham số max_cons được áp dụng cho mỗi máy chủ chỉ định số lượng kết nối tối đa mà NGINX Plus mở. Chỉ thị queue giới hạn lượng yêu cầu đợi khi mọi máy chủ trong nhóm upstream đã đạt giới hạn kết nối. Đồng thời, tham số timeout chỉ định thời gian một yêu cầu đợi.
Nhận biết tấn công DDoS
Ta đã biết được Anti DDoS NGINX là gì, và cách sử dụng NGINX cũng như NGINX Plus. Tuy vậy, cách thức của chống DDoS với NGINX là gì? Module NGINX Plus Status cung cấp các số liệu chi tiết về lưu lượng đang được cân bằng tải tới các máy chủ backend. Từ đó module này có thể được dùng để phát hiện các mẫu lưu lượng bất thường. NGINX Plus đi kèm với trang dashboard trang web mô tả bằng đồ thị trạng thái hiện tại của hệ thống. Ví dụ có thể được xem tại demo.nginx.com. Bên cạnh đó, các chỉ số tương tự cũng có sẵn qua một API.
>> Xem thêm: NGINX Configuration: Hướng dẫn cho người mới
Lời kết
NGINX và NGINX Plus là một sự lựa chọn tốt để giảm thiểu các cuộc tấn công DDoS. Bên cạnh tìm hiểu Anti DDoS NGINX là gì và chống DDoS với NGINX, các bạn có thể tham khảo gói Anti DDoS bằng Firewall Anti DDoS của Vietnix để giúp bảo mật cho website tốt hơn.