Müşterilerimden biri birkaç alanda başarılı e-ticaret faaliyetleri yürütüyor. Fakat kullandıkları sistemleri uzun süredir faal şekilde kullandıkları için yenileyemiyorlar. Kullandıkları oldukça popüler olan hazır bir CMS’ye birileri dadanmış ve sürekli SQL serverı yoracak sorgular göndererek serverın çalışmaz hale gelmesine neden oluyorlar.

İlk başta problemi sorguları gönderen ip adreslerini engelleyerek çözdüm, fakat daha sonra farklı ip adresleriyle tekrar aynı durum oluşunca farklı bir çözüm yoluna gitmeye karar verdim.

Müşterimin sistemleri Nginx üzerinde çalışıyor ve veritabanı Mariadb. Saldırı ise şu şekilde çalışıyor; sitede düzgün yönetilmemiş bir arama sistemi üzerinde sürekli “search” parametresi üzerinden detaylı sorgu gönderilerek SQL serverın yorulması sağlanıyor ve serverın tüm kaynakları tüketiliyor, sistem devre dışı kalıyor.

İlk başta kullanılan websitenin kodlarında oynama yaparak sorunu çözmeyi düşünsem de bu hem vakit alacak hem de kullanılan hazır CMS sisteminin orjinal yapısını bozarak gelebilecek yeni sürümlerde problem çıkarma ihtimalini arttıracaktı.

Çözüm

Sorunu Nginx üzerinde “search” parametresi üzerinde “request rate limit” uygulayarak çözmeye karar verdim. İlgili saldırı defalarca bu parametre üzerinden istek atarak SQL serverın fazla kaynak tüketmesine sebep oluyordu, eğer çeşitli sayfalarda get parametresi olarak iletilen “search” argümanına rate limit uygulayabilirsem ip bazında belli bir istek kotasından sonrasını server düşürecek ve işleme almayacaktı, böylece sistem çalışmaya devam edecekti.

map $arg_search $limit {
    "" "";
    default $binary_remote_addr;
}

limit_req_zone $limit zone=s_zone:10m rate=30r/m;

server {

...

“$arg_search” get parametresi olarak gelen search değişkeni dolu olarak gelirse “$limit” değişkenine isteğin geldiği ip değerini atayarak rate limite dahil ediyor.

limit_req zone=s_zone;
limit_req_status 429;

Server bloğunun içine dahil edilen bu kod da eğer rate limite ulaşılmışsa, 429 http koduyla gelen isteği düşürerek isteğin sql server tarafından işlenmesini engelleyerek problemi ortadan kaldırıyor.