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.
