Limitando o número de tentativas de conexão no seu serviço SSH

Se você tem um servidor SSH visível pela Internet então precisa imediatamente definir estas regras no seu firewall antes que algum cracker consiga logar no seu sistema.

Alguns anos atrás eu implantei o meu primeiro servidor Linux com gerenciamento remoto via SSH, visível de fora da minha rede. Passado algum tempo com o serviço no ar eu comecei a notar nos logs /var/log/syslog e /var/log/auth.log que de tempos em tempos surgiam centenas de tentativas de conexão a este serviço em períodos de tempos bem curto o que levava a crer que isso estava sendo feito de forma automatizada com o auxílio de um dicionário de usuários/senhas.

Tal problema era grave, pois se algum usuário definisse uma senha muito fácil e baseada em dicionário com certeza este script acabaria conectando ao meu servidor, e então de um usuário comum para obter privilégios de root seria questão de tempo para um cracker habilidoso.

Após muita procura no Google e nas páginas de manual do iptables e seus módulos encontrei uma solução que se resumiu nas linhas de código que seguem abaixo e que foram adicionadas ao meu script de firewall iptables.

Arquivo de configuração do firewall

Este é um arquivo de configuração mantido a parte por razões óbvias: Desta forma fica mais fácil quando eu precisar alterar parâmetros gerais do script como um todo.

Particularmente eu tenho uma pasta /etc/firewall e dentro dele mantenho os arquivos do firewall e inclusive este de configurações.

#
#Arquivo /etc/firewall/firewall.conf
#
#iptables - o caminho completo para o executável do iptables
iptables="/sbin/iptables"
#
#SSHEXT - pode ser ON / OFF para ativar ou não o acesso ao SSH
SSH_EXT="ON"
#
#IF_EXT -  minha interface ligada a minha DMZ e ao roteador Internet (eth0, por exemplo)
IF_EXT="eth0"
#
#NET_EXT - minha faixa de IPs válidos, a qual uso como DMZ.
NET_EXT="200.X.Y.X/25"
#
#TRIES - Numero de tentativas para bloquear um IP - esta tentativa ja sera bloqueada
TRIES=4
#
#TIME - Tempo em que um endereço bloqueado ficará de "molho" (em segundos, 300=5m).
TIME=300

Arquivo principal do firewall

Este trecho de código está no meu arquivo principal do firewall e deverá ser colado no seu script logo após as definições de variáveis e políticas (se aplicável).

#
# Arquivo: /etc/firewall.sh
#
. /etc/firewall/firewall.conf
#
#
echo -n " - Gerenciamento remoto externo"
if [ "$SSHEXT" == "ON" ]; then
    echo " [ATIVO]"
    $iptables -A INPUT -i $IF_EXT -s $NET_EXT  -d $IP_EXT -p tcp --dport   22 -m state --state NEW -j LOG --log-prefix "[:: SSH da DMZ::]"
    $iptables -A INPUT -i $IF_EXT -s $NET_EXT  -d $IP_EXT -p tcp --dport   22 -j ACCEPT
    #
    $iptables -N INPUT_SSH
    $iptables -A INPUT -i $IF_EXT -d $IP_EXT -p tcp --dport 22 -j INPUT_SSH
    #
    #- Cria e alimenta uma lista com novas conexoes em /proc/net/ipt_recent/ssh_limitado
    #- Loga as conexoes
    #- Autoriza a conexao
    $iptables -A INPUT_SSH -i $IF_EXT -d $IP_EXT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_limitado --set
    $iptables -A INPUT_SSH -i $IF_EXT -d $IP_EXT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_limitado --update --seconds $TIME --hitcount $TRIES -j DROP
    $iptables -A INPUT_SSH -i $IF_EXT -d $IP_EXT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "[:: SSH ABERTO ::] "
    $iptables -A INPUT_SSH -i $IF_EXT -d $IP_EXT -p tcp --dport 22 -j ACCEPT
else
    echo " [DESATIVADO]"
fi

Finalizando

Quanto estas regras forem implementadas no seu sistema melhor, portanto após incluí-las certifique-se executar o script do firewall novamente e testar se está tudo Ok.

Lembre-se ainda que se você quiser mudar o número de tentativas ou o tempo em que determinado IP fica bloqueado é preciso alterar respectivamente as variáveis “TRIES” e/ou “TIME” no arquivo /etc/firewall/firewall.conf.

Tamém que o número de de tentativas informado será a primeira tentativa bloqueada. Ou seja, se você definir TRIES=4 significa dizer que a quarta tentativa será rejeitada pelo iptables – o usuário terá três chances para acertar e errando-as, da quarta em diante não conseguirá mais conectar por “TIME” segundos.

Deixe um comentário

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.