
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.php
o coincidir con el bloque de .php
, pero no con ambos.
Así que si yoeliminarla línea marcada con #1
entonces la cosa se ve bien: En Suiza puedo acceder wp-login.php
y fuera de Suiza no puedo acceder. ¡Excelente! Sin embargo, cuando puedo acceder a él, simplemente descarga el wp-login.php
archivo en lugar de ejecutarlo. Eso parece esperado, ya que el bloque de ubicación para la ejecución .php
no 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.php
desde 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.conf
en 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;