Como proteger seu servidor de ataques de força bruta (brutefoce)

Impedir ataques de força bruta em portas de serviços como FTP e SSH pode ser essencial para evitar uma invasão em seu servidor

Servidores Web

Um ataque de força bruta ocorre quando alguém (humano ou robô) tenta acessar determinado serviço fazendo inúmeras requisições por segundo, tentando as mais diversas combinações de senhas e usuários.

Utilizar uma senha que envolva letras, números e símbolos dificulta muito a invasão, porém não é o suficiente para garantir com segurança a exposição de portas de serviços na web, como por exemplo o protocolo SSH.

Através do protocolo SSH é possível acessar e configurar todo o seu servidor, imagine o estrago que um invasor poderia causar se obtivesse acesso a seu login e senha nesta porta.

Lista de tentativas de bruteforce em apenas 2 horas no site Tec Dicas
Lista de tentativas de bruteforce em apenas 2 horas no site Tec Dicas

Engana-se quem acredita que nunca sofreu um bruteforce. Mesmo sem expor diretamente o IP deste servidor na internet, recebemos inúmeras tentativas de todos os dias, a maioria partindo da China e Russia. Estes computadores são destinados a sequestrar servidores e utiliza-los sem que o administrador perceba. Os fins são diversos, como ataques flood, espalhar vírus ou espionagem.

Para saber se alguém está tentando lhe fazer um bruteforce, acesse seu servidor e digite o seguinte comando (pressione q para sair)

grep sshd.\*Failed /var/log/auth.log | less

Se alguém já tentou, provavelmente uma grande lista irá aparecer. Agora imagine que esses servidores estão todos os dias, a meses tentando invadir seu servidor. Acredite ou não mas um dia eles irão conseguir,  então qual seria a forma ideal de se proteger?

Bloqueio de IP por tentativas falhas

O Fail2ban (Fail to Ban) é um software que monitora todas as tentativas falhas de login em um servidor, e realiza o bloqueio assim que determinado número de erros forem alcançados por um IP.

Em outras palavras, se alguém errar o login durante determinado número de tentativas, o servidor irá rejeitar automaticamente qualquer conexão daquele IP, liberando somente depois de um tempo determinado.

A liberação ocorre pois é possível que um usuário também erre sua senha várias vezes a ponto de se bloquear pra fora.

Bloquear o IP pode ser burlado apenas obtendo um novo endereço, porém isso já quebra o conceito de um ataque bruteforce, pois as tentativas estarão limitadas e o usuário perderá tempo trocando seu endereço, além de que no caso do IPv4 a disponibilidade é um problema sério.

Requisitos para a instalação

  • Sistemas operacionais baseados em GNU/Linux Debian (Ubuntu e derivados)
  • Possuir acesso ao superusuário.
  • Ter atenção para não se trancar para fora do servidor

Para instalar o Fail2ban, utilize o seguinte comando.

apt-get install fail2ban

Para que o Fail2ban funcione corretamente é necessário configurar suas regras, para isso execute os seguintes comandos.

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.local

Leia atentamente os comentários do arquivo (em inglês), e faça algumas alterações de acordo com seus serviços utilizados. 

Sugestões para alterar.

# Não copie e cole este código
# Localize os itens em seu arquivo de configuração e modifique-os manualmente

# BANTIME
# Este é o tempo que um host fica banido
# Altere o bantime para 86400 (exatamente 24 horas)

bantime = 86400

# FINDTIME
# Altere para 3600, é o intervalo tempo que o Fail2ban irá utilizar para 
# monitorar as tentativas que falharam
findtime = 3600

# MAXRETRY
# Altere para 10, é o número de tentativas que o usuário pode falhar em um período de 1 hora
maxretry = 10

Em seguida localize as sessões ssh, ssh-ddos e proftpd e coloque true em "enabled" de cada uma delas. Caso utilize mais serviço, basta adaptar para suas necessidades.

Arquivo de configurações do Fail2ban
Arquivo de configurações do Fail2ban

Após as modificações, salve o arquivo pressionando Ctrl+X, digitando Y e pressionando ENTER. Reinicie o serviço e o fail2ban já estará funcionando.

service fail2ban restart

Para monitorar os endereços banidos, use o comando.

cat /var/log/fail2ban.log

Lembre-se que caso for banido, terá que esperar 24 horas para voltar ao seu servidor! 

Fechando portas de serviços

Bloquear as portas que não precisam ficar expostas publicamente em seu servidor também é uma boa ideia para reduzir as tentativas de flood e bruteforce. Para isso criaremos um script chamado firewall.sh na pasta do superusuário;

cd /root
touch firewall.sh
chmod a+x firewall.sh

Em seguida iremos editar o arquivo e acrescentar nossas regras.

nano /root/firewall.sh

Copie, adapte e cole as regras abaixo em seu arquivo firewall.sh.

#!/bin/bash
 
# Limpa todas as regras existentes
iptables -F
iptables -X
 
# Aceita todas  as conexões (será filtrado depois)
iptables -P INPUT   ACCEPT
iptables -P OUTPUT  ACCEPT
iptables -P FORWARD ACCEPT
 
# Bloqueia alguns tipos de ataque flood mais simples
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
 
# permite tráfego TCP nas portas 80 e 443 (acrescente outras portas se utilizar)
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
 
# desativa a resposta do comando ping
iptables -A OUTPUT -p icmp -o eth0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -s 0/0 -i eth0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -s 0/0 -i eth0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -s 0/0 -i eth0 -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -i eth0 -j DROP
 
# permite o SSH, FTP e portas passivas 
# as portas passivas foram configuradas em nosso tutorial do servidor ftp
# modifique para corresponder as suas portas caso seja necessário
# lembre-se de acrescentar as portas adicionais que utilizar
iptables -A INPUT -p tcp --dport ssh --jump ACCEPT
iptables -A INPUT -p tcp --dport 20 --jump ACCEPT
iptables -A INPUT -p tcp --dport 21 --jump ACCEPT
iptables -A INPUT -p tcp --dport 60000:60005 --jump ACCEPT
iptables -A INPUT -s 127.0.0.1/32 --jump ACCEPT
 
# nega qualquer conexão que não esteja na regra
# TENHA CERTEZA QUE NÃO SE ESQUECEU DE NADA! 
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -L -n

Salve pressionando Ctrl+X, digite Y e tecle ENTER. Ao executar o script, as regras do iptables serão definidas, portando caso seja bloqueado para fora caso tenha algo errado, entre no seu provedor que disponibiliza o acesso ao VPS e reinicie o servidor. Desta forma as regras serão limpas.

Execute o comando.

/root/firewall.sh

Caso não tenha ficado preso para fora de seu servidor, acrescente essas regras na inicialização do sistema.

nano /etc/rc.local

Adicione a seguinte linha no arquivo, depois dos comentários e antes do exit 0.

Script de execução do Debian
Script de execução do Debian
/root/firewall.sh &

Lembre-se de terminar com &.

Sempre que reiniciar o servidor, estas regras serão executadas, evitando assim que portas fiquem acessíveis na web sem necessidade.

Caso deseje reforçar ainda mais a segurança de seu servidor, leia nossa análise de vulnerabilidades em sistemas web com PHP.

 

Índice: Como criar uma hospedagem VPS completa no Ubuntu ou Debian:

Tutoriais e artigos recomendados


Comentários



Voltar ao topo
Aguarde..