Aprenda a proteger wp-login.php de acesso direto e permitir acesso apenas a detentores de um cookie.

É uma forma simples e eficiente de proteger a área de administração do wordpress e pode ser usada em conjunto com outras defesas.

Quando o atacante tenta acessar o wp-login.php diretamente ele recebe erro 403 o mesmo acontece se tentar acessar /wp-admin/ que vai redirecionar para wp-login.php exibir erro 403.

wp-login.php negar acesso direto

Na configuração do nginx adicione o seguinte código dentro da location /wp-login.php:

if ($http_cookie !~ "^.*wp\-secreto345=8542985367.*$"){
  return 403;
}

Esse código vai verificar se o usuário possui o cookie wp-secreto345=8542985367 caso não possua ele vai exibir erro 403.

Veja como fica uma configuração típica completa:

location = /wp-login.php {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    if ($http_cookie !~ "^.*wp\-secreto345=8542985367.*$"){
      return 403;
    }
}

Atenção

Não use esse mesmo cookie, altere de forma única para seu servidor, exemplos:
wp-supersecret0745=6589753249
wp-secret78445=3265986356
wp-ssscret5241=8759586235

A location = /wp-login.php com include fastcgi_params para funcionar php e fastcgi_pass 127.0.0.1:9000 para informar onde executar o php, depois o if com a verificação do cookie.

Essa configuração pode ser diferente no seu servidor, então não altere outros parâmetros, apenas adicione o if.

Caso não tenha nenhuma configuração específica para /wp-login.php lembre de adicionar o básico para o php funcionar nesse location do nginx.

Arquivo PHP de redirecionamento

Agora é preciso criar um arquivo PHP na raiz do wordpress com esse conteúdo abaixo:

O arquivo PHP tem que ter um nome único que apenas o administrador do site saiba, exemplo: vamoslogar2354.php

<?php
setcookie("wp-secreto345", "8542985367", time() + 3600, "/", "", true, true);
header("X-Robots-Tag: noindex");
header("Location: wp-login.php");

Esse código em PHP cria um cookie com o nome “wp-secreto345” e valor “8542985367” os mesmo valores que estão no if do nginx e verifica se o usuário tem acesso ao wp-login.php.

Esse cookie será válido por uma hora a partir do momento em que for criado e estará disponível em todo o site (“/”), além disso, o parâmetro “true” indica que o cookie deve ser enviado apenas em uma conexão segura HTTPS e o segundo parâmetro “true” indica que o cookie deve ser acessível apenas através de scripts em PHP.

Em seguida, o código envia um cabeçalho HTTP “X-Robots-Tag” com o valor “noindex”, que indica aos mecanismos de busca que a página não deve ser indexada.

Por fim, o código redireciona o usuário para a página “wp-login.php” usando o cabeçalho HTTP “Location”. Isso significa que o usuário será redirecionado automaticamente para a página de login do WordPress.

Agora, o usuário chegou na página wp-login.php e não recebeu código de erro 403, pois possui o cookie de verificação e pode efetuar o login normalmente.

Sobre essa proteção

Esse método não é a forma definitiva de proteger o wp-login.php, mas é efetivo e tem a vantagem de funcionar em conjunto com outros métodos, como o htpasswd, limit_req, lista de IPs, entre outros.

Não deve ser usado em sites woocommerce, pois os usuários do site precisam utilizar o wp-login.php para efetuar login.