Áp dụng Rate Limiting chống DDos khi expose service
Khi phát triển các dịch vụ (service) nhà phát triển thường cần phải quan tâm đến các kĩ thuật để bảo vệ ngăn chặn các cuộc tấn công DDoS mà còn cải thiện tính ổn định và sẵn sàng của hệ thống. Có rất nhiều biện pháp khác nhau để góp phần hoàn thiện quy trình ngăn chặn các cuộc tấn công DDos.
Trong bài này, chúng ta sẽ khám phá về rate limiting được sử dụng bởi các microservices của Sun Container Spinner, nhằm giúp ngăn chặn kẻ tấn công tạo ra số lượng lớn kết nối và giảm thiểu ảnh hưởng của các cuộc tấn công DDoS.
Làm việc nhiều với API chắc hẳn mọi người đã từng nghe về rate limiting - thường được nhắc đến như một phương pháp chống DDos. Bài viết này sẽ giới thiệu chi tiết về kỹ thuật rate limiting, giúp bạn hiểu được lợi ích, cách hoạt động cũng như tình huống áp dụng.
DoS hay DDoS là gì?
Một cuộc tấn công từ chối dịch vụ (tấn công DoS - viết tắt của Denial of Service) hay tấn công từ chối dịch vụ phân tán (tấn công DDoS - viết tắt của Distributed Denial of Service) là nỗ lực làm cho người dùng không thể sử dụng tài nguyên của một máy tính.
Trong thực tế, càng nhiều thiết bị request tới server cùng lúc, gây nghẽn đường truyền => hệ thống bị chậm đi một cách đáng kể với người dùng bình thường, do tài nguyên của hệ thống bị quá tải.
Tại sao dịch vụ của bạn cần được bảo vệ trước DDoS?
Khi người tiêu dùng ngày càng phụ thuộc vào các dịch vụ trực tuyến, tội phạm mạng có động cơ lớn để phá vỡ hoặc kiểm soát các dịch vụ này. Một trong những cuộc tấn công DDoS đáng chú ý nhất trên thế giới là cuộc tấn công DDoS của Amazon Web Services (AWS) vào tháng 2 năm 2020. Đây là vụ tấn công DDoS mạnh nhất từ trước đến nay nhằm vào các khách hàng sử dụng nền tảng AWS.
Có hàng triệu cuộc tấn công trên toàn thế giới. Và trên hết, sức mạnh của nó đã tăng lên đáng kể. Ngay cả các cuộc tấn công liên quan đến lưu lượng truy cập 500 gigabyte mỗi giây (Gbps) cũng đang trở nên phổ biến.
Rate limiting là gì?
Giả sử hệ thống của bạn nhận được hàng nghìn yêu cầu, trong đó chỉ có hàng trăm yêu cầu có thể được xử lý, phần còn lại không thành công (do CPU hệ thống bị quá tải và không thể xử lý yêu cầu).
Để giải quyết vấn đề này, một cơ chế giới hạn tốc độ đã được phát triển là rate limit. Mục đích của nó chỉ đơn giản là cho phép nhận được một số lượng yêu cầu nhất định trong một đơn vị thời gian. Một phản hồi lỗi được trả về nếu có quá nhiều.
Các ví dụ phổ biến về giới hạn tốc độ là:
- Mỗi người dùng chỉ có thể gửi 100 yêu cầu mỗi giây. Một phản hồi lỗi được trả về nếu vượt quá. Mỗi người dùng có thể nhập sai thẻ tín dụng không quá 3 lần mỗi ngày
- Mỗi địa chỉ IP chỉ có thể tạo hai tài khoản mỗi ngày. Về cơ bản, bộ giới hạn tốc độ cho phép một số yêu cầu được gửi trong một khoảng thời gian. Bất cứ điều gì trên đó sẽ bị chặn.
Lợi ích khi enable rate limiting trong service Sun Container Spinner
Với Sun Container Spinner, mỗi khi bạn có nhu cầu expose một dịch vụ hệ thống thì kĩ thuật rate limiting luôn được mặc định áp dụng đặt giới hạn tần suất yêu cầu từ một địa chỉ IP cụ thể trong một khoảng thời gian nhất định.
Trải nghiệm Sun Container Spinner ngay tại dashboard.sunteco.vn
Thông số hệ thống:
- Giới hạn số lượng request được gửi trong 1 giây đơn vị thời gian. Ví dụ 100 request/s.
- Giá trị min: 10 request/s
- Giá trị max: 1000 request/s
- Giá trị recommend: 200 request/s
- Hệ thống chịu tải cao: bởi vì rate limite luôn luôn phải hoạt động để bảo vệ hệ thống từ các cuộc tấn công bên ngoài vào.
- Latency thấp nhất để giúp trải nghiệm người dùng tốt hơn.
Đối với các tài nguyên dịch vụ Sun Container Spinner mặc định tính năng rate limiting sẽ luôn được áp dụng. Trong trường hợp bạn không muốn áp dụng cho dịch vụ của mình bạn có thể bỏ chọn tính năng này. Khi có nhu cầu trở lại bạn hoàn toàn có thể bật lại tính năng này.
Xem thêm tài liệu hướng dẫn tại docs.sunteco.vn
Rate limiting của Sun Container Spinner hoạt động như thế nào?
Phương pháp này hoạt động bằng cách giới hạn số lượng request đồng thời mà một nguồn (thường là địa chỉ IP) có thể gửi tới hệ thống của bạn trong một giây. Mục đích của việc giới hạn tốc độ là để ngăn chặn các yêu cầu không hợp lệ hoặc quá nhanh từ một số nguồn nhất định và bảo vệ hệ thống của bạn khỏi các cuộc tấn công DDoS, các cuộc tấn công Brute-force, và hạn chế lưu lượng truy cập không cần thiết.
Quá trình hệ thống xử lý rate limiting bao gồm các bước sau:
- Xác định số lượng request cho phép: Đặt một ngưỡng về số lượng request đồng thời mà một nguồn có thể gửi trong 1 giây. Ví dụ, một nguồn có thể chỉ được gửi tối đa 100 request đồng trong 1 giây.
- Sau khi cài đặt số lượng request / giây theo nhu cầu hệ thống theo dõi số lượng request: Hệ thống theo dõi số lượng yêu cầu mà mỗi nguồn đã gửi trong 1 giây.
- Áp dụng quy tắc rate limiting: Nếu số lượng yêu cầu từ một nguồn vượt quá ngưỡng đã đặt, hệ thống sẽ áp dụng các biện pháp như từ chối yêu cầu hoặc chậm lại tốc độ xử lý các yêu cầu.
Ví dụ về cách rate limiting trong Sun Container hoạt động:
- Nếu User thiết lập giới hạn là 100 request trong 1 giây cho mỗi địa chỉ IP và một địa chỉ IP đã gửi 120 request trong vòng 1 giây, hệ thống sẽ từ chối 20 request còn lại trong khoảng thời gian đó.
- Nếu User thiết lập giới hạn là 20 request trong 1 giây cho mỗi địa chỉ IP và một địa chỉ IP đã gửi 18 yêu cầu trong vòng 1 giây, hệ thống sẽ chấp nhận yêu cầu tiếp theo, nhưng nếu địa chỉ IP này gửi request thứ 19 trong vòng 1 giây, hệ thống sẽ từ chối yêu cầu đó.
Khi vượt quá giới hạn, nó sẽ trả về response với HTTP Status là 429 - Too many requests. Mỗi khi Client gửi request đến Web Server, Web Server sẽ gọi đến Rate Limiter để check xem ngươi dùng này đã vượt quá số rate limiting hay chưa? Nếu chưa thì sẽ gửi request đó đến API Server. Nếu đã vượt quá rồi thì sẽ block lại và trả về http status 429 (Too many requests). Sau khi lượng request đồng thời giảm xuống thì trang dịch vụ sẽ hoạt động bình thường.
Khi nào nên dùng rate limiting?
Bạn nên dùng phương pháp này khi:
- Giao diện API hoặc tài nguyên mạng của bạn có khả năng bị quá tải: Nếu bạn đang cung cấp một dịch vụ trực tuyến hoặc API mà có thể nhận được lượng lớn yêu cầu từ người dùng hoặc ứng dụng, bạn cần áp dụng rate limit để giới hạn số lần truy cập trong một khoảng thời gian nhất định.
- Ngăn chặn tấn công từ chối dịch vụ (DDoS): giúp giới hạn số lượng yêu cầu từ một nguồn cụ thể, đồng thời giảm nguy cơ bị quá tải bởi yêu cầu không hợp lý hoặc lặp đi lặp lại.
- Bảo vệ dữ liệu và tài nguyên: giúp bảo vệ dữ liệu quan trọng và tài nguyên của bạn khỏi việc bị truy cập quá mức hoặc lạm dụng.
- Điều chỉnh việc sử dụng tài nguyên: giúp quản lý việc sử dụng tài nguyên, đồng thời đảm bảo rằng tài nguyên đang được sử dụng công bằng và hiệu quả.
Thiết lập thông số rate limit hợp lý phụ thuộc vào nhu cầu của ứng dụng hoặc dịch vụ của bạn và tài nguyên mà bạn muốn bảo vệ. Thông số recommend từ hệ thống 200 request đồng thời /giây.
Tùy chỉnh thông số này cho phù hợp với quy mô ứng dụng của bạn và đảm bảo rằng nó đủ lớn để hỗ trợ một lượng lớn yêu cầu từ người dùng chính trên sự kiện bất thường. Đồng thời, bạn cũng nên theo dõi và đánh giá việc sử dụng rate limit để điều chỉnh lại nếu cần thiết.
Kết luận
Các bạn thấy việc thiết kế Rate limiting cho API thế nào? Cũng không quá khó phải không nào. Đây là một kĩ thuật/thuật toán đơn giản, hay ho nhưng lại ít khi nào được nhắc đến trong chương trình học hay các tài liệu trên mạng. Hi vọng qua bài này sẽ giúp các bạn biết thêm một kỹ thuật chống DDOS và hạn chế việc bị spam khiến sập hệ thống.
Trải nghiệm tính năng rate limiting tại https://dashboard.sunteco
Đọc thêm các bài viết kỹ thuật chuyên sâu tại Tech Sharing
All rights reserved