nginx: Bloqueia arquivo PHP específico da maioria dos países

nginx: Bloqueia arquivo PHP específico da maioria dos países

Histórico: administro vários sites WordPress e noto uma grande quantidade de tentativas de login de força bruta distribuídas. fail2ban não me ajuda aqui porque o invasor tenta cuidadosamente apenas até 5 logins por IP e depois muda para um diferente.

Meu problema não é que eu me preocupe com o fato de as senhas serem adivinhadas corretamente. Só me preocupo com a enorme quantidade de carga que isso causa no servidor.

A minha ideia é simples: moro na Suíça ealguns(nem todos) os sites só terão login na Suíça, por isso gostaria de bloquear tentativas de login de outros países nesses sites. Parece fácil? Bem, o nginx não quer concordar comigo.

Eu tenho o seguinte trecho 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;
}

Incluo esse trecho da maioria dos arquivos no formato /etc/nginx/sites-enabled. Habilitei e configurei o módulo nginx geoip e parece funcionar bem (configuração não mostrada aqui). Muitas configurações de site são assim:

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

Eu li em todos os lugares que o nginx só correspondeumbloco de localização, porque é assim que funciona. Portanto, ele só pode corresponder ao bloco location wp-login.phpou ao bloco for .php, mas não a ambos.

Então se euremovera linha marcada com #1então as coisas parecem boas: Na Suíça posso acessar wp-login.phpe fora da Suíça não consigo acessar. Ótimo! Porém, quando consigo acessá-lo, ele apenas baixa o wp-login.phparquivo em vez de executá-lo. Isso parece esperado, já que o bloco de localização para execução .phpnão correspondeu e, portanto, o material fastcgi não funciona.

Isso me faz acreditar que realmente preciso adicionar a linha marcada com #1. Mas se eu fizer isso, de repente poderei acessar wp-login.phptodos os IPs, independentemente do país de origem.

O que estou fazendo de errado? Encontrei muitos artigos sobre como configurar o PHP com nginx e também muitos artigos sobre como bloquear determinados países. Mas nenhum que faça as duas coisas.

EDITAR:

Aqui está o conteúdo, snippets/fastcgi-php.confcaso seja importante, acredito que veio da instalação padrão do nginx no 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;

informação relacionada