Protegendo o servidor SSH contra bruteforcing

14

Eu tenho um pequeno servidor SVN, o velho dell optiplex executando o debian. Eu não tenho demandas tão altas no meu servidor, porque é apenas um pequeno servidor SVN ... mas quero que ele seja seguro.

Acabei de renovar meu servidor para um optiplex mais novo e melhor e comecei a procurar um pouco no servidor antigo. Tirei depois de ter problemas. Quando verifico os logs, está cheio de tentativas de força bruta e, de alguma forma, alguém conseguiu entrar na minha máquina. Essa pessoa criou um volume extra chamado "knarkgosse" com dois diretórios "root" e "swap1" ou algo assim. Realmente não sei por que e o que eles fazem, mas com certeza querem impedir que isso aconteça novamente. Acho isso um pouco estranho, porque eu mudo minha senha alguns meses mais ou menos, e as senhas são sempre letras e números aleatórios reunidos ... não é fácil a força bruta.

Sei que posso impedir que o root efetue login e usar sudoers ... e alterar a porta SSH, mas o que mais posso fazer?

Então, eu tenho algumas perguntas:

  1. Como impedir o login por 5 minutos após a quantidade X de tentativas incorretas. Ou tentativas lentas para baixo após cada tentativa incorreta?

  2. Existe algum tipo de lista negra central à qual um servidor pode se conectar? Uma lista negra que monitora os endereços IP "inseguros" e nunca deve ter acesso concedido?

  3. O que mais posso fazer para aplicar segurança ao meu servidor?

Como eu disse anteriormente, estou executando o Debian 5 com Apache (problema do usuário dos dados www?), Svn, mysql, php, phpmyadmin, hudson. Está em uma rede doméstica com encaminhamento de porta 80, 443, 8080, 8180, 23 e 22.

Paul Peelen
fonte
Consulte também Prevenção de ataques de força bruta contra ssh?
Cristian Ciupitu

Respostas:

17

Fail2ban e Port Knocking devem atender à maioria das suas necessidades.

Também é recomendável alterar a porta SSH e permitir apenas a autenticação baseada em chave.

Pode-se argumentar que você pode atingir um ponto de retorno decrescente ao adicionar medidas de segurança adicionais, mas, novamente, cabe a você decidir quando está "suficientemente seguro".

Também é uma boa idéia proibir o login root.

gWaldo
fonte
2
Eu uso denyhosts, mas é praticamente o mesmo que fail2ban afaik.
Pfyon
Fail2Ban parece familiar ... Vou dar uma olhada nisso.
Paul Peelen
1
+1 Fail2Ban, 5 tentativas com falha = bloco IP de 5 minutos. A menos que você tenha uma senha ridiculamente fácil, ela nunca será aplicada a uma senha por minuto.
Chris S
@ Chris S Sim, esse é um dos meus favoritos. Script Kiddies geralmente não sabem como lidar com tempos de espera ...
gWaldo
1
@gWaldo, o viés de confirmação ajuda bastante a reescrever as coisas que você lê para dizer o que você já pensa ser verdade.
Chris S
7

Não há substituto para senhas seguras E autenticação de chave. Dito isto, o Fail2Ban é uma ótima ferramenta para banir IPs de usuários que tentam se autenticar muitas vezes. Também está disponível como um pacote pré-construído para a maioria das distribuições. Esteja avisado de que você pode ser banido acidentalmente, portanto, tenha também um IP listado em recuperação ou um acesso fácil ao console ...

O Fail2Ban tem vários bons exemplos de como configurar tudo o que você pediu ... no entanto, não possui um repositório universal de endereços incorretos. Eu não acho que exista tal repositório em qualquer lugar devido à facilidade de obter outro IP (dhcp renew / ataques bot-net / etc ...). Eu também desativaria o logon via ssh usando nomes de usuário comuns do tipo 'administrador' (root / admin / administrator / sysop / etc ..), pois esses são os mais comuns.

TheCompWiz
fonte
Ótima resposta. Concordo totalmente com você em negrito ... portanto, a letra combinada com senhas numéricas. A autenticação de chave é um pouco demais para este servidor ... mas é uma boa idéia. Agora instalei o Fail2ban, não parece que eu precise reconfigurá-lo e, como esse pequeno servidor svn está em casa, tenho acesso fácil a ele (considerando que ele está na parte de trás do meu closet = S) Thnx pelo seu conselho!
Paul Peelen
1
Spamhaus publica uma lista de redes conhecidas de spammer. Ele não cobre botnets, é apenas conhecido como spammers "profissionais": spamhaus.org/drop
Chris S
4

Há várias boas sugestões oferecidas aqui. Eu respeitosamente sugiro que três coisas tornem isso relativamente seguro:

  1. Execute o sshd em uma porta alta aleatória. Os bots normalmente só seguem a porta 22 e as variações na porta 22, como 2222.
  2. Desabilite a autenticação baseada em senha na configuração do sshd:

UsePAM não

  1. Autentique somente neste site por meio de pares de chaves SSH pré-compartilhados. Man on ssh-keygen para começar a autenticação baseada em PKI.

Espero que isto ajude.

Patrick Heckenlively
fonte
2
Para uma solução de estresse muito baixo, eu definitivamente executo o ssh em uma porta não padrão. Pelo que vi, isso reduzirá as tentativas de conexão de força bruta ao servidor ssh por uma ordem de magnitude. Durante um período de uma semana, um dos meus servidores (executando o ssh em uma porta padrão) recebeu 134 tentativas de conexão inválidas. No mesmo período, uma instância virtual no mesmo servidor (executando ssh em uma porta não padrão) teve 0.
DF
1

Eu sempre fui um grande fã do CSF / LFD, que pode bloquear endereços IP de pessoas que tentam bruteforce, portscan e algumas outras opções. É basicamente um enorme invólucro perl para tabelas IP, mas o arquivo de configuração não é difícil de ler e a documentação não é ruim.

Doce
fonte
Você sabe se existe alguma maneira de ser alertado (por exemplo, por e-mail) sempre que uma varredura de porta é realizada no servidor?
Paul Peelen
1

Você também pode olhar para o sshguard. Eu não o usei, mas ouvi coisas boas.

Fontes:
http://isc.sans.edu/diary.html?storyid=9370

http://www.sshguard.net/

http://www.sshguard.net/docs/faqs/

"O Sshguard monitora os servidores de suas atividades de registro. Quando os registros mostram que alguém está fazendo algo ruim, o sshguard reage bloqueando-o um pouco. O Sshguard tem uma personalidade sensível: quando um perverso insiste em incomodar seu host, ele reage mais e mais firme ".

caleban
fonte
Parece legal ... vou dar uma olhada. thnx
Paul Peelen
1

Eu tenho um servidor SSH conectado à Internet na porta padrão e nunca tive problemas.

  • tcp_wrappers (ou seja, hosts.allow hosts.deny) para SSH .. Eu não acho que exista um SSH por aí que não tenha suporte compilado
  • iptables isso em conjunto com tcp_wrappers eliminou cerca de 99% das minhas tentativas aleatórias de varredura de portas / bruteforce .. o único problema é que você precisa saber de onde estará se conectando para permitir esses intervalos de IP / IP ... Simplesmente fiz uma pesquisa em provedores populares da minha região para ver seus intervalos de IP e permitir esses ... a maioria das varreduras parece vir de terras distantes :)
  • PermitRootLogin sem senha (ou seja, apenas pares de chaves RSA / DSA que são criptografados com uma frase secreta) funciona maravilhosamente para tarefas automatizadas. Quando faço login para interagir, obviamente uso minha conta (regular), configurada com acesso sudo
  • sudoers
  • atualizações constantes. Eu atualizo esta caixa frequentemente com todas as atualizações críticas / de segurança
  • alterações de senha / senha
  • execute o chkrootkit de vez em quando para ver se tenho algum problema .. (existem vários por aí que executam essa função)

espero que ajude!


fonte
1

Existe uma maneira melhor de fazer isso, usando fail2ban significa que você precisa adicionar um aplicativo e ele opera na camada de aplicativo.

Se você usa o iptables, é mais eficiente, pois opera na camada de rede e não é necessário instalar um aplicativo extra.

Use o módulo recente do iptables http://www.snowman.net/projects/ipt_recent/

iptables -N SSHSCAN
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSHSCAN
iptables -A SSHSCAN -m recent --set --name SSH
iptables -A SSHSCAN -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-level info --log-prefix "SSH SCAN blocked: "
iptables -A SSHSCAN -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
iptables -A SSHSCAN -j ACCEPT
Melhor cachorro
fonte
0

Uma opção (a ser usada além de outras medidas de segurança) é ter o sshd listen em uma porta que não seja 22. Eu não tentei isso sozinho, mas ouvi dizer que reduz o número de ataques de força bruta por bots.

Devo enfatizar que isso não é uma segurança real, apenas reduz o número de ataques automatizados de força bruta. Muito trabalho para verificar todas as portas, eu acho.

pfyon
fonte
Eu fiz isso também, mudei para a porta 23. Principalmente porque eu tinha outro servidor na porta 22 (que eu desativei agora).
Paul Peelen
2
23 é uma porta reservada para telnetembora. Geralmente é uma idéia melhor usar portas que não são reservadas, como> 60k. iana.org/assignments/port-numbers fornece uma lista de números de porta reservados.
achou
Obrigado pela dica. Ainda não uso o princípio nesta máquina, mas alterarei a porta. Eu tenho um intervalo de portas entre 52000 - 59000 que uso nos meus servidores profissionais, pensando em usar o mesmo para este.
Paul Peelen
1
@ Paul: I don't use te[l]net on this machine- mantenha assim. Embora você queira um cliente de telnet por vários motivos, não há motivo para executar um servidor de telnet quando o ssh estiver disponível. Senhas de texto sem formatação por cabo são ruins .
MLP
0

Algo que não é mencionado aqui e realmente deveria estar limitando o acesso via firewall. Isso não se adequa a todas as situações, mas se você estiver se conectando ao host de um local consistente com um IP estático, poderá bloquear completamente o SSH, exceto esse IP. Isso garantirá que os invasores não possam entrar. Como eu mencionei, isso nem sempre é adequado a todas as situações, especialmente se o seu IP for dinâmico e mudar com frequência.

vmfarms
fonte
Em geral, concordo com a sua solução. Acredito que esse seja o padrão na empresa em que trabalho ... mas não acho que isso seja algo para mim. O problema é que eu uso principalmente o meu macbook pro em casa (rede local), no trabalho (IP estático) ou em movimento (usando o modem 3G / iPhone). No último, é um problema se eu não tiver uma VPN que seja um exagero demais, eu acho. Obrigado pela sua resposta.
Paul Peelen
0

DenyHosts, http://denyhosts.sourceforge.net/ , é um bom projeto com o qual tive sorte. Se você definir denyhosts para sincronizar, ele fará o download de novos IPs para adicionar a uma lista de proibições que tiveram que forçar outros sistemas a usar denyhosts. Ele também expira IPs que não tentam usar força bruta por um tempo.

Usar a autenticação de chave pública e desativar o log de senhas é provavelmente a melhor coisa que você pode fazer. Derrota qualquer ataque de força bruta.

John Lowry
fonte
0

O que tem sido eficaz para mim:

  1. Como já foi dito, sem login raiz, PasswordAuthentication definido como no (somente login com chaves) em sshd_config

  2. Somente um ou dois usuários têm permissão para efetuar login via ssh e eles têm nomes quase obscuros que não estão nas listas de nomes de usuário comuns das ferramentas de força bruta (por exemplo, não "admin" ou "apache" ou "web" ou " johnny ")

  3. Regras de firewall restritivas (basicamente, tudo está bloqueado, exceto minha porta de serviço e ssh). Eu até restringi o ping para afastar as verificações mais grosseiras (para grande desgosto do meu parceiro).

  4. No meu host, restrinja o acesso a alguns endereços IP específicos - mas isso parece que não é uma opção para você. Certamente não posso fazer isso sozinho em todos os nossos anfitriões. Você também pode procurar em "porta batendo".

  5. E o meu favorito: o módulo de resposta ativa da OSSEC para bloquear várias condições de força bruta e alertas sobre outros erros também. Ele detecta x logins inválidos em y quantidade de tempo e depois bloqueia (por meio de um comando iptables firewall-drop) por um determinado período de tempo. Estou bloqueando por cerca de 12 horas agora por diversão. :)

Uma coisa que faço aqui para garantir que não bloqueie muito a coisa errada é que no /etc/ossec.conf, defino a resposta ativa para um nível alto (que não existe na configuração padrão) e depois percorra o sshd_rules.xml e defina as regras que quero bloquear para esse nível e modifique os limites para o bloco vs. o alerta, conforme necessário.

Se você estiver executando o Apache, também poderá bloquear coisas que violem as regras do apache. Eu não bloqueio isso apenas por causa do problema da NAT, quero pensar em bloquear uma universidade inteira ou algo assim. :) Além disso, você pode escrever regras personalizadas para bloquear em determinadas condições nos arquivos de log, o que pode ser realmente útil.

jen_h
fonte