Como proteger o servidor ubuntu de ataques bruteforce ssh?

21

Eu tenho minhas senhas seguras, mas ouvi pessoas reclamando sobre o desempenho de um servidor caindo drasticamente quando um ataque de força bruta está ocorrendo. Como posso proteger meu servidor ubuntu 10.10 de tais ataques? Existe um perfil de aparato para isso? Ou alguma outra maneira de resolver isso?

Dziamid
fonte

Respostas:

19

Existem soluções diferentes. O melhor é usar a autenticação RSA que usa chaves públicas / privadas para autenticar usuários.

Verifique este ótimo manual para abordagens diferentes (autenticação RSA incluída): http://www.la-samhna.de/library/brutessh.html

Estou usando a terceira solução no meu servidor porque não quero complicar para meus usuários não técnicos: usando iptablespara limitar o número de conexões por minuto que torna os ataques bruteforce ineficientes e ineficazes.

Aqui está a solução que estou usando:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

Conforme mencionado aqui : isso permitirá três conexões da porta 22 de qualquer endereço IP fornecido em um período de 60 segundos e exigirá 60 segundos sem tentativas subseqüentes de conexão antes de retomar a permissão de conexões novamente. A opção --rttl também leva em consideração o TTL do datagrama ao combinar pacotes, de modo a tentar mitigar os endereços de origem falsificados.

Conforme declarado no guia mencionado, é melhor usar uma lista branca para separar usuários confiáveis ​​dessas regras:

iptables -N SSH_WHITELIST

adicione hosts confiáveis:

iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT

e depois faça as regras:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Pedram
fonte
Em relação a desativar a autenticação de senha, como faço para entrar em um servidor se perder a chave pública? (Eu não tenho um acesso phisical a um servidor, é uma VPS)
Dziamid
A chave pública pode ser publicada em qualquer lugar que você quiser. Portanto, não se preocupe com isso.
Pedram
Existe uma maneira de configurar o servidor para revelar sua chave pública quando solicitado?
Dziamid
1
Usando ssh, acho que não. Se você possui um servidor da web instalado, como o apache, pode compartilhar a chave usando a web.
Pedram 27/03
8

Recebo ataques ssh de força bruta nos meus servidores com uma taxa de 1 a 2 por dia. Eu instalei denyhosts (pacote ubuntu: denyhosts). É uma ferramenta muito simples, mas eficaz para esse propósito: essencialmente, ele varre seus logs periodicamente para detectar ataques de força bruta e coloca IPs de onde esses ataques se originam no seu arquivo /etc/hosts.deny. Você não os ouvirá novamente e sua carga deverá ser reduzida consideravelmente. É muito configurável através do seu arquivo de configuração /etc/denyhosts.conf para ajustar questões como quantas tentativas erradas constituem um ataque, etc.

Devido ao seu funcionamento transparente, você pode ver facilmente o que está acontecendo (notificação por e-mail: 'aha, outro ataque covarde frustrado!') E desfazer erros devido a seus usuários digitarem suas senhas repetidamente.

Obviamente, tudo o que foi dito anteriormente sobre a mudança para outros métodos de autenticação é válido, mas às vezes seus requisitos discordam dos de seus usuários.

Além disso, a limitação da nova taxa de conexão no iptables pode ser uma opção melhor do que negar o acesso via hosts.deny. Portanto, dê uma olhada no fail2ban também. Mas se você sabe que a força bruta ssh é sua principal preocupação (consulte manualmente /var/log/auth.log para determinar isso), use esta ferramenta muito fácil e de baixo impacto.

DrSAR
fonte
1
Meu /var/log/auth.log vem crescendo consideravelmente ultimamente. Uma entrada como esta Mar 27 10:28:43 smartfood sshd[17017]: Failed password for root from 218.15.136.38 port 33119 ssh2 Mar 27 10:28:47 smartfood sshd[17019]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.15.136.38 user=rootindica um ataque?
Dziamid 27/03
1
Bem, isso significa que alguém no IP 218.15.136.38 tentou fazer login como root. Poderia ter sido você, mas provavelmente não porque usando tools.whois.net/whoisbyip , posso ver que esse IP está registrado na China, o que é bastante diferente de Minsk ;-) Então, sim, isso parece um palpite de sua senha . Moral: desative o login root via ssh (PermitRootLogin no / etc / ssh / sshd_config) porque não há um bom motivo para deixar isso ligado. E então considere denyhosts ou fail2ban. Além disso, verifique se você tem um firewall para permitir acesso apenas essencial através da porta 22 e tudo o que você precisa (mas não mais)
DrSAR
6
  1. Altere a porta sshd para algo fora do padrão
  2. Use knockdpara implementar um sistema de porta batendo
  3. Use iptables ' recente hashlimitcorrespondências para limitar tentativas consecutivas de SSH
  4. Não use senhas, mas use chaves SSH
pepoluan
fonte
3
-1 para o primeiro conselho, complica as coisas para realmente nenhum aumento real de segurança
steabert
Se você usa chaves ssh e desativa a autenticação de senha via ssh, eu realmente preciso de 1,2,3?
Dziamid
4
@steabert ajuda contra crianças de script que tentam abrir caminho pela porta 22. essa é a minha experiência: alguém continua brutalmente forçando um servidor voltado para a Internet quando eu o estava configurando, fazendo o sistema me enviar avisos após avisos. Mudei o porto e os avisos cessaram.
pepoluan 28/03
As teclas @Dziamid ssh impedem que alguém entre no seu sistema. mas não impedi-los de tentar se conectar a porta 22.
pepoluan
3
@Dziamid Não, não está correto. Outros métodos de autenticação (RSAAuthentication, PubkeyAuthentication, #KerberosAuthentication etc) todos continuam a fazer contacto através da porta 22.
DrSAR
3

Antes de tudo, você deve considerar não usar senhas e usar chaves. Não há necessidade de usar uma senha. Se isso funcionar para você, você pode configurar o servidor OpenSSH para não reagir nos logins de senha.

https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html

Usar fail2ban também pode ser uma opção.

https://help.ubuntu.com/community/Fail2ban

ddeimeke
fonte
Como eu me conecto a um servidor se eu perder sua chave pública?
Dziamid 27/03
1
Somente via console ou acesso direto. Tenho certeza de que você não perderá sua chave se conseguir administrar um servidor.
ddeimeke
0

Qual a extensão do servidor exposto na rede? Talvez você possa conversar com o administrador da rede e verificar se é possível monitorar e restringir o acesso da rede ao servidor. Mesmo que os logins da conta sejam seguros, parece que o servidor pode sofrer ataques simples de DoS / DDoS.

bitwelder
fonte
0

Uma alternativa ao fail2ban é o CSF: ConfigServer Security & Firewall .

Ele vem com o LFD: um daemon de falha de logon que pode detectar várias tentativas de logon com falha em vários serviços e bloqueará o endereço IP incorreto (temporária ou permanentemente).

Ele tem outras opções que podem ajudar contra ataques de inundação e possivelmente detectar invasões.

Desvantagens:

  • Você deve usar o CSF ​​como seu firewall para que o LFD faça seu trabalho. Portanto, se você possui um firewall existente, precisará substituí-lo pelo CSF ​​e portar sua configuração.
  • Não está empacotado para o Ubuntu. Você precisará confiar nas atualizações automáticas de configserver.com ou desativar as atualizações automáticas.
  • Ouvi dizer que é bastante popular, portanto, invasores inteligentes provavelmente saberão como desativar a detecção de invasões antes de serem detectados!
joeytwiddle
fonte
0

Você pretende permitir o serviço SSH para o mundo? Ou apenas para membros da equipe em lugares específicos? Minha resposta depende um pouco da gravidade do seu desafio.

Em qualquer um dos casos, uma coisa que você deve fazer é garantir que o servidor SSH não permita logins de senha para o usuário root.

  1. No arquivo / etc / ssh / sshd_config, nunca permita um login raiz, exceto com uma chave SSH.

Nos meus sistemas, eu tenho essa configuração

PermitRootLogin without-password

mas noto que no Ubuntu mais recente eles têm

PermitRootLogin prohibit-password

Se você ler "man sshd_config", acho que significa que essa nova palavra "proibir senha" significa a mesma coisa e certamente tem um significado mais óbvio. Isso NÃO é o padrão em alguns sistemas Linux, mas provavelmente deveria ser.

Agora, sobre o seu problema. O servidor do sistema apenas alguns usuários em locais específicos? Fazem isto!

  1. edite /etc/hosts.deny e insira

    TUDO TUDO

Em seguida, edite o /etc/hosts.allow e liste os números de IP ou um intervalo que deseja permitir o uso do SSH. A notação é um pouco confusa porque, se você deseja permitir que todos os sistemas com números IP como 111.222.65.101 a 111.222.65.255, insira uma entrada como essa em hosts.allow

ALL: 127.0.0.1
sshd: 111.222.65.
sshdfwd-X11: 111.222.65.

Essa é uma solução poderosa e poderosa. Se seus usuários puderem ser enumerados por faixa de IP, faça-o!

Essa solução existia antes da criação de tabelas IP, é (acho) muito mais fácil de administrar, mas não é tão boa quanto uma solução de tabelas IP, porque as rotinas de tabelas IP identificarão inimigos mais cedo do que os programas conduzidos por hosts.allow e hosts .negar. Mas este é um caminho certo, uma maneira simples de resolver muitos problemas, não apenas do SSH.

Observe o problema que você cria para si mesmo. Se você deseja abrir um servidor FTP, servidor Web ou outros enfeites, precisará permitir entradas nos hosts.

Você pode atingir o mesmo objetivo básico, mexendo no iptables e no firewall. Em certo sentido, essa é uma solução preferida porque você está bloqueando os inimigos no limite externo. O Ubuntu tem "ufw" (firewall não complicado) e "man ufw" tem muitos exemplos. Prefiro ter uma boa interface gráfica para percorrer isso, não preciso fazer isso o tempo todo. Talvez outros possam nos dizer se existe um agora.

  1. Outras postagens aqui sugeridas usando chave pública SSH apenas para seus usuários. Isso certamente ajudará, ao preço de complexidade e frustração para seus usuários. Em nosso laboratório, existem 15 computadores. Os usuários vão entre computadores. Exigir autenticação de chave SSH causaria um grande aborrecimento, pois as pessoas passam de um computador para o outro.

Outra fonte de frustração acontecerá quando alguns usuários acumularem chaves ssh diferentes para vários servidores. Como tenho chaves SSH para cerca de 12 projetos diferentes, agora o ssh falha porque tenho muitas chaves públicas (exigindo "ssh -o PubkeyAuthentication = false" ou criação de uma entrada no arquivo .ssh / config. É uma PITA)

  1. Se você deve deixar o servidor aberto para SSH do grande mundo, definitivamente você deve usar uma rotina de rejeição para bloquear locais que frequentemente tentam efetuar login. Existem 2 bons programas para isso, os que usamos são denyhosts e fail2ban . Esses programas têm configurações que permitem banir os infratores pela duração que você desejar.

Nos nossos sistemas Centos Linux, notei que eles abandonaram o pacote denyhosts e apenas oferecem fail2ban. Eu gostei de denyhosts porque criou uma lista de usuários problemáticos / intervalos de IP e, em seguida, no host.deny, essa lista foi anotada. Em vez disso, instalamos o fail2ban e está OK. Meu entendimento é que você prefere bloquear esses usuários ruins na borda externa do servidor; portanto, os bloqueadores baseados em tabelas IP, como fail2ban, são realmente melhores. Denyhosts funciona no nível secundário, depois que os inimigos passam pelo iptables, eles são rejeitados pelo daemon sshd.

Nos dois programas, é um pouco tedioso tirar os usuários da prisão se eles esquecerem sua senha e tentarem fazer login algumas vezes. É um pouco difícil recuperar as pessoas quando cometem erros de login. Você imaginaria que haveria uma GUI de apontar e clicar em que você poderia simplesmente apontar e deixar as pessoas entrarem novamente, mas não é assim. Eu só tenho que fazer isso a cada poucos meses e esquecer o que acontece entre os horários, então escrevi instruções para mim na minha página da web http://pj.freefaculty.org/blog/?p=301

pauljohn32
fonte