Protegendo seu servidor SSH contra ataque brute force (denyhosts)
Mostrei em outro post como proteger seu servidor ssh com o fail2ban. Nesse post irei demonstrar o uso do DenyHosts, que tem a mesma finalidade, para proteger o seu servidor ssh contra ataque de brute force.
Que o SSH é uma ferramenta indispensável para qualquer administrador GNU/Linux e a até Unix/Correlatos não é nenhuma novidade, mas por incrível que pareça quando menciono que qualquer um que tenha o SSH instalado e o mesmo está acessível na internet ele está sujeito a tentativas de acessos não autorizados cometidos por pessoas mau intencionadas que fazem uso de diversos scripts/programas criados especificamente para esse propósito.
O DenyHosts permite o monitoramento do serviço SSH e pode bloquear tentativas consecutivas de acesso a usuários existentes ou não em seu servidor.
Primeiramente vamos instalar o DenyHosts:
# apt-get install denyhosts
Vamos a configuração e algumas explicações de alguns parâmetros
# vi /etc/denyhosts.conf
# Arquivo de log de autenticação
SECURE_LOG = /var/log/auth.log
# O denyhosts vem configurado para utilizar tcp_wrappers
HOSTS_DENY = /etc/hosts.deny
# Por quanto tempo as entradas no arquivo hosts.deny serão mantidas, ajuste as suas necessidades.
PURGE_DENY = 1d
# Qual o serviço será monitorado, para todos use ALL
BLOCK_SERVICE = sshd
# Bloqueia o host após a quantidade especificada de falhas de login de usuários inválidos.
DENY_THRESHOLD_INVALID = 3
# Bloqueia host após falhas de login para usuários válidos
DENY_THRESHOLD_VALID = 5
# Bloqueia qualquer tentativa de login do usuário root
DENY_THRESHOLD_ROOT = 1
# Igual a opção acima mas para nomes de usuários listados em WORK_DIR/restricted-usernames
DENY_THRESHOLD_RESTRICTED = 1
# Diretório onde o denyhost escreve seus dados
WORK_DIR = /var/lib/denyhosts
# Tenta obter um nome associado ao endereço IP
HOSTNAME_LOOKUP=YES
# Email do administrador
ADMIN_EMAIL = seunome@seudominio
# Host e porta do servidor SMTP
SMTP_HOST = localhost
SMTP_PORT = 25
# Quem esta enviando o email
SMTP_FROM = DenyHosts <nobody@localhost>
# Desbloqueio de usuários válidos que tenham apenas errado na digitação
AGE_RESET_VALID=1d
# O mesmo só que aplicado ao usuário root
AGE_RESET_ROOT=25d
# O mesmo para usuário restrito
AGE_RESET_RESTRICTED=25d
# Para usuários inválidos
AGE_RESET_INVALID=10d
# Onde irá armazenar o log
DAEMON_LOG = /var/log/denyhosts
—–
Após as modificações vamos reiniciar o denyhosts
# /etc/init.d/denyhosts restart
Na imagem abaixo tenho uma pequena amostra de todos os hosts bloqueados pelo denyhosts
Uma boa pedida também é configurar o seu servidor SSH para não permitir login do usuário root (PermitRootLogin no) e também a troca da porta de acesso (Port 6702).
Espero que tenham gostado do post e não deixem de assinar o nosso portal.
Ricardo muito Bom.
Gostaria de saber se existe a possiblidade de criar artigos relacionados a monitoramento do servidor
Especificamente com o zabbix.
Valeu
Jonas,
Temos a intenção de montar um post sobre zabbix sim, mas eu também escrevi um post sobre o munin.
Abraços
Muito bom, já está funcionando 100%.
Agora acho que estou mais seguro, rsrsrsrs
Ricardo,
Tenho certeza que esta melhor do que antes. 🙂
Abraços
Boa Noite !
Primeiramente quero parabeniza-lo pelo ótimo tutorial, e tbm gostaria de saber se posso usar esta ferramenta para proteger outros serviços como FTP, SMTP, MYSQL ? se a resposta for positiva, gostaria de saber como ficaria as configurações.
Jorge,
Obrigado pelo elogio. Quanto aos serviços cobertos pelo DenyHosts na teoria ele protege qualquer serviço que utilize tcpwrappers, mas eu nunca o utilizei para proteger outro serviço que não seja o SSH.
Abraços
Acho uma boa pedida posts de monitoramento com o zabbix, vejo pouco material em português!! E em forma de vídeo seria mas interessante, parebéns pelos posts Ricardo. Ansioso já pelo post de zabbix. 🙂 Abs
Jader,
Logo teremos posts sobre Nagios e Zabbix.
Abraços
Só para constar, uma alternativa mais simples. As seguintes linha de comando devem ser executada uma a uma no shell (nesta ordem) ou colocadas em um script:
#Substituir “eth3″ pela placa de rede utilizada para SSH;
#”–seconds 600″ refere-se ao tempo que o IP ficará bloqueado;
#”–hitcount 8″ refere-se ao número de tentativas até o IP ser bloqueado.
iptables -I INPUT -p tcp –dport 22 -i eth3 -m state –state NEW -m recent –set
iptables -I INPUT -p tcp –dport 22 -i eth3 -m state –state NEW -m recent –update –seconds 600 –hitcount 8 -j DROP
Carlos,
Ótima dica, mas eu não queria, por enquanto, entrar em posts envolvendo o iptables diretamente. Dica rápida e objetiva, e agradeço por compartilhar.
Abraços
Ricardo veja se pode me ajudar, existe um ip que esta atacando diretamente o meu server com bruteforce no pop3… ja derrubei o serviço (nao uso muito pop neste server) e ja fiz as regras iptables corretamente, porem as tentativas estao tornando meu server instavel e impossibilitando o acesso das paginas e ate o ssh esta lento… enfim esta drenando minha banda como DDos.. alguma dica do que posso fazer?
Jones,
Essa dica que vou te passar surgiu nos comentários de um de meus posts e vou te passar:
(Carlos Jacon)
As seguintes linha de comando devem ser executada uma a uma no shell (nesta ordem) ou colocadas em um script:
#Substituir “ethx″ pela placa de rede utilizada pelo serviço;
#”–seconds 600″ refere-se ao tempo que o IP ficará bloqueado;
#”–hitcount 8″ refere-se ao número de tentativas até o IP ser bloqueado.
iptables -I INPUT -p tcp –dport PORTA -i ethx -m state –state NEW -m recent –set
iptables -I INPUT -p tcp –dport PORTA -i ethx -m state –state NEW -m recent –update –seconds 600 –hitcount 8 -j DROP
Abraços
Muito bom Ricardo, valeu pela resposta.
Uma coisa que esta me atrapalhando aki é que foram espalhados emails com conteudo malicioso apontando para meus sites, para arquivos que de fato nao existem. Estou recebendo diariamente muitas requisicoes destes arquivos e retornado 404 para todos. Porem gostaria de saber se tem alguma maneira de eu barrar essas requisicoes sem nem mesmo perder banda respondendo com 404, teria que ser uma aplicacao que trata layer 7?
Eu pensei em fazer um script para adicionar uma regra para dar DROP em todos os ips que tentam acessar tais arquivos e como a maioria sao ips dinamicos, limpar a tabela toda madrugada, mantendo as regras padrao do server…
O que acha? Alguma outra dica?
abraçao
Jones,
Não conheço nenhuma aplicação que trate isso, seria interessante utilizar o módulo string do iptables para negar qualquer tentativa de acesso aos arquivos.
Abraços