Português do Brasil English
Devin no Facebook  Devin no Twitter  RSS do Site 
Segurança    

Protegendo o login do WordPress contra força bruta (wordpress bots)


Comentários  5
Visualizações  
567.169

Quem tem algum site em WordPress e vê com frequência os logs de acesso, vai perceber que há sempre um monte de IPs tentando se logar como administrador do site. Essas várias tentativas por vários IPs geralmente são na verdade bots/zumbis que ficam vasculhando a Internet atrás de sites que tenham alguma falha e/ou senhas fracas de admin. Imagine muitas máquinas fazendo várias requisições no seu servidor… Pra que isso né? Carga e tráfego totalmente desnecessários.

Existem várias técnicas para se precaver desses wordpress bots. Vamos explorar algumas delas…

Mude o nome do usuário do administrador

A primeira dica é mudar o nome do usuário de admin para qualquer outra coisa. Essa dica está bem explícita em diversas páginas, inclusive recomendada pelo criador do WordPress, o Matt. Existem duas maneiras de se fazer isso: mudando o nome diretamente no banco de dados ou criando um novo usuário admin e removendo o antigo/padrão.

Primeiro vamos alterar diretamente no banco de dados, que na minha opinião é muito mais fácil e rápido. Conecte-se ao servidor e banco MySQL do seu WordPress e execute o comando:

mysql> SELECT * FROM wp_users WHERE user_login='admin' \G
*************************** 1. row ***************************
                 ID: 1
         user_login: admin
          user_pass: $P$HDGSYGfiyrgifbISFUGIWGRw5bhrfk
      user_nicename: admin
         user_email: [email protected]
           user_url: http://www.meusiteradical.com.br
    user_registered: 2006-03-29 19:29:34
user_activation_key:
        user_status: 0
       display_name: Administrador
1 row in set (0.00 sec)

Basta então alterar o campo user_login para um outro nome qualquer. Exemplo:

mysql> UPDATE wp_users SET user_login='raquel' WHERE user_login='admin';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Pronto! Agora o nome do usuário do administrador principal é raquel.

O outro jeito, que é mais fácil para quem não tem acesso ao banco de dados e pode ser feito por usuários mais leigos é criar um novo usuário admin e remover o outro.

Para fazer isto:

  • Como usuário admin, na administração, escolha a opção de adicionar um novo usuário (Usuários – Adicionar Novo);
  • Crie um novo usuário normalmente com suas informações e senha. Mas não se esqueça de colocá-lo como Administrador;
  • Com o novo usuário criado, deslogue-se e logue-se com o usuário novo (que é administrador).
WordPress - Novo usuário

WordPress – Novo usuário

  • Vá na lista de usuários (Usuários – Todos Usuários) e procure pelo usuário admin.
  • Aperte na opção Excluir do usuário admin;
  • Mova todas as postagens e comentários do usuário admin para o novo usuário criado.
WordPress - Remover admin

WordPress – Remover admin

Pronto! Simples né?

Protegendo através de Cookies

O método de proteger via cookies é genérico ao ponto de poder ser usado não apenas no WordPress, mas com qualquer outro sistema. Usando esse método, você fornece ao usuário que quer acessar o login uma URL de entrada especial. Essa URL de entrada na verdade vai configurar um cookie específico no navegador do cliente, e só com esse cookie ele pode acessar uma determinada página – que no nosso caso é o wp-login.php.

A grande vantagem deste método é que os bots não sabem nem da página especial de entrada e nem do valor do Cookie, então eles vão de cara receber um status 403 “Proibido” ao tentar fazer qualquer coisa na URL de login do WordPress. Isso quer dizer que o WordPress não vai ser nem chamado e nenhuma carga grande de CPU/memória será gasta para todos esses logins vindo de tantos IPs diferentes.

A desvantagem é que essa é uma forma de segurança através de obscuridade, ou seja, você só está escondendo as informações, não está realmente impedindo de alguém fazer a força bruta. Como se tratam de bots, provavelmente eles não terão e nem conseguirão essas informações, por isso esse método é bastante válido.

Há diversas formas de fazer a configuração de proteção por Cookies, vamos ver algumas delas, mas antes precisamos criar o PHP que vai gerar o Cookie para o usuário. Antes de mais nada, vamos gerar uma chave, que será o valor do nosso Cookie. Vou usar o comando uuidgen para gerar um valor aleatório como exemplo:

$ uuidgen
142c1a27-ea75-4d26-bbc3-39fcb1d0c7f1

Pronto. Agora o nosso código vai ser 142c1a27-ea75-4d26-bbc3-39fcb1d0c7f1. Agora na raiz do seu site WordPress, crie um arquivo com um nome qualquer. Sim, esse nome também tem que ser único, pois é a URL que você vai passar para os usuários acessarem a administração do WordPress. Vamos usar o seguinte exemplo:

  • http://www.site.com/entrar-no-site.php

Então crie o arquivo entrar-no-site.php na raiz do seu WordPress com o seguinte conteúdo:

<?php
setcookie('site-allow-login','142c1a27-ea75-4d26-bbc3-39fcb1d0c7f1',time()+3600);
header("Location: wp-login.php");
?>

Esse PHP cria um Cookie chamado site-allow-login com o nosso código como valor e redireciona para o wp-login.php. Bem simples. O Cookie expira em 1 hora no navegador de quem acessou a página. Toda vez que você for usar a administração, use a URL escolhida ao invés do wp-admin/ ou wp-login.php.

Com o cookie funcionando, agora é hora de configurar o seu servidor favorito para autorizar (ou não) o acesso.

Autorizando no Apache

O Apache, como um dos servidores mais utilizados por aí para hospedar WordPress, é bem fácil de configurar.

Edite o arquivo .htaccess na raiz de seu WordPress e adicione o seguinte conteúdo (pode ser bem no começo do arquivo):

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} wp-login.php
    RewriteCond %{HTTP_COOKIE} !site-allow-login=142c1a27-ea75-4d26-bbc3-39fcb1d0c7f1
    RewriteRule . - [F]
</IfModule>

Pronto! Agora o wp-login.php só poderá ser acessado se o usuário enviar o cookie site-allow-login com o nosso código. Neste trecho anterior, usamos o mod_rewrite do Apache para verificar duas condições: se a URL que o usuário pediu (REQUEST_URI) foi o wp-login.php e se ele não existe nenhum cookie site-allow-login com o código como valor. Caso essas duas condições forem verdadeiras, ele nega todo o acesso através da flag [F] da linha RewriteRule.

Nota: Usamos o arquivo .htaccess para fazer essa configuração, mas você pode colocar essas regras de Rewrite em outros lugares do Apache também (Directory, LocationMatch, VirtualHost, etc). Se quiser saber de mais informações sobre o arquivo htaccess no Apache, leia também o Tutorial Apache: htaccess.

Esse tipo de verificação no Apache fica muito mais rápido que no PHP. E assim você não precisa mudar códigos ou adicionar plugins no WordPress. Lembrando que basta você mudar a URL wp-login.php e essa autorização pode funcionar em qualquer tipo de sistema.

Autorizando no Varnish

No Varnish, basta colocar as seguintes regras dentro do vcl_recv:

# only allow logins with a special cookie
if (req.url ~ "wp-login\.php" && req.http.cookie !~ "site-allow-login=142c1a27-ea75-4d26-bbc3-39fcb1d0c7f1") {
  error 403 "Forbidden.";
}

Que vai fazer a mesma verificação: caso a URL (req.url) for wp-login.php e o usuário não tiver o cookie (req.http.cookie) site-allow-login com nosso código como valor, ele retorna um 403 Proibido.

Autorizando no Nginx

No nginx, dentro do bloco do server que está o seu WordPress, coloque o seguinte código:

location /wp-login.php {
  if ($http_cookie !~ "site-allow-login=142c1a27-ea75-4d26-bbc3-39fcb1d0c7f1") {
    return 403 "Forbidden";
  }
}

Assim quando o usuário tentar acessar o /wp-login.php, o nginx nega qualquer acesso que não tenha o nosso cookie ($http_cookie).

Outros métodos

Claro que não existem apenas estes dois métodos para melhorar a segurança contra os bots… Você também pode:

Referências

567.169

Comentários  5
Visualizações  
567.169


TagsLeia também

Apaixonado por Linux e administração de sistemas. Viciado em Internet, servidores, e em passar conhecimento. Idealizador do Devin, tem como meta aprender e ensinar muito Linux, o que ele vem fazendo desde 1997 :-)


Leia também



Comentários

5 respostas para “Protegendo o login do WordPress contra força bruta (wordpress bots)”

  1. William Bruno disse:

    Muito bom cara! continue com posts assim sobre servidores.
    A sua palestra no InterconDev foi ótima!

  2. Rafael disse:

    Muito bom Hugo, estou querendo testar aqui em localhost como funcionaria isso em MU.

    Você consegue me dar uma luz como eu poderia fazer isso automaticamente para os usuários de subsites no Multisite do WP. Tipo se o site xyz.com pertence a rede x.com, para que eu consiga gerar automaticamente na criação desse novo site a proteção via cookie com uma chave própria desse cliente com sua url própria (domínio). Pensei em montar algum script PHP que rodasse na hora da ativação, gerasse a chave e etc, o meu problema é que eu não encontrei um meio seguro de escrever no config do nginx ou em um .htaccess do apache automaticamente a diretiva de redirecionamento sem deixar uma bagunça os códigos depois de algumas pessoas criando sites após outras.

    • eitchugo disse:

      Você provavelmente vai ter que criar um script para fazer isso mesmo. No máximo, a fins de organização, você pode começar o bloco dentro do .htaccess com um delimitador de começo e fim, assim a "bagunça" fica menor. Exemplo:

      ### Begin Cookie Access Control: site.xyz.com

      ### End Cookie Access Control: site.xyz.com

      Assim você coloca um hook no WordPress, para que quando um site for criado ele adicione esse bloco, e quando for removido, remova este bloco. É um jeito… Devem existir vários.

      • Rafael disse:

        Pô Hugo, pode existir vários, mas acho que é isso mesmo que o meu cinzento estava querendo produzir, rsrs, valeu mesmo.
        Devido essa minha procura eu estava até coletando alguns hooks que poderiam me ajudar nesse projeto maroto, então eu acredito que o hook wpmu_new_blog deve ser o cara para isso(se um novo site do multisite está sendo criado), certo?

        Na questão da manipulação de arquivo acredito que seja bom eu utilizar um template, tipo yaml, markdown, com o ### Begin …:variavel diretivas … variavel ###End… e com o php manipular para ser salvo no .htaccess real que abriga os sites do MU, o que vc acha?

        Assim que eu voltar para esse teste aqui em MU vou começar a tentativa. Sem me esqueçar, já venho desde o inicio com WP praticando as melhores ideias para aumentar a proteção e são muitas …, existem duas que eu ainda não tinha lido em lugar nenhum, essa sua dos cookies que é muito valida e uma que eu mesmo fiz desde o inicio e possuem muitos sites por aí com o problema de XSS na parte de comentários do WP, quando a pessoa vai responder a resposta do outro, como o php é dinâmico então a galera nem pensa em inicializar uma variável corretamente e simplesmente fazendo isso é eliminado algumas dores de cabeça, o pessoal já está começando a se acostumar de validar os inputs de pesquisa entre outros, mas esquecem ou ainda não sabem que possuem outras variáveis que podem ser uma porta para outras práticas.

        Vlw Hugo, se eu me lembrar eu volto no assunto e digito se deu certo.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *