Protegendo seu WordPress de ataques
Esse site que está acessando é uma instalação do WordPress. Eu gosto da facilidade dele.
O WordPress é mesmo muito bom para se produzir um blog rapidamente em um VPS ou Nuvem, mas sua facilidade também é seu maior defeito.
Como é muito simples ter um site com ele, a grande maioria das páginas presentes na internet são feitos utilizando-o e consequentemente isso atrai aqueles que procuram falhas na programação de seu código aberto.
Uma vez descoberto uma falha, um hacker malvadão vai poder usar esta falha em milhões de sites pelo mundo, para publicar arquivos, enviar e-mails e até criar sites falsos dentro de um domínio. Tudo isso são coisas que eu já vi e acredito que até você já tenha visto.
Uma das coisas que mais me incomoda no WordPress é seu mecanismo de autenticação e de execução XML-RPC. São fontes constantes de ataque de força bruta.
Dá só uma olhada nas ultimas 10 linhas nesse meu arquivo de log (tirado em tempo real desse servidor enquanto escrevo este artigo sem o uso de nenhum mecanismo de proteção).
Jun 8 21:09:39 host wordpress(xxxxxxx.com.br)[1010]: Authentication failure for gestao_click from 196.41.127.26 Jun 8 21:09:40 host wordpress(xxxxxxx.com.br)[1791]: Authentication failure for guestposter from 196.41.127.26 Jun 8 21:09:41 host wordpress(xxxxxxx.com.br)[9892]: Authentication failure for ricardo_pereira from 196.41.127.26 Jun 8 21:10:15 host wordpress(zzzzzzzzz.com.br)[6490]: XML-RPC authentication attempt for unknown user admin from 86.167.111.66 Jun 8 21:11:38 host wordpress(www.zzzzzzzzz.com.br)[1011]: Authentication failure for alexacolemanmkdef from 5.135.164.126 Jun 8 21:11:38 host wordpress(www.zzzzzzzzz.com.br)[6490]: Authentication failure for alexia_dias from 5.135.164.126 Jun 8 21:11:39 host wordpress(www.zzzzzzzzz.com.br)[5620]: Authentication failure for beatriz_seomarketing from 5.135.164.126 Jun 8 21:11:40 host wordpress(www.zzzzzzzzz.com.br)[6489]: Authentication failure for bianca_oblige from 5.135.164.126 Jun 8 21:11:41 host wordpress(www.zzzzzzzzz.com.br)[1010]: Authentication failure for celioedu from 5.135.164.126 Jun 8 21:11:42 host wordpress(www.zzzzzzzzz.com.br)[9893]: Authentication failure for celeste_pinto from 5.135.164.126
Só por estas linhas já dá pra perceber que há uma intensa atividade de tentar conseguir autenticar nas instalações WordPress existentes, praticamente uma por segundo.
Para amenizar essas constantes tentativas de invasão, eu uso há alguns anos a formula de incluir os IPs dessas requisições nos filtros do firewall, bloqueando totalmente o acesso ao servidor que provenham destes. Isso reduz drasticamente essas tentativas. Inicialmente fazia isso manualmente, tratando os logs e adicionando os IPs mais insistentes, mas depois descobri um script que fazia isso automaticamente: O Fail2Ban.
Fail2Ban
O Fail2Ban é um script para um daemon que monitora logs e bane IPs. Com ele é possível analisar logs de qualquer software que possua autenticação como o WordPress e a partir das falhas presentes incluir os IPs de origem em filtros no firewall.
Ele é bem simples de utilizar e está disponível em diversos repositórios para diferentes distribuições Linux.
A seguir mostrarei como fazer uma instalação e uma configuração utilizando CentOS 8 em conjunto com o firewalld
Instalando os recursos necessários
As linhas abaixo instalam todos os itens necessários.
$ sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm $ sudo rpm -ql epel-release $ sudo dnf install firewalld fail2ban -y
A partir deste ponto já deve ter o fail2ban instalado e também o firewalld.
NOTA: Se estiver utilizando o shell a partir de uma conexão SSH, é necessário que adicione a porta da conexão a public zone para que não acabe ativando o firewall e bloqueando o acesso remoto.
Para fazer isso use o comando:
$ sudo systemctl start firewalld && sudo firewall-cmd –zone=public –add-port=22/tcp –permanent && sudo firewall-cmd –zone=public –add-service=https –permanent && sudo firewall-cmd –zone=public –add-service=http –permanent && sudo firewall-cmd –reload
Se tudo estiver certo voce estará com o firewalld ativo neste momento e com as portas 80, 443 e 22 liberadas para a zona publica.
Agora vamos ativar os serviços para que sempre iniciem junto com o sistema.
$ sudo systemctl enable fail2ban $ sudo systemctl enable firewalld
WPFail2Ban
Como estamos falando de WordPress não vou mostrar como configurar o fail2ban para ler os logs do servidor Web e banir os IPs a partir deles. Há um jeito bem mais simples de se fazer isso usando um plugin apropriado. O WPFail2Ban. Basta instalar ele e pronto.
Com o WPFail2Ban instalado e sem alterar nenhuma configuração, ele irá adicionar todas as falhas de tentativa de login ao arquivo syslog padrão do sistema que no caso do CentOS é o /var/log/messages
.
Na minha instalação, eu não utilizei as configurações indicadas no manual do WPFail2Ban, mesmo porque não havia os filters indicados.
A primeira coisa a se fazer é criar um filter para o Fail2Ban. Vamos criar um arquivo de filtro em /etc/fail2ban/filter.d/wordpress.conf
.
As linhas a seguir pressupõe que não há nenhum outro arquivo de configuração para uso com o WordPress. Sou adepto do vim, mas use o editor que preferir.
$ sudo vim /etc/fail2ban/filter.d/wordpress.conf
Adicione as seguintes linhas:
Fail2Ban filter for worpdpress authentication failures
#
[INCLUDES]
before = common.conf
[Definition]
_daemon = wordpress
failregex = ^%(__prefix_line)sAuthentication failure for .* from $
^%(__prefix_line)sBlocked authentication attempt for .* from $
^%(__prefix_line)sXML-RPC authentication attempt for unknown.* from $
^%(__prefix_line)sBlocked user enumeration attempt from $
^%(__prefix_line)sPingback requested from $
ignoreregex =
# DEV Notes:
#
# Author: Marcos Regis
Não vou entrar em detalhes das linhas, apenas que estão preparadas para capturar a maior parte das falhas de autenticação que o mecanismo do WPFail2Ban vai enviar para o arquivo de log.
O próximo passo é definir qual ação será tomada quando o fail2ban encontrar uma entrada que combine com qualquer um dos padrões definidos no arquivo de configuração.
Essas ações estão todas definidas em arquivos de configuração no diretório /etc/fail2ban/action.d/ e para o que este artigo se propõe nos interessa os arquivos firewallcmd*. Em minha experiência, não havia uma configuração que incluía o IP na zona –drop-zone do jeito que eu queria então eu criei um arquivo de ação. Abaixo o conteúdo de um arquivo firewallcmd-drop.conf.
# /etc/fail2ban/action.d/firewallcmd-drop.conf
[INCLUDES]
before = firewallcmd-common.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = firewall-cmd --zone=drop --add-source=<ip>
actionunban = firewall-cmd --zone=drop --remove-source=<ip>
O próximo passo é criar a entrada que ativará o filtro e a ação. Para isso, crie ou edite o arquivo /etc/fail2ban/jail.local e adicione as seguites linhas:
# Filtro para tentativas de login no WordPress [wordpress] enabled = true logpath = /var/log/messages action = firewallcmd-drop
A partir deste ponto está tudo preparado para iniciar o serviço. Assim que o Fail2Ban iniciar e se já houver entradas nos logs que casem com o padrão a ser pesquisado, você verá os IPs sendo adicionados a lista de bloqueio no firewall.
$ sudo systemctl start fail2ban
Para ver os IPs bloqueados no firewall digite firewall-cmd –list-all –zone-drop, você vai ver uma saída parecida com:
drop (active)
target: DROP
icmp-block-inversion: no
interfaces:
sources: 223.225.107.45 111.231.227.35 139.99.156.158 149.202.70.189 162.241.200.235 167.71.111.16 178.254.11.154 18.228.33.11 223.225.10.190 45.119.212.93 62.210.178.229 68.183.134.134 69.163.163.220 80.211.174.81 103.57.84.227 159.65.128.55 91.134.248.230 165.22.107.13 208.97.188.13 188.240.208.26
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
E isso é tudo. Se tiver comentários sobre o conteúdo, sinta-se a vontade. Espero que isso lhe ajude tanto quanto tem me ajudado.
Abraços.