Dağıtık brute force ve DDoS'a karşı akıllı rate limiting'i nasıl kurarım?
Soru
API'ın login endpoint'ine yoğun brute force ve DDoS saldırısı var. Standart IP tabanlı rate limiting (dakikada 60 istek) işe yaramıyor çünkü saldırgan proxy arkasından binlerce farklı IP kullanıyor. Redis tabanlı sliding window counter ya da token bucket ile; IP, kullanıcı adı, User-Agent ve ülke kodunu kombine eden dinamik ve akıllı bir rate limiter'ı nasıl inşa ederim?
Cevap
Kısa cevap: IP başına limit, dönen proxy’lere karşı çaresiz — o yüzden ölçeklemeyi yalnızca IP üzerinden yapma. Saldırıyı çok boyutlu anahtarlama ve katmanlı savunma ile kır.
Asıl problem şu: saldırgan binlerce IP’yi rotasyona soktuğu için “IP başına 60” kuralı her bireysel IP için asla tetiklenmez. Saldırının ortak paydasını yakalaman lazım.
- Redis sliding-window’u çok boyutta anahtarla. Tek bir sayaç değil, birkaç boyutta sayaç tut: kullanıcı adı (tek hesap spray’leniyorsa), IP, IP subnet’i / ASN, User-Agent parmak izi, ülke kodu. Bir IP temiz görünse de aynı
username’e binlerce farklı IP’den vuran trafik o boyutta patlar. - Başarısızlık oranı yükselince dinamik sık. Normalde gevşek olan limitleri, hata (başarısız login) oranı ani yükseldiğinde otomatik daralt. Sabit eşik yerine, saldırı sinyaliyle sertleşen bir eşik kullan.
- Credential stuffing’e karşı hesap kilidi ve challenge ekle. Başarısız login’lerde hesap bazında kademeli gecikme/kilit uygula; N denemeden sonra CAPTCHA veya proof-of-work iste. Bu, dağıtık saldırının tek hedefli versiyonunu (account takeover) ayrıca kapatır.
- Gerçek volumetrik DDoS’u edge’e it. Uygulaman bir L3/L7 flood’unu ememez — bunu kabul et. Hacimsel saldırıyı Cloudflare gibi bir edge katmanına bırak; senin Redis limiter’ın akıllı, hedefli kötüye kullanımı durdurur, ama sel için altyapı katmanı gerekir.
- Login yolunu fail-closed yap, hangi boyutun tetiklendiğini sızdırma. Limiter ya da Redis hata verirse login’i kapat (fail-closed), açık bırakma. Reddederken “IP’n engellendi” gibi hangi boyutun patladığını saldırgana söyleme; kararları logla ama sadece kendi tuning’in için.
Sonuç: Ben olsam Redis’te hesap + IP + ASN üzerinde sliding-window kurar, credential stuffing için hesap kilidi ekler, volumetrik kısmı edge’e bırakırdım. Tek boyut (IP) hiçbir zaman yetmez; saldırının ortak paydasını yakalayan kombinasyon işi çözer.
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.