Bloqueio de repetidas tentativas de login ao seu Linux
Esse artigo mostra como implementar um sistema de segurança para bloqueio de ataques brute-force em seu servidor SSH. Ao mesmo tempo também mostra como criar um esquema para permitir acesso remoto (para manutenção) a partir de qualquer IP da internet.
Parte 2: Bloqueio de repetidas tentativas por regras de iptables
Não é fácil acordar logo cedo na sua casa e ver que enquanto o seu ADSL
ficava baixando músicas, alguém sem ter muita coisa o que fazer entupia os
seus logs com linhas como essa:
Oct 7 13:31:36 titan sshd[2222]: Illegal user frank from ::ffff:212.50.31.6
Oct 7 13:31:39 titan sshd[2224]: Illegal user dan from ::ffff:212.50.31.6
Oct 7 13:31:41 titan sshd[2226]: Illegal user james from ::ffff:212.50.31.6
Oct 7 13:31:46 titan sshd[2230]: Illegal user radiomail
from ::ffff:212.50.31.6
Oct 7 13:31:49 titan sshd[2232]: Illegal user harrypotter
from ::ffff:212.50.31.6
Oct 7 13:31:51 titan sshd[2234]: Illegal user divine from ::ffff:212.50.31.6
Oct 7 13:31:54 titan sshd[2236]: Illegal user popa3d from ::ffff:212.50.31.6
Oct 7 13:31:57 titan sshd[2238]: Illegal user aptproxy
from ::ffff:212.50.31.6
Oct 7 13:31:59 titan sshd[2240]: Illegal user desktop from ::ffff:212.50.31.6
Oct 7 13:32:02 titan sshd[2242]: Illegal user workshop
from ::ffff:212.50.31.6
Oct 7 13:32:04 titan sshd[2244]: Illegal user mailnull from ::ffff:212.50.31.6
Oct 7 13:32:08 titan sshd[2246]: Illegal user nfsnobody
from ::ffff:212.50.31.6
Oct 7 13:32:11 titan sshd[2248]: Illegal user rpcuser from ::ffff:212.50.31.6
Oct 7 13:32:13 titan sshd[2250]: Illegal user rpc from ::ffff:212.50.31.6
Oct 7 13:32:16 titan sshd[2252]: Illegal user gopher from ::ffff:212.50.31.6
Caso percebam, existe uma coisa interessante nessas linhas de log. Foram 15 tentativas de acesso ao daemon sshd em cerca de aproximadamente 30 segundos. Ou seja, quase 1 a cada 2 segundos.
Uma solução por mim encontrada em uma lista de discussão (1) nos EUA foi a seguinte:
Oct 7 13:31:36 titan sshd[2222]: Illegal user frank from ::ffff:212.50.31.6
Oct 7 13:31:39 titan sshd[2224]: Illegal user dan from ::ffff:212.50.31.6
Oct 7 13:31:41 titan sshd[2226]: Illegal user james from ::ffff:212.50.31.6
Oct 7 13:31:46 titan sshd[2230]: Illegal user radiomail
from ::ffff:212.50.31.6
Oct 7 13:31:49 titan sshd[2232]: Illegal user harrypotter
from ::ffff:212.50.31.6
Oct 7 13:31:51 titan sshd[2234]: Illegal user divine from ::ffff:212.50.31.6
Oct 7 13:31:54 titan sshd[2236]: Illegal user popa3d from ::ffff:212.50.31.6
Oct 7 13:31:57 titan sshd[2238]: Illegal user aptproxy
from ::ffff:212.50.31.6
Oct 7 13:31:59 titan sshd[2240]: Illegal user desktop from ::ffff:212.50.31.6
Oct 7 13:32:02 titan sshd[2242]: Illegal user workshop
from ::ffff:212.50.31.6
Oct 7 13:32:04 titan sshd[2244]: Illegal user mailnull from ::ffff:212.50.31.6
Oct 7 13:32:08 titan sshd[2246]: Illegal user nfsnobody
from ::ffff:212.50.31.6
Oct 7 13:32:11 titan sshd[2248]: Illegal user rpcuser from ::ffff:212.50.31.6
Oct 7 13:32:13 titan sshd[2250]: Illegal user rpc from ::ffff:212.50.31.6
Oct 7 13:32:16 titan sshd[2252]: Illegal user gopher from ::ffff:212.50.31.6
Caso percebam, existe uma coisa interessante nessas linhas de log. Foram 15 tentativas de acesso ao daemon sshd em cerca de aproximadamente 30 segundos. Ou seja, quase 1 a cada 2 segundos.
Uma solução por mim encontrada em uma lista de discussão (1) nos EUA foi a seguinte:
# Create a reject-and-log-SSH-Bruteforce chain to forward things to.
iptables -N REJECT-SSH
iptables -A REJECT-SSH -j DROP
-m recent --rcheck --name SSH --seconds 60 --hitcount 10
iptables -A REJECT-SSH -j LOG --log-prefix SSH-Bruteforce:
iptables -A REJECT-SSH -j REJECT -p tcp --reject-with tcp-reset
iptables -A REJECT-SSH -j REJECT
# Kill SSH brute-force attacks. Allow only three connections per minute
# from any source.
iptables -A INPUT -p tcp --dport 22 -m state --state NEW
-m recent --update --name SSH --seconds 60 --hitcount 4
-j REJECT-SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW
-m recent --set --name SSH
iptables -N REJECT-SSH
iptables -A REJECT-SSH -j DROP
-m recent --rcheck --name SSH --seconds 60 --hitcount 10
iptables -A REJECT-SSH -j LOG --log-prefix SSH-Bruteforce:
iptables -A REJECT-SSH -j REJECT -p tcp --reject-with tcp-reset
iptables -A REJECT-SSH -j REJECT
# Kill SSH brute-force attacks. Allow only three connections per minute
# from any source.
iptables -A INPUT -p tcp --dport 22 -m state --state NEW
-m recent --update --name SSH --seconds 60 --hitcount 4
-j REJECT-SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW
-m recent --set --name SSH
Traduzindo a página de explicação para quem não tem a mínima noção de inglês:
"Esta é uma solução parcial para ataques remotos de dicionário usando iptables no Linux. Ela funciona baseada no fato de ataques de dicionário criarem conexões repetidamente em um pequeno espaço de tempo, enquanto usuários típicos e legítimos somente se conectam poucas vezes no mesmo espaço de tempo.
Esta regra assume que o seu kernel seja compilado com CONFIG_IP_NF_MATCH_RECENT.
Você pode ajustar este script de acordo com suas necessidades. Como escrito acima, as três primeiras conexões em um período de 60 segundos serão bem sucedidas e a quarta irá falhar com mensagem de "Connection reset by peer." Se o atacante persistir, os seus pacotes serão ignorados sem nenhuma mensagem, a partir da décima tentativa.
Se acontecer de um usuário válido tentar se conectar várias vezes e começar a receber "drops", tudo o que ele tem que fazer é esperar um minuto ou dois e ele estará apto a tentar se conectar novamente. Os usuários que tentarem se conectar repetidamente continuarão sendo "dropados' indeterminadamente".
Agradecimentos ao usuário FuzzyFox pela contribuição para a comunidade. Se ele não morasse tão longe, convidava ele pra tomar uma cerva por minha conta.
(1)http://forums.vandyke.com/...highlight=hosts.deny
Eu gostaria de citar outros dois softwares que utilizo para bloquear IP´s de atacantes em meu servidor:
APF Firewall
http://www.rfxnetworks.com/apf.php
Descrição: Firewall baseado em IPTables de fácil configuração e muito eficiente. A configuração é feita através de um .conf simples onde são informadas as portas a serem liberadas/bloqueadas, além de outras funcionalidades tanto para portas tcp como udp, além de bloquear ataques via ICMP (Denial of Service por exemplo) pois possui embutido um "anti-DOS". Utiliza a lista negras de IP´s que é atualizada frequentemente através do site www.dshiel.org (Distributed Intrusion Detection System), onde constam os IP´s utilizados com maior frequência para fins ilícitos.
-------------------------------------------
BFD - Brute Force Detect
http://www.rfxnetworks.com/bfd.php
Descrição: Em conjunto com o APF Firewall, detecta tentativas de acesso não autorizada a serviços como SSH, Apache, EXIM, FTP, etc. Após 5 tentativas de acesso sem sucesso, o IP de origem é "dropado" no IpTables e o administrador do servidor pode ser avisado por e-mail.
Ambos são desenvolvidos pelo RFX Networks e são free e de uso irrestrito. Não é preciso manjar de IpTables, basta saber quais portais você quer liberar/fechar e eles fazem o trabalho.
É isso ai!
Abraço, Fernando.