NỘI DUNG

Hosting tốc độ cao Vietnix - tốc độ tải trang trung bình dưới 1 giây
VPS siêu tốc Vietnix - trải nghiệm mượt mà, ổn định
10/12/2024
Lượt xem

Hướng dẫn chống tấn công DDoS bằng Nginx

10/12/2024
12 phút đọc
Lượt xem

Đánh giá

Khi truy tìm nguyên nhân gây ra lỗi “Error establishing a database connection” của WordPress, mình đã phát hiện nguyên nhân MySQL bị tắt do VPS hết RAM và OOM Killer đã kill dịch vụ MySQL. Đồng thời, mình cũng xác định được website đang bị tấn công DDoS và lấy được log mẫu. Ngay sau đây, mình sẽ chia sẻ đến bạn kinh nghiệm thực tế cách chống tấn công DDoS bằng Nginx hiệu quả.

Những điểm chính

Để nhanh chóng nắm được cách phân tích và chống tấn công DDoS bằng Nginx, ban có thể xem qua tóm tắt các điểm chính sau:

  • Phân tích log tấn công DDoS: Bạn sẽ biết được cách nhận diện các dấu hiệu bất thường trong log, từ đó phát hiện tấn công DDoS.
  • Cách chống tấn công DDoS bằng Nginx: Bạn sẽ được hướng dẫn từng bước cách cấu hình Nginx để chống lại các cuộc tấn công DDoS.
  • Tìm hiểu về công nghệ Firewall chống DDoS của Vietnix: Bạn sẽ được giới thiệu về công nghệ độc quyền và các tính năng nổi bật của Firewall Vietnix.

Phân tích log tấn công DDoS

Các điểm bất thường trong log mà bạn cần lưu ý:

  • Các truy cập vào chung 1 URL có pattern là “/?add_to_wishlist=xxxx“.
  • Truy cập xuất phát từ nhiều IP khác nhau nhưng lại chung 1 User-Agent.
  • Cùng sử dụng HTTP/1.0.
  • Các IP trên khi truy cập URL KHÔNG load kèm theo các static resources như css, js.

Sau khi phân tích log, mình có thể kết luận như sau:

  • Các truy cập trên được sinh ra từ cùng 1 công cụ tự động, được cài đặt ở nhiều máy tính khác nhau.
  • Các truy cập trên không phải của người dùng hợp lệ và không sử dụng browser để truy cập (do sử dụng HTTP/1.0 và không load các static resource kèm theo).
  • Đây là kiểu tấn công DDoS bằng botnet.
Phân tích log trước khi thực hiện chống tấn công DDoS bằng Nginx
Phân tích log tấn công DDoS

Việc cần làm tiếp theo là chặn các truy cập không hợp lệ mang các đặc điểm trên. Để giảm thiểu tối đa ảnh hưởng đến người dùng hợp lệ khác, bạn cần tạo ra một chữ ký nhận diện sao cho càng sát với đặc điểm của botnet càng tốt. Mình chọn chữ ký bao gồm TẤT CẢ các đặc điểm sau:

  1. Truy cập vào đúng URL /.
  2. Request có argument là  “add_to_wishlist” và theo sau đó là 1 dãy số.
  3. Sử dụng User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36.
  4. Sử dụng HTTP/1.0.
  5. Sử dụng method: GET.

Bạn cần viết rule chặn các điều kiện riêng lẻ trước, đảm bảo chúng hoạt động đúng trước khi kết hợp toàn bộ lại với nhau. Hiện tại website đang sử dụng mô hình Reverse Proxy nên tôi sẽ tiến hành cấu hình chống tấn cống DDoS trên Nginx.

Bước 1: Truy cập vào đúng URL /

Để chỉ áp dụng filter lên riêng các truy cập chính xác đến URL /, bạn khai báo location sử dụng exact match (dấu “=”):

location = / { 
...
}

Các điều kiện số 2-5 sẽ được config bên trong location này.

Bước 2: Request có argument là  “add_to_wishlist” và theo sau là 1 dãy số

Để kiểm tra argument “add_to_wishlist” có tồn tại hay không và theo sau có phải là 1 dãy số, bạn sử dụng regular expression như sau:

if ($arg_add_to_wishlist ~ "[0-9]+") {
    return 406;
}

Kiểm tra thử và đảm bảo điều kiện trên hoạt động đúng: Điều chỉnh file config virtualhost của website, thêm vào như sau:

location = / { 
    if ($arg_add_to_wishlist ~ "[0-9]+") {
        return 406;
    }
}

Dùng curl để kiểm tra, nếu filter hoạt động đúng sẽ trả về status code là 406 với các request dạng “/?add_to_wishlis=xxxx”, với các request khác thì status code vẫn là 200 như bình thường:

# Request tấn công, sẽ trả vể status code 406
[zero2hero@vietnix.vn ~]$ curl 'https://quantrilinux.vn/?add_to_wishlist=123' -I
HTTP/1.1 406 Not Acceptable
Server: nginx/1.16.1
Date: Wed, 29 Apr 2020 03:39:28 GMT
Content-Type: text/html
Content-Length: 163
Connection: keep-alive

# Request bình thường khác, trả về status code 200
[zero2hero@vietnix.vn ~]$ curl 'https://quantrilinux.vn/' -I
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 29 Apr 2020 04:48:53 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
Accept-Ranges: bytes

Bước 3: Request sử dụng User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36

Để kiểm tra User-Agent, bạn sử dụng biến $http_user_agent. Điều chỉnh file config Virtual Host, bạn thêm vào như sau:

location = / {
    if ($http_user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36") {
	    return 406;
    }
}

Dùng curl kiểm tra lại:

  • Nếu request sử dụng User-Agent “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36” sẽ trả về status code 406.
  • Các User-Agent khác trả về status code 200 như bình thường.
# Request sử dụng User-Agent phải trả về 406
[zero2hero@vietnix.vn ~]$ curl 'https://quantrilinux.vn/' -I -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"
HTTP/1.1 406 Not Acceptable
Server: nginx/1.16.1
Date: Wed, 29 Apr 2020 03:46:05 GMT
Content-Type: text/html
Content-Length: 565
Connection: keep-alive

# Request sử dụng User-Agent khác: trả về 200
[zero2hero@vietnix.vn ~]$ curl 'https://quantrilinux.vn/' -I -H "User-Agent: Iphone"
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 29 Apr 2020 03:51:31 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
Accept-Ranges: bytes

Bước 4: Request sử dụng HTTP1/0

Để kiểm tra version HTTP, bạn sử dụng biến “$server_protocol”. Bạn điều chỉnh file config Virtual Host và thêm vào như sau:

location = / { 
    if ($server_protocol = "HTTP/1.0") {
    	return 406;
    }
}

Khi thực hiện kiểm tra, bạn sẽ thấy nếu request sử dụng HTTP/1.0 thì trả về status code 406, ngược lại trả về status code 200 như bình thường:

# Request sử dụng HTTP/1.0: trả về 406
[zero2hero@vietnix.vn ~]$ curl 'https://quantrilinux.vn/' -I --http1.0
HTTP/1.1 406 Not Acceptable
Server: nginx/1.16.1
Date: Wed, 29 Apr 2020 03:52:12 GMT
Content-Type: text/html
Content-Length: 163
Connection: close

# Reques sử dụng HTTP/1.1: trả về 200
[zero2hero@vietnix.vn ~]$ curl 'https://quantrilinux.vn/' -I --http1.1
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 29 Apr 2020 04:57:35 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
Accept-Ranges: bytes

Bước 5: Sử dụng method: GET

Để kiểm tra request method, bạn sử dụng biến “$request_method”, điều chỉnh file config thêm vào dòng sau:

location = / { 
    if ($request_method = "GET") {
    	return 406;
    }
}

Bước 6: Tổng hợp tất cả các điều kiện

Các điều kiện riêng lẻ đã được kiểm tra và đảm bảo hoạt động đúng như mong muốn, bạn cần kết hợp các điều kiện lại với nhau sao cho khi request chứa TẤT CẢ các đặc điểm trên sẽ bị DROP. 

Tuy nhiên, Nginx không hỗ trợ toán tử AND để giúp bạn AND các điều kiện lại với nhau, bạn cần sử dụng trick như sau:

  • Khai báo một biến $BLOCK với giá trị rỗng.
  • Mỗi điều kiện match sẽ Append một giá trị vào biến $BLOCK.
  • Nếu kết quả cuối cùng của biến $BLOCK chứa đầy đủ các giá trị mong muốn thì DROP request đấy.

Cụ thể:

   location = / {
                set $BLOCK "";
                if ($arg_add_to_wishlist ~ "[0-9]+") {
                        set $BLOCK "${BLOCK}T";
                }

                if ($http_user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36") {
                        set $BLOCK "${BLOCK}R";
                }

                if ($server_protocol = "HTTP/1.0") {
                        set $BLOCK "${BLOCK}U";
                }

                if ($request_method = "GET") {
                        set $BLOCK "${BLOCK}E";
                }

                if ($BLOCK = "TRUE") {
                        return 444;
                }
                [...]
        }

Bạn thực hiện kiểm tra lại như sau: 

[zero2hero@vietnix.vn ~]$ curl 'https://quantrilinux.vn/?add_to_wishlist=123' -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36" --http1.0
curl: (52) Empty reply from server

Khi sử dụng return 444, kết quả nhận được khi curl sẽ là “curl: (52) Empty reply from server”, kết quả hoàn toàn đúng như mong đợi.

Đến đây, ngoài việc xử lý vấn đề khách hàng đang gặp là lỗi “Error Establishing database connection”, ta cũng đã xác định được nguyên chính dẫn đến lỗi này và khắc phục để lỗi không lặp lại.

Cách chống tấn công DDoS hiện tại đang rất chuyên biệt cho riêng trường hợp này, nếu kẻ tấn công thay đổi một chút thì sẽ bypass được. Tuy nhiên, đó cũng là chủ ý của mình: khi chống tấn công DDoS chặn càng sát thì càng dễ bị bypass, đổi lại sẽ càng ít khách hàng hợp lệ bị chặn nhầm, đây là trade off tùy mỗi người lựa chọn. Vẫn có những cách chống tấn công DDoS khác tổng quan hơn, mình sẽ chia sẻ với các bạn trong một dịp khác.

Vietnix – Địa chỉ cung cấp giải pháp Firewall chống DDoS độc quyền tại Việt Nam

Để đối phó với các cuộc tấn công DDoS ngày càng tinh vi, việc trang bị một hệ thống Firewall chống DDoS mạnh mẽ là điều cần thiết cho các doanh nghiệp.

Với hơn 12 năm kinh nghiệm trong lĩnh vực bảo mật và cung cấp dịch vụ Firewall chống DDoS, Vietnix tự hào là đơn vị tiên phong tại Việt Nam sở hữu công nghệ độc quyền được chứng nhận sở hữu trí tuệ. Hệ thống Firewall của Vietnix không chỉ liên tục cập nhật công nghệ mà còn cho phép tùy chỉnh các quy tắc (rule) theo từng ứng dụng cụ thể, giúp tự động phát hiện và ngăn chặn các cuộc tấn công DDoS nhanh chóng và hiệu quả.

Với giao diện quản lý Firewall trực quan, bạn có thể dễ dàng kiểm soát truy cập quốc tế và quản lý IP hiệu quả mà không cần hỗ trợ của kỹ thuật. Kết hợp với chiến lược phòng thủ chiều sâu, giải pháp Firewall của Vietnix giúp bảo vệ toàn diện hệ thống, đảm bảo website, ứng dụng và máy chủ của doanh nghiệp luôn an toàn trước mọi mối đe dọa.

Liên hệ ngay với Vietnix hoặc truy cập website để tìm hiểu chi tiết hơn về dịch vụ Firewall chống DDoS độc quyền.

Thông tin liên hệ:

  • Hotline: 18001093
  • Email: sales@vietnix.com.vn
  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
  • Website: https://vietnix.vn/

Như vậy, chúng ta đã cùng nhau tìm hiểu cách chống tấn công DDoS bằng Nginx. Việc bảo vệ website khỏi các mối đe dọa là vô cùng quan trọng để đảm bảo sự ổn định và phát triển của doanh nghiệp. Để tìm hiểu thêm các kiến thức về chống DDoS, bạn có thể tham khảo các bài viết bên dưới.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Chọn chủ đề :

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Banner group
Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

MAXSPEED HOSTING

TĂNG TỐC WEBSITE TOÀN DIỆN

CÔNG NGHỆ ĐỘC QUYỀN

PHẦN CỨNG MẠNH MẼ

HỖ TRỢ 24/7

ĐĂNG KÝ NGAY
Pattern

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

Icon
ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1
Icon
XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG