Centenas de logins ssh com falha

81

Toda noite, recebo centenas, às vezes milhares, de logins ssh com falha no meu servidor RedHat 4. Por motivos de firewall de sites remotos, preciso executar na porta padrão. Existe algo que eu deveria estar fazendo para bloquear isso. Percebo que muitos vêm do mesmo endereço IP. Não deveria parar aqueles depois de um tempo?

MattMcKnight
fonte

Respostas:

67

Você pode usar o iptables para limitar a taxa de novas conexões de entrada à porta SSH. Eu precisaria ver toda a configuração do iptables para fornecer uma solução pronta para uso, mas você está basicamente falando sobre adicionar regras como:

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

Essas regras pressupõem que você esteja aceitando conexões ESTABELECIDAS anteriormente na tabela (para que apenas novas conexões atinjam essas regras). Novas conexões SSH atingirão essas regras e serão marcadas. Em 60 segundos, 5 tentativas de um único endereço IP resultarão na queda de novas conexões de entrada desse IP.

Isso funcionou bem para mim.

Edit: Eu prefiro esse método ao "fail2ban" porque nenhum software adicional deve ser instalado e acontece totalmente no modo kernel. Ele não processa a análise de arquivos de log como "fail2ban", mas se o seu problema for apenas com SSH, não usaria algo no modo de usuário que exija instalação de software e que seja mais complexo.

Evan Anderson
fonte
1
Gosto dessa solução e pretendo instalá-la hoje à noite, depois de apagar o fogo de hoje.
MattMcKnight
2
Ele desacelera os ataques e eu o recomendo, mas como existem botnets de varredura distribuídos por aí, não é uma panacéia. Ainda haverá logons inválidos de redes de bots executando varreduras distribuídas contra você. Não há realmente muito que você possa fazer sobre isso, menos do que uma espécie de "porta bater" esquema para trazer remotamente a porta SSH quando você quer entrar.
Evan Anderson
1
+1 para a sugestão de "port knocking" de @ Evan. Algumas informações: linux.die.net/man/1/knockd . Mas não faça isso da maneira que a página de manual (por exemplo, adicionando / excluindo regras do iptables), mas use o -m conditioniptables match.
pepoluan
2
você não precisa --port 22 nessas regras para que sejam aplicadas apenas ao tráfego ssh?
clime
2
@clime - Sim. Difícil de acreditar que isso aconteceu aqui 2 anos e meio e ninguém percebeu! Boa pegada.
Evan Anderson
39

fail2ban pode ajudar com isso, bloqueando endereços IP com muitas tentativas falhas de logon.

Kyle Brandt
fonte
11
Eu não gosto de ferramentas / scripts lendo logs e emitir comandos em nome do usuário sysadmin
asdmin
2
@asdmin, sim, especialmente quando eles têm uma tal historial bom ...
maxschlepzig
25

Eu recomendo o uso de uma porta não padrão para SSH, se puder (por exemplo, porta 10222), mas como você mencionou que não pode fazer isso, recomendo usar algo como DenyHosts.

http://denyhosts.sourceforge.net/

Ótimo pacote, fácil de instalar e configurar.

KPWINC
fonte
6
Não sei por que as pessoas aprovam isso; O SSH está em uma porta padrão 22. Isso significa que, quando você está em uma rede estrangeira, não confia que eles tenham aberto uma porta não padrão por meio do firewall de saída. A solução real para esse problema está documentada acima, restrinja o número de conexões repetidas por meio do firewall de entrada ou desative os logins de senha.
Andrew Taylor
1
O OpenSSH 6.7 descarta o suporte ao tcpwrappers , que é o que denyhosts usa.
Zoredache
15

Embora seja bom poder ssh no seu sistema a partir de locais arbitrários na Internet, existem sistemas automatizados de ataque por senha que travam em uma porta ssh aberta e aplicam vários ataques de conta e dicionário de joe contra o seu sistema. Isso pode ser um pouco difícil de ler no resumo do seu registro noturno e é um desperdício de sua largura de banda.

Se você possui um servidor Web no mesmo sistema, pode usar wrappers php e tcp para restringir o tráfego de entrada ssh a sistemas conhecidos, além de fornecer uma chave de porta traseira para permitir o acesso de sistemas arbitrários na Internet.

Aqui está como você faz isso:

negue todas as conexões ssh em /etc/hosts.deny:

# /etc/hosts.deny fragment
sshd:  all

Permita sistemas conhecidos por IP em /etc/hosts.allow, além de adicionar um arquivo para acesso temporário:

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

Crie um arquivo php no seu servidor web e atribua a ele um nome não óbvio, como my-sshd-access.php:

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

Perdoe o código php - eu o peguei de outro lugar, então provavelmente poderia ser limpo um monte. Tudo o que faz é adicionar o endereço IP do sistema que o acessa ao arquivo /etc/hosts.allow.temporary-sshd-access, que é lido pelo sshd (devido à sua inclusão por /etc/hosts.allow) no momento da conexão .

Agora, quando você estiver em algum sistema arbitrário da Web e quiser fazer o ssh para esse sistema, primeiro use um navegador da Web e clique neste arquivo (ou use wget ou equivalente):

$ wget http://your.system.name/my-sshd-access.php

Agora você deve poder efetuar ssh no seu sistema. Se estiver em algum lugar em que você provavelmente fará uma busca frequente, seria trivial ler o conteúdo do arquivo /etc/hosts.allow.temporary-sshd-access e adicionar permanentemente o endereço IP em / etc / hosts. permitir.

David Mackintosh
fonte
Para tornar isso mais seguro, execute esta página em https.
Robert Munteanu
Se você alterar o script para que ele não produza o conteúdo do arquivo "endereço IP temporário permitido", não haverá nada para um aspirador aspirar. Em seguida, você pode executá-lo em http em vez de https.
Barry Brown
O "endereço IP temporário permitido" é sempre o do solicitante (ou seja, o seu). Eu não acho que isso importe de uma maneira ou de outra. Https significa que o URL solicitado é criptografado, o que significa que não é trivial detectá-lo.
David Mackintosh
Isso não funcionará se você estiver em uma rede que faz proxy de conexões HTTP, mas sua rota direta para a Internet é por meio de uma saída diferente.
Andrew Taylor
O OpenSSH 6.7 descarta o suporte ao tcpwrappers , que é o que está sendo usado em sua resposta.
Zoredache
9

Você também pode querer denyhosts .

FYI: O OpenSSH 6.7 descarta o suporte ao tcpwrappers , o que significa que denyhosts provavelmente não é a solução para novas instalações.

Zoredache
fonte
2

outra solução é apenas mover ssh para outra porta. esses vermes são bem estúpidos.

disserman
fonte
3
O pôster original dizia que ele precisava rodar na porta padrão.
kbyrd
1
desculpe, eu deve ler as perguntas mais cuidado :)
disserman
1
Eu tenho que concordar ... Eu tenho meu SSH rodando em portas "alternativas" e isso faz muita diferença nos logs. Os worms são tão inteligentes quanto um tijolo, portanto funcionam bem contra scripts burros de automação; não tão bem contra atacantes humanos. Ainda assim, os registros têm o som abençoada de silêncio neles ...
Avery Payne
..não é que os robôs são "estúpidos", é que eles foram projetados para procurar frutas baixas. Portanto, mover a porta SSH é no estilo de ... manter suas frutas do chão.
elrobis 27/02
2

Outra opção pode ser exigir que todas as conexões ssh sejam verificadas por um certificado e eliminem completamente as senhas.

Eu uso o Denyhosts, mas descobri que estava apenas conectando-me regularmente remotamente a partir de vários lugares. Por isso, bloqueei todas as conexões da porta 22, exceto de qualquer outro lugar, e uso a porta batendo para que eu possa conectar-me de qualquer lugar com o meu laptop, se necessário. .

Evan
fonte
1

Qualquer solução que envolva o bloqueio automático de IPs após várias falhas apresenta risco de ataques de negação de serviço. Desde que exista uma boa política de senhas para reduzir a eficácia de ataques de força bruta ou de dicionário, eu não me preocuparia muito com eles.

Se você limitar os usuários / grupos apenas àqueles que devem ter permissão para efetuar ssh em primeiro lugar, e desativar o login como root, você deve ser mais do que seguro o suficiente. E, se isso não for suficiente, sempre haverá autenticação baseada em chave.

goldPseudo
fonte
1

Honestamente, se você precisar executar o SSH (e na porta 22), não poderá evitá-los. Se você precisar aceitar senhas, estará em uma situação ainda pior.

Sua melhor aposta é configurar o software de análise de log para excluir os logs SSH. Em seguida, execute uma instância separada para examinar apenas os logs SSH e use o procmail para filtrar as tentativas malsucedidas. Você pode até escrever scripts para observar logons bem-sucedidos de endereços IP com várias tentativas malsucedidas.

Não há como impedir que as pessoas investiguem seu servidor SSH. Denyhosts, fail2ban e o exemplo iptables funcionarão até certo ponto, mas com o risco adicional de bloquear acidentalmente usuários legítimos. O melhor método é absorver e tentar automatizar o processo de análise de log para reduzir a quantidade de tempo que você tem para pensar sobre isso.


fonte
0

Quando você diz que está com falhas nas tentativas de logon shh no seu servidor red hat, que tipo de firewall está instalado e quantas pessoas precisam usá-lo. Sugiro que, se você quiser, limite as tentativas no firewall antes que elas cheguem perto do servidor real.

Se você pode restringir o intervalo de endereços IP que precisam de acesso legítimo, deve poder configurar uma lista de acesso no firewall. Se você pode restringir o tráfego no firewall, sugiro que você analise os sistemas de intrusão de rede, pois parece que seu servidor está sendo alvo de algo.


fonte
0

A maioria dos webhosts usa APF + BFD para bloquear logins SSH com falha de IP. Atualmente, existe o CSF (firewall do Configserver), que inclui uma ferramenta chamada LFD que faz a mesma coisa e muito mais, incluindo IPs de bloco de certos países que você não deseja acessar seu servidor (por exemplo, Coréia, China etc., onde 99% das minhas sondas SSH parecem se originar de).

gbjbaanb
fonte
0

Se você precisar resolver esse problema em mais de um host, consulte o OSSEC: http://www.ossec.net/main/ossec-architecture

Isso permitirá que você configure vários agentes de um local centralizado para responder automaticamente a ataques de força bruta (junto com qualquer outro padrão que você possa extrair dos logs).

Muito bom software :)


fonte