Rate Limiting & Protecție Brute-Force în Nginx în Nginx

Securitate și Protecție Nginx Core 1.0+

Limitarea ratei de cereri per adresă IP folosind algoritmul Leaky Bucket pentru prevenirea atacurilor DDoS și de spargere de parole.

Sintaxă
limit_req_zone & limit_req zone=... burst=... nodelay

Fără o limitare strictă a ratei de cereri, endpoint-urile critice ale aplicațiilor tale (cum ar fi rutele de autentificare `/api/login` sau căutarea în baza de date) pot fi doborâte cu ușurință de scripturi malițioase sau atacuri de tip brute-force.

Nginx implementează un sistem de Rate Limiting de înaltă performanță bazat pe algoritmul Leaky Bucket. În contextul `http`, se definește o zonă de memorie partajată prin directiva limit_req_zone (care stochează stările IP-urilor cu un consum minim de RAM).

În blocul de `location`, directiva limit_req impune limita dorită (de exemplu maxim 5 cereri pe secundă). Parametrul opțional burst permite mici vârfuri temporare de trafic legitim fără a bloca utilizatorul, în timp ce nodelay procesează cererile conforme imediat, returnând eroarea HTTP 429 sau 503 doar celor care abuzează.

Sintaxă, opțiuni și concepte cheie

Opțiune / Concept Descriere practică
limit_req_zone $binary_remote_addr zone=nume:10m rate=10r/s Definește zona de memorie de 10MB indexată după IP-ul binar.
limit_req zone=nume burst=5 nodelay Aplică limita în locație cu o toleranță de 5 cereri în buffer.
limit_req_status 429 Instruiește Nginx să returneze codul standard ‘429 Too Many Requests’ în loc de 503.
$binary_remote_addr Reprezentarea binară compactă a adresei IP (ocupă doar 4 octeți pentru IPv4 și 16 octeți pentru IPv6).

Exemple practice și cod

Exemplul 1: Protejarea rutei de autentificare /login împotriva atacurilor de brute-force

Configurația completă pentru limitare strictă pe login.

# În /etc/nginx/nginx.conf (blocul http):
limit_req_zone $binary_remote_addr zone=protectie_login:10m rate=2r/s;
limit_req_status 429;

# În fișierul de site (blocul server):
server {
    listen 443 ssl;
    server_name dexblog.ro;

    # Rută de login strict protejată (maxim 2 cereri/s cu burst de 4):
    location /wp-login.php {
        limit_req zone=protectie_login burst=4 nodelay;
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

Rezultat & Impact

Blocare instantanee a oricărui atac automat de dicționar pe formularul de autentificare.

Greșeli frecvente și bune practici

  • Folosirea variabilei `$remote_addr` în loc de `$binary_remote_addr` în definirea zonei, ceea ce irosește de 4 ori mai multă memorie RAM.
  • Omiterea parametrului `nodelay` la setarea unui burst mare, ceea ce face ca Nginx să introducă întârzieri artificiale frustrante pentru utilizatorii legitimi.

Ghiduri și noțiuni înrudite