Como bloquear a listagem externa de logins de usuário no WordPress?

Por padrão, o WordPress permite que a lista de usuários administrativos seja obtida por meio da seguinte URL:

https://<seusite>/wp-json/wp/v2/users/

Essa exposição pode representar um risco de segurança, pois facilita ataques de força bruta e tentativas de phishing.

Bloqueando a listagem pela API REST

Desativar completamente a API REST não é viável, pois diversos plugins e o próprio núcleo do WordPress utilizam chamadas de API.
Uma alternativa é remover apenas os endpoints que expõem informações de usuários.

Adicione o seguinte filtro no arquivo functions.php do seu tema ativo ou em um plugin de snippets (como o Code Snippets):

add_filter('rest_endpoints', function($endpoints) {
    if (isset($endpoints['/wp/v2/users'])) {
        unset($endpoints['/wp/v2/users']);
    }
    if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
        unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
    }
    return $endpoints;
});

Nota: Esse filtro remove a listagem e consulta de usuários via REST, mas não interfere em outras funcionalidades da API.

Bloqueando enumeração de usuários por parâmetro author

Outra forma de descobrir logins de usuários no WordPress é através da URL:

https://<seusite>/?author=1

Esse método exibe a página de autor com o apelido e posts publicados.

Para bloquear esse tipo de consulta, recomendamos o plugin Stop User Enumeration.

  • Ele bloqueia tentativas de enumeração de usuários por query string.
  • Pode ser integrado ao Fail2ban para banir IPs que realizem múltiplas tentativas.

Integração com Fail2ban

Se você utiliza o Fail2ban (conforme orientado em nossas wikis), basta instalar os arquivos de configuração fornecidos pelo desenvolvedor do plugin:

Arquivo: /etc/fail2ban/jail.d/wordpress-userenum.conf
Arquivo: /etc/fail2ban/filter.d/wordpress-userenum.conf

Exemplo de configuração:

[wordpress-userenum]
enabled   = true
filter    = wordpress-userenum
logpath   = /var/log/auth.log
maxretry  = 2
port      = http,https
[INCLUDES]
before = common.conf

[Definition]
_daemon = wordpress
failregex = ^%(__prefix_line)sAttempted user enumeration from <HOST>$
ignoreregex =

Notas importantes:

  • Use maxretry = 2 (ou maior) para evitar falsos positivos de bots de busca.
  • Após incluir os arquivos, reinicie o Fail2ban.

Mais informações

AVISO LEGAL: Os procedimentos descritos neste documento devem ser executados de acordo com o contexto de cada sistema, de forma a evitar impactos negativos à segurança, disponibilidade, integridade e privacidade de dados. A CentralServer se reserva o direito de modificar a qualquer tempo e sem aviso prévio as informações aqui apresentadas a fim de refletir o lançamento de novos serviços, atualizações físicas e operacionais, e evolução do estado-da-arte da tecnologia.