
Hintergrund: Ich betreibe mehrere WordPress-Sites und mir fällt eine große Anzahl verteilter Brute-Force-Anmeldeversuche auf. fail2ban hilft mir hier nicht, da der Angreifer vorsichtig nur bis zu 5 Anmeldeversuche pro IP durchführt und dann zu einer anderen wechselt.
Mein Problem ist nicht, dass ich mir Sorgen darüber mache, ob die Passwörter richtig erraten werden. Mich beunruhigt nur die enorme Belastung, die dadurch für den Server entsteht.
Meine Idee ist einfach: Ich lebe in der Schweiz undmanche(Nicht alle) Websites werden nur von der Schweiz aus aufgerufen, daher möchte ich Anmeldeversuche aus anderen Ländern auf diesen Websites blockieren. Klingt einfach? Nun, nginx will mir da nicht zustimmen.
Ich habe das folgende Snippet wie folgt eingerichtet snippets/php.conf
:
index index.html index.htm index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_read_timeout 300;
}
Ich füge diesen Ausschnitt aus den meisten Dateien in ein /etc/nginx/sites-enabled
. Ich habe das GeoIP-Modul von nginx aktiviert und konfiguriert und es scheint einwandfrei zu funktionieren (Konfiguration hier nicht gezeigt). Viele Site-Konfigurationen sehen so aus:
server {
listen 80;
server_name mydomain.com;
location / {
# common WordPress config
try_files $uri $uri/ /index.php;
}
location ^~ /wp-login.php {
# CH is the country code for Switzerland
if ($geoip_country_code != CH) {
return 444;
}
include snippets/php.conf; # <-- #1
}
root /var/www/mydomain.com;
include snippets/php.conf;
}
Ich habe überall gelesen, dass nginx immer nur übereinstimmteinsStandortblock, weil es einfach so funktioniert. Es kann also nur entweder mit dem Standortblock für wp-login.php
oder mit dem Block für übereinstimmen .php
, aber nicht mit beidem.
Wenn ich alsoentfernendie mit markierte Zeile, #1
dann sieht alles gut aus: In der Schweiz kann ich wp-login.php
darauf zugreifen, außerhalb der Schweiz nicht. Super! Wenn ich jedoch darauf zugreifen kann, wird die wp-login.php
Datei nur heruntergeladen, anstatt sie auszuführen. Das scheint zu erwarten, da der Standortblock für die Ausführung .php
nicht übereinstimmte und daher das FastCGI-Zeug nicht funktioniert.
Das lässt mich glauben, dass ich die mit gekennzeichnete Zeile tatsächlich hinzufügen muss #1
. Wenn ich das aber mache, dann kann ich plötzlich wp-login.php
von allen IPs aus auf die zugreifen, egal aus welchem Land sie stammen.
Was mache ich falsch? Ich habe unzählige Artikel darüber gefunden, wie man PHP mit nginx einrichtet, und auch unzählige Artikel darüber, wie man bestimmte Länder blockiert. Aber keinen, der beides tut.
BEARBEITEN:
Hier ist der Inhalt, snippets/fastcgi-php.conf
falls es von Bedeutung ist; ich glaube, dieser stammt aus der Standardinstallation von Nginx auf Debian Stretch:
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;