nginx: bloquea archivos PHP específicos de la mayoría de los países

nginx: bloquea archivos PHP específicos de la mayoría de los países

Antecedentes: Administro varios sitios de WordPress y noto una gran cantidad de intentos de inicio de sesión distribuidos por fuerza bruta. fail2ban no me ayuda aquí porque el atacante intenta cuidadosamente solo hasta 5 inicios de sesión por IP y luego cambia a uno diferente.

Mi problema no es que me preocupe que las contraseñas se adivinen correctamente. Sólo me preocupa la enorme cantidad de carga que esto provoca en el servidor.

Mi idea es simple: vivo en Suiza yalguno(no en todos) los sitios solo podrán iniciar sesión desde Suiza, por lo que me gustaría bloquear los intentos de inicio de sesión desde otros países en esos sitios. ¿Suena fácil? Bueno, nginx no quiere estar de acuerdo conmigo.

Tengo el siguiente fragmento configurado como 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;
}

Incluyo este fragmento de la mayoría de los archivos en formato /etc/nginx/sites-enabled. He habilitado y configurado el módulo nginx geoip y parece funcionar bien (la configuración no se muestra aquí). Muchas configuraciones de sitios se ven así:

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;
}

He leído en todas partes que nginx solo coincideunobloque de ubicación, porque así es como funciona. Por lo tanto, solo puede coincidir con el bloque de ubicación wp-login.phpo coincidir con el bloque de .php, pero no con ambos.

Así que si yoeliminarla línea marcada con #1entonces la cosa se ve bien: En Suiza puedo acceder wp-login.phpy fuera de Suiza no puedo acceder. ¡Excelente! Sin embargo, cuando puedo acceder a él, simplemente descarga el wp-login.phparchivo en lugar de ejecutarlo. Eso parece esperado, ya que el bloque de ubicación para la ejecución .phpno coincidía y, por lo tanto, las cosas de fastcgi no funcionan.

Eso me hace creer que realmente necesito agregar la línea marcada con #1. Pero si hago eso, de repente puedo acceder wp-login.phpdesde todas las IP sin importar de qué país sean.

¿Qué estoy haciendo mal? Encontré toneladas de artículos sobre cómo configurar PHP con nginx y también toneladas de artículos sobre cómo bloquear ciertos países. Pero ninguno que haga ambas cosas.

EDITAR:

Aquí está el contenido, snippets/fastcgi-php.confen caso de que importe, creo que uno proviene de la instalación predeterminada de nginx en 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;

información relacionada