
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.php
ou ao bloco for .php
, mas não a ambos.
Então se euremovera linha marcada com #1
então as coisas parecem boas: Na Suíça posso acessar wp-login.php
e fora da Suíça não consigo acessar. Ótimo! Porém, quando consigo acessá-lo, ele apenas baixa o wp-login.php
arquivo em vez de executá-lo. Isso parece esperado, já que o bloco de localização para execução .php
nã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.php
todos 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.conf
caso 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;