Cloudflare WAF Rate Limiting Rules: Chặn Brute Force và Credential Stuffing bằng giới hạn tốc độ
Custom Rules và Managed Rules giỏi nhận diện request “có hình dạng” độc hại — payload chứa SQL injection, XSS… Nhưng có một kiểu lạm dụng mà các bộ rule đó không xử lý tốt: request hoàn toàn hợp lệ về nội dung, chỉ có điều bị gửi đi quá nhiều lần trong thời gian quá ngắn. Đó là lúc Rate Limiting Rules phát huy tác dụng.
🚦 Rate Limiting Rules là gì?
Rate Limiting Rules giới hạn số lượng request mà một người dùng, một địa chỉ IP, hoặc một ứng dụng cụ thể được phép gửi đến hệ thống trong một khoảng thời gian nhất định. Mục tiêu cốt lõi là bảo vệ hệ thống khỏi quá tải, ngăn chặn tấn công từ chối dịch vụ (DoS) hoặc brute force, đồng thời đảm bảo tài nguyên được phân bổ công bằng cho tất cả người dùng — không để một vài nguồn bất thường “ăn hết” băng thông xử lý.
Một rule rate limit có thể được dùng để giới hạn theo nhiều tiêu chí khác nhau:
- Số lượng request mỗi giây, mỗi phút, hoặc mỗi giờ
- Tổng số request trong một khoảng thời gian nhất định
- Số request đến từ một địa chỉ IP, một tài khoản người dùng, hoặc một endpoint API cụ thể
Khi đạt đến giới hạn đã đặt, hệ thống sẽ từ chối các request tiếp theo hoặc trì hoãn xử lý cho đến khi bộ đếm được reset — thường là sau khi khoảng thời gian quy định kết thúc.
🧩 Các thành phần trong một Rate Limiting Rule
Giống mọi rule khác chạy trên Ruleset Engine của Cloudflare, rate limiting rule vẫn có 2 tham số nền tảng — Expression (điều kiện khớp traffic) và Action (hành động khi đạt ngưỡng). Nhưng vì bản chất là “đếm theo thời gian”, rate limiting rule cần thêm 5 tham số bổ sung:
📊 Characteristics
Bộ tham số xác định Cloudflare sẽ theo dõi tốc độ truy cập theo “thước đo” nào — ví dụ theo IP, theo Header, theo JA3 fingerprint.
⏱️ Period
Khoảng thời gian (tính bằng giây) dùng để đánh giá tốc độ/tần suất truy cập.
🔢 Request per period
Số lượng request tối đa trong khoảng Period đó trước khi rule bị kích hoạt.
⏳ Duration
Khi đã đạt ngưỡng, đây là khoảng thời gian rule sẽ tiếp tục chặn các request tiếp theo.
🎛️ Action behavior
Theo mặc định, Cloudflare áp dụng action cho toàn bộ khoảng Duration đã cấu hình, bất kể tốc độ request trong khoảng thời gian đó như thế nào. Với khách hàng gói doanh nghiệp, có thêm tùy chọn Throttle requests over the maximum configured rate — thay vì chặn cứng cả khoảng thời gian, hệ thống chỉ chặn đúng phần request vượt ngưỡng, các request còn lại trong giới hạn vẫn được phép đi qua.
📋 Quy trình tạo một Rate Limiting Rule
Bước 1-2 — Chọn account và domain
Đăng nhập dash.cloudflare.com, chọn đúng tài khoản, sau đó chọn domain cần áp dụng rate limit.
Bước 3-4 — Mở tab Rate limiting rules và tạo mới
Vào Security → WAF → Rate limiting rules → bấm Create rule. Đây là tab riêng biệt nằm cạnh Custom rules và Managed rules, chuyên dùng cho các quy tắc giới hạn tốc độ truy cập.
Bước 5 — Đặt tên rule
Nhập tên gợi nhớ vào Rule name. Ví dụ một rule cho phép tối đa 5 lần đăng nhập thất bại trong 10 giây có thể đặt tên kiểu “Login_Fail_5_per_10s”.
Bước 6 — Khai báo điều kiện khớp request
Tại If incoming requests match…, chọn các field HTTP cần đối chiếu — thường gặp nhất là URI (đường dẫn endpoint cần bảo vệ, ví dụ /login) kết hợp And với Hostname để giới hạn đúng zone đang cấu hình.
Bước 7 (tùy chọn) — Cache status
Nếu chỉ muốn tính tốc độ truy cập dựa trên request thực sự chạm tới origin server (bỏ qua những request được phục vụ từ cache), tắt toggle Also apply rate limiting to cached assets.
Bước 8 — With the same characteristics
Đây là bước quyết định Cloudflare sẽ “đếm” theo đơn vị nào. Thêm một hoặc nhiều đặc điểm (ví dụ IP, Header value of…, hoặc field tùy chỉnh) — mỗi tổ hợp giá trị riêng biệt sẽ có một bộ đếm độc lập. Ví dụ chọn IP nghĩa là mỗi địa chỉ IP có một bộ đếm 5 request/10 giây của riêng nó.
Bước 9 (tùy chọn) — Custom counting expression
Nếu muốn chỉ tăng bộ đếm khi một điều kiện cụ thể được đáp ứng (kể cả dựa trên response header trả về), bật Use custom counting expression và khai báo biểu thức riêng tại Increment counter when…. Mặc định, biểu thức đếm sẽ giống hệt biểu thức rule ở Bước 6.
Bước 10 — When rate exceeds
Định nghĩa số lượng request tối đa (Requests) và khoảng thời gian xem xét (Period). Ví dụ: 5 request trong 10 seconds — nghĩa là một IP gửi quá 5 request trong vòng 10 giây sẽ kích hoạt rule.
Bước 11-12 — Then take action + Custom response
Tại Then take action, chọn hành động khi vượt ngưỡng — phổ biến nhất là Block để Cloudflare từ chối thẳng các request thừa. Có thể tùy chỉnh thêm phản hồi trả về: response type Custom Text, response code 429 (mã chuẩn cho “Too Many Requests”), response body ví dụ “Access Denied!”.
Bước 13 — Chọn hành vi chặn (With the following behaviour)
Đây là khoảng thời gian (mitigation timeout) Cloudflare áp dụng action đã chọn sau khi đạt ngưỡng. Có 2 lựa chọn:
- Block for the selected duration: một khi đạt ngưỡng, WAF chặn toàn bộ request trong suốt thời gian đã chọn (ví dụ 1 phút) trước khi bộ đếm reset
- Throttle requests over the maximum configured rate (chỉ dành cho gói doanh nghiệp): WAF chỉ chặn đúng phần request vượt rate đã cấu hình, các request còn lại trong giới hạn vẫn được phép đi qua bình thường
Bước 14 — Triển khai
Bấm Deploy để áp dụng rule ngay, hoặc Save as Draft nếu chưa muốn kích hoạt chính thức.
🔍 Tìm một giới hạn tốc độ phù hợp
Đặt ngưỡng rate limit quá thấp sẽ chặn nhầm người dùng thật, đặt quá cao thì gần như vô tác dụng. Cloudflare cung cấp tab Rate limit analysis nằm trong Security → Analytics, hiển thị dữ liệu thực tế về tỷ lệ request khớp với các bộ lọc và khoảng thời gian bạn chọn — giúp xác định con số phù hợp dựa trên hành vi traffic thật, thay vì đoán mò.
Bước 1 — Xác định phạm vi: vào Security → Analytics, chọn tab Traffic analysis, lọc theo một khoảng thời gian không cao điểm để thấy phân bổ traffic thông thường, sau đó đổi sang khung giờ trùng với đợt nghi ngờ bị tấn công để so sánh — chú ý các chỉ số Mitigated by WAF, Served by Cloudflare, Served by origin.
Bước 2 — Tìm kiếm tỷ lệ phù hợp: chuyển sang tab Rate limit analysis, chọn thuộc tính cần nhóm (Group by top) — IP address, hoặc JA3 fingerprint nếu zone có bật Bot Management — cùng khoảng thời gian (1 phút, 5 phút hoặc 1 giờ). Biểu đồ sẽ hiển thị phân phối số request của 50 IP/JA3 nhiều nhất, sắp theo thứ tự giảm dần.
Bước 3 — Kéo thanh trượt: di chuyển thanh trượt ngang trên biểu đồ lên xuống để xem trực quan tác động của từng mức ngưỡng — bao nhiêu IP sẽ rơi vào diện bị giới hạn nếu chọn mức đó. Có thể thu hẹp thêm bằng bộ lọc theo Path nếu chỉ muốn áp dụng cho một endpoint cụ thể (ví dụ /login).
Bước 4 — Xác minh lại: lặp lại quy trình chọn ngưỡng ở trên, nhưng lần này áp vào đúng phần traffic mà bạn biết có xảy ra tấn công hoặc traffic cao điểm. Ngưỡng đã chọn cần chặn được lưu lượng bất thường trong đợt đó, đồng thời vẫn cho phép traffic ở mức bình thường đi qua trót lọt. Có thể đối chiếu thêm với log mẫu để xác minh dấu vân tay (fingerprint) và bộ lọc đã chọn là chính xác.
💡 2 mẹo thực chiến khi cấu hình Rate Limiting
Mẹo 1 — Tạo rule trực tiếp ngay từ biểu đồ Rate Limit Analysis
Không cần quay lại tab Create rule và gõ lại toàn bộ điều kiện — ngay tại biểu đồ Rate limit analysis, sau khi đã chọn IP/JA3 và kéo thanh trượt đến ngưỡng ưng ý, bấm Create rate limiting rule. Cloudflare sẽ tự động điền sẵn các trường Field, Characteristics và Rate limit dựa trên đúng những gì bạn vừa phân tích trên biểu đồ — bạn chỉ cần rà soát lại và chọn action phù hợp.
Mẹo 2 — Hai use case phổ biến nhất khi áp dụng Rate Limiting
Use case 1 — Chống Credential Stuffing cho trang đăng nhập
Endpoint đăng nhập là mục tiêu kinh điển của các cuộc dò mật khẩu hàng loạt. Rule ví dụ: điều kiện Hostname contains “sonic.com.vn” AND URI Path equals “/login” AND Request Method equals “POST”; characteristic IP with NAT Support (đếm chính xác hơn cho các IP dùng chung qua NAT); ngưỡng 5 requests / 10 seconds; action Block; duration 10 seconds.
Use case 2 — Giới hạn theo loại thiết bị (Limit by User Agent)
Khi muốn áp ngưỡng khác nhau cho từng loại client — ví dụ ứng dụng di động được phép gọi nhiều hơn trình duyệt desktop. Rule ví dụ: điều kiện User Agent equals “MobileApp”; characteristic IP; ngưỡng 100 requests / 10 minutes; action Managed Challenge trong 10 giây. Có thể tạo thêm một rule riêng với ngưỡng chặt hơn dành cho trình duyệt desktop.
💡 Tổng kết nhanh từ Next Step
- Bắt đầu với action Log để quan sát hành vi thực tế trước khi mạnh tay chuyển sang Block/Challenge
- Dùng tab Rate limit analysis thay vì đoán số liệu — ngưỡng nên dựa trên dữ liệu traffic thật của chính hệ thống
- Ưu tiên characteristic IP with NAT Support cho các trường hợp người dùng truy cập qua mạng dùng chung NAT (văn phòng, trường học, ISP di động)
- Endpoint đăng nhập, đăng ký, OTP luôn nên có rate limit riêng — đây là mục tiêu hàng đầu của brute force và credential stuffing
- Với gói Enterprise, cân nhắc dùng Throttle thay vì Block for duration nếu muốn trải nghiệm người dùng mượt hơn thay vì bị khóa cứng
Cần hỗ trợ cấu hình Rate Limiting?
Đội ngũ Next Step hỗ trợ thiết kế ngưỡng rate limit phù hợp với từng endpoint và mô hình traffic thực tế của doanh nghiệp bạn — liên hệ (+84) 933 810 688 hoặc [email protected].