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.
Chống tấn công DDoS bằng Nginx
- Bước 1: Truy cập vào đúng URL /
- Bước 2: Request có argument là “add_to_wishlist” và theo sau là 1 dãy số
- 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
- Bước 4: Request sử dụng HTTP1/0
- Bước 5: Sử dụng method: GET
- Bước 6: Tổng hợp tất cả các điều kiện
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:
- Truy cập vào đúng URL /.
- Request có argument là “add_to_wishlist” và theo sau đó là 1 dãy số.
- 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ử dụng HTTP/1.0.
- 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.