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 yapmayın. Saldırıyı çok boyutlu anahtarlama ve katmanlı savunma ile kırın.
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ız lazım.
- Redis sliding-window’u çok boyutta anahtarlayın. Token bucket da bu problemi çözer; ben boyutları tek bir yapıda birleştirmek için sliding-window’u tercih ediyorum. Tek bir sayaç değil, birkaç boyutta sayaç tutun: 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ın. Normalde gevşek olan limitleri, hata (başarısız login) oranı ani yükseldiğinde otomatik daraltın. Sabit eşik yerine, saldırı sinyaliyle sertleşen bir eşik kullanın.
- Credential stuffing’e karşı hesap kilidi ve challenge ekleyin. Başarısız login’lerde hesap bazında kademeli gecikme/kilit uygulayın; N denemeden sonra CAPTCHA veya proof-of-work isteyin. Bu, dağıtık saldırının tek hedefli versiyonunu (account takeover) ayrıca kapatır.
- Gerçek volumetrik DDoS’u edge’e itin. Uygulamanız bir L3/L7 flood’unu ememez — bunu kabul edin. Hacimsel saldırıyı Cloudflare gibi bir edge katmanına bırakın; sizin Redis limiter’ınız akıllı, hedefli kötüye kullanımı durdurur, ama sel için altyapı katmanı gerekir.
- Login yolunu fail-closed yapın, hangi boyutun tetiklendiğini sızdırmayın. Limiter ya da Redis hata verirse login’i kapatın (fail-closed), açık bırakmayın. Reddederken “IP’iniz engellendi” gibi hangi boyutun patladığını saldırgana söylemeyin; kararları loglayın ama sadece kendi tuning’iniz 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.