Eine Anmeldeseite ohne Begrenzung lässt sich so schnell durchprobieren, wie das Netz es zulässt. Eine Begrenzung macht ein schwaches Passwort nicht stark; sie sorgt dafür, dass Raten länger dauert, als irgendjemand warten will - was praktisch dasselbe ist.

Am Webserver

limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

location = /wp-login.php {
    limit_req zone=login burst=3 nodelay;
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

Fünf pro Minute mit einem Puffer von drei: schneller tippt niemand, und eine Maschine steht sofort still. Machen Sie das am Server, nicht in der Anwendung - eine hier abgewiesene Anfrage erreicht PHP überhaupt nie.

Erst beobachten, dann erzwingen

grep -c "limiting requests" /var/log/nginx/error.log
Eine zu niedrig gesetzte Grenze sperrt echte Menschen aus, und die melden es nicht - die gehen. Beobachten Sie das Log eine Woche lang bei großzügiger Rate, bevor Sie enger stellen.

Wiederholungstäter sperren

# /etc/fail2ban/jail.local
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 3600

Was eine Begrenzung nicht leistet

  • Sie hält keinen verteilten Versuch von tausend Adressen auf, von denen jede zweimal probiert.
  • Sie hilft nicht, wenn das Passwort längst geleakt ist - der Angreifer braucht einen Versuch.
Zwei-Faktor macht Ratenbegrenzung fast überflüssig, und Ratenbegrenzung macht Zwei-Faktor nicht überflüssig. Wenn Sie nur eines tun, tun Sie Zwei-Faktor.