Loading

NGINX Rate Limits für Wordpress Pingbacks

Die Wordpress Datei xmlrpc.php wird regelmässig Opfer von DoS Angriffen. Die Datei komplett für Zugriffe zu sperren, ist in vielen Fällen aber keine akzeptable Lösung, da Pingbacks darauf angewiesen sind. Mittels Rate Limits lässt sich NGINX sichern, so dass Pingbacks wie gewünscht funktionieren, die Sicherheit des Servers aber nicht kompromittiert wird.

Die Datei xmlrpc.php, welche sich im Stammordner von Wordpress befindet, stellt Plugins und Programmen eine API zur Verfügung. Unter anderem dient sie auch dazu Pingbacks entgegenzunehmen. Pingbacks sind Benachrichtigungen von Blogging und Content Management Systemen, dass Webinhalte, z.B. ein Blogpost von jemand anderem verlinkt wurden. Dies ist ein sehr nützliches und sehr beliebtes Feature. Weil die Pingbacks von unterschiedlichsten IP Adressen stammen, kann der Zugriff auf xmlrpc.php nicht einfach auf die lokale Adresse beschränkt werden.

Limits für WP Pingbacks

Das Hauptproblem von xmlrpc.php ist, dass man es dazu nutzen kann, einen Server zu überlasten, um einen Portscan durchzuführen oder Benutzerpasswörter per Brute Force zu knacken.

Wordpress Security Plugins

Es gibt verschiedene Wordpress Security Plugins, welche die Sicherheit von Wordpress erhöhen und z.B. Brute Force Attacken verhindern können. Eines dieser Plugins ist Wordfence. Diese Plugins erhöhen die Sicherheit von Wordpress und helfen dabei die Angriffsfläche zu reduzieren.

xmlrpc.php mit Rate Limits schützen

Die einfachste und sicherste Lösung wäre xmlrpc.php komplett zu sperren oder auf die Server IP zu beschränken. Dies wird insbesondere aus Sicherheitsgründen auch an vielen Orten gemacht. Dann muss aber auch auf die Pingbacks verzichtet werden. Eine bessere und benutzerfreundlichere Lösung sind HTTP Request Rate Limits. Dies bedeutet, dass die Datei xmlrpc.php für eine bestimmte Anzahl von Zugriffen pro IP Adresse offen bleibt. Wird dieses Limit überschritten, werden die Zugriffe gesperrt. Mit dieser einfachen Massnahme können erfolgreiche Portscans und Brute Force Attacken verhindert werden.

Ein solches Vorgehen schützt die Webseite vor DoS Angriffen einzelner IP Adressen. Bei verteilten Angriffen (DDoS) von sehr vielen verschiedenen IP Adressen, genügt diese Massnahme alleine aber nicht. Trotzdem sind Rate Limits auch bei verteilten Attacken sehr nützlich und helfen oft den attackierten Server online zu halten. Zudem lassen sich Rate Limits mit fail2ban kombinieren, so dass wiederkehrende Angreifer komplett ausgeschlossen werden können.

Apache Webserver

Unter dem Apache Webserver lassen sich Rate Limits mittels rate-limit oder mod_evasive implementieren, wobei letzteres gezielt gegen DoS Angriffe konzipiert wurde. Da wir hauptsächlich mit NGINX arbeiten, fokussiert sich dieser Blogpost auf die NGNIX Konfiguration. Weitere Informationen zu mod_evasive.

NGINX Konfiguration unter Debian

Die beschriebenen Konfigrationsdateien und -Pfade beziehen sich auf das Debian Paket von NGINX, welches auch unter Ubuntu verfügbar ist. Falls Anleitungen für andere Linux Distributionen gewünscht sind, einfach einen Kommentar hinterlassen.

Rate Limit definieren

Als erstes muss das Rate Limit in einem HTTP Block definiert werden. Dies geschieht zum Beispiel mit Hilfe eines Includes in der Datei limit.conf im Ordner conf.d welcher automatisch inkludiert wird.

/etc/nginx/conf.d/limit.conf:

limit_req_zone $binary_remote_addr zone=xmlrpc:16m rate=10r/m;

Diese Konfigurationszeile definiert ein neues Rate Limit namens xmlrpc. Die binäre IP Adresse ($binary_remote_addr) wird als Schlüssel für den Lookup verwendet. Die Datenbank hat eine maximale Grösse von 16 Megabyte und die Anzahl Requests wird auf 10 pro Minute limitiert. Diese Zahl kann natürlich beliebig verändert werden. 10 pro Minute ist immer noch ein relativ offener Wert und könnte bei Bedarf und bei regelmässigen Angriffen noch verkleinert werden.

Im Server Block wird dann das effektive Limit gesetzt.

/etc/nginx/sites-enabled/000-default

location = /xmlrpc.php { limit_req zone=xmlrpc burst=10; include inc/php-fpm.conf; }

Ein Burst von 10 bedeutet, dass das Maximum von 10 Requests pro Minute kurzfristig um 10 Requests überschritten werden kann. Auch dieser Wert kann nach Bedarf angepasst und verkleinert werden. Der include von php-fpm.conf ist notwendig, damit die Requests an PHP FPM weitergeleitet werden. Mehr zum Thema NGINX und PHP gibt's hier.

Zusammenfassung

Pingbacks sind ein nützliches Feature von modernen Blog- und Content Management Systemen. Hoffentlich hilft dieser Post, dass Sie xmlrpc.php auf ihrer Wordpress Seite nicht sperren müssen und ihre Webseite oder ihr Blog trotzdem vor lästigen Angriffen geschützt ist.

Wie bereits erwähnt, lassen sich mit dieser Konfiguration nur kleine Angriffe von einzelnen oder wenigen IP Adressen abwehren. Für die Abwehr grosser Angriffe benötigt man zusätzlich Content Distribution Netzwerke, Load Balancing und weitere DDoS Abwehr Mechanismen.