Como proteger um servidor SSH?

128

Que medidas posso / devo tomar para garantir que a segurança no meu servidor SSH seja absolutamente impermeável?

Este será um wiki da comunidade desde o início, então vamos ver o que as pessoas fazem para proteger seus servidores.

LassePoulsen
fonte
44
A impermeabilidade absoluta requer desligar a caixa.
Thorbjørn Ravn Andersen
E se você tiver Wake-on-LAN?
Página
O problema seria a parte da LAN ... Os pacotes Wake-on-LAN não são roteados, portanto, você teria que ter acesso a uma máquina dentro da LAN para enviar o pacote WOL ...
LassePoulsen
Para autenticação de chave, você pode limitar as cifras às cifras realmente necessárias.

Respostas:

108

Use pares de chaves públicas / privadas para autenticação em vez de senhas.

  1. Gere uma chave SSH protegida por senha para todos os computadores que precisam acessar o servidor:

    ssh-keygen

  2. Permitir acesso SSH de chave pública a partir dos computadores permitidos:

    Copie o conteúdo de ~/.ssh/id_rsa.pubcada computador em linhas individuais ~/.ssh/authorized_keysno servidor ou execute ssh-copy-id [server IP address]em todos os computadores aos quais você está concedendo acesso (você precisará digitar a senha do servidor no prompt).

  3. Desative o acesso SSH da senha:

    Abra /etc/ssh/sshd_config, encontre a linha que diz #PasswordAuthentication yese mude para PasswordAuthentication no. Reinicie o daemon do servidor SSH para aplicar a alteração ( sudo service ssh restart).

Agora, a única maneira possível de fazer o SSH no servidor é usar uma chave que corresponda a uma linha ~/.ssh/authorized_keys. Usando este método, eu não me importo com ataques de força bruta, porque mesmo que acho que a minha senha, ela será rejeitada. Forçar brutalmente um par de chaves pública / privada é impossível com a tecnologia atual.

Evan Kroske
fonte
5
-1: geralmente o acesso é concedido a computadores individuais, não a criação de uma chave para cada computador cliente em potencial que se conecta ao servidor. Sua última declaração não está correta, de acordo com sua sugestão e porque você não sugeriu definir uma senha para as chaves privadas que têm acesso / comprometimento de qualquer um dos sistemas clientes, concederia automaticamente acesso ao servidor SSH. A autenticação de chave SSH é recomendada, mas as chaves privadas devem ser protegidas adequadamente e devem ser usadas individualmente, não de maneira distribuída, conforme descrito.
João Pinto
7
"Geralmente, o acesso é concedido a computadores individuais e não a computadores, não é razoável criar uma chave para cada computador cliente em potencial que esteja se conectando ao servidor" Existem várias opções e acho que descrever como transferir com segurança uma chave privada para cada cliente parece estar fora do escopo desta pergunta . Não estou apresentando todas as opções, apenas uma simples que acho que as pessoas podem entender. "... deve ser usado individualmente, não de maneira distribuída, conforme descrito" Isso parece contradizer sua declaração anterior e eu não descrevi nada como distribuído.
Asa Ayers
5
"impossível" talvez esteja exagerando um pouco.
Thorbjørn Ravn Andersen
9
É por isso que digo "impossível". Ninguém tem computadores tão rápidos, tão pequenos, tantos ou tanto tempo. "Imagine um computador do tamanho de um grão de areia que possa testar chaves em relação a alguns dados criptografados. Imagine também que ele possa testar uma chave na quantidade de tempo que leva para atravessá-la. Considere um cluster desses computadores, tantos que se você cobrisse a Terra com eles, eles cobririam o planeta inteiro até a altura de 1 metro. O cluster de computadores quebraria uma chave de 128 bits em média em 1.000 anos ".
Asa Ayers
@ ThorbjørnRavnAndersen "Impossível" não está exagerando, desde que você use uma chave forte. Não consigo encontrar uma cotação no momento, mas com o tamanho atual das chaves, os ataques de força bruta são inviáveis ​​"até que os computadores sejam compostos de algo que não seja matéria e ocupem algo que não seja espaço".
Maximillian Laumeister
72

Eu sugeriria:

  • Usando fail2ban para impedir tentativas de login de força bruta.

  • Desativando o login como root via SSH. Isso significa que um invasor precisou descobrir o nome de usuário e a senha, tornando o ataque mais difícil.

    Adicione PermitRootLogin noao seu /etc/ssh/sshd_config.

  • Limitando os usuários que podem SSH ao servidor. Por grupo ou apenas usuários específicos.

    Adicione AllowGroups group1 group2ou AllowUsers user1 user2limite quem pode SSH ao servidor.

Mark Davidson
fonte
2
Os AllowUsers e AllowGroups não aceita uma vírgula , como um delimitador. Certifique-se de não tentar isso remotamente. Eu continuo sendo bloqueado do meu NAS fazendo isso incorretamente.
Artless noise
4
Sempre verifique se a sua sshdconfiguração está correta antes de reiniciar o sshd, para evitar bloquear-se fora da máquina. Veja este blog para obter detalhes - basta executar sshd -Tapós uma alteração na configuração antes de reiniciar o principal sshd. Além disso, abra uma sessão SSH na máquina ao fazer a alteração na configuração e não feche isso até que você tenha validado a configuração conforme mencionado e talvez tenha feito um teste de login no SSH.
RichVel
24

Outras respostas fornecem segurança, mas há uma coisa que você pode fazer que tornará seus logs mais silenciosos e menos provável que você seja bloqueado da sua conta:

Mova o servidor da porta 22 para outra. No seu gateway ou no servidor.

Isso não aumenta a segurança, mas significa que todos os scanners aleatórios da Internet não irão sobrecarregar os arquivos de log.

Douglas Leeder
fonte
1
Para aqueles que acreditam em segurança pela obscuridade ( en.wikipedia.org/wiki/Security_through_obscurity ), faz muito sentido usar outra porta. Eu não ...
LassePoulsen
32
Não se trata de segurança através da obscuridade (embora a obscuridade possa ter um efeito marginal positivo). Trata-se de reduzir o ruído de fundo de inúmeras tentativas de força bruta. Você não pode auditar utilmente seus logs de falha de acesso se eles estiverem cheios de ataques automatizados; O fail2ban não reduz o volume o suficiente, dado o número de atacantes e a prevalência de ataques distribuídos (botnet) e limitados. Com o ssh em uma porta incomum, você sabe que os ataques que você vê nos logs vêm de um invasor real interessado em sua caixa. Eu recomendo fortemente.
quer
Como você pode consultar serviços da Internet, como o shodan, para servidores ssh voltados para a Web, ou usar o nmap e a captura de banner, a alteração da porta padrão é praticamente inútil. eu desaconselharia isso.
lento Loris
Shodan não pega todas as portas de 65k, portanto, mudar para uma porta alta provavelmente a removerá de suas verificações. Além disso, se você mudar para uma porta alta aleatória, o invasor provavelmente precisará fazer varreduras de 65K TCP (muito barulhento) para encontrar seu serviço e começar a atacá-lo. Ambas são vitórias do ponto de vista de segurança, portanto, mudar para uma porta alta geralmente é um bom plano. Outra é que, ao se mudar para uma porta alta que você pode ter uma idéia melhor que alguém que está atacando você tem como alvo os sistemas especificamente ao invés de apenas fundo geral Internet ruído
Rоry McCune
23

Habilite a autenticação de dois fatores com HOTP ou TOTP . Está disponível a partir das 13h10.

Isso inclui o uso da autenticação de chave pública sobre autenticação de senha, como em outra resposta aqui, mas também exige que o usuário prove que ele possui seu dispositivo de segundo fator além de sua chave privada.

Resumo:

  1. sudo apt-get install libpam-google-authenticator

  2. Peça a cada usuário que execute o google-authenticatorcomando, que gera ~/.google-authenticatore ajuda a configurar seus dois dispositivos de fator (por exemplo, o aplicativo Google Authenticator para Android).

  3. Edite /etc/ssh/sshd_confige defina:

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
  4. Execute sudo service ssh reloadpara pegar suas alterações em /etc/ssh/sshd_config.

  5. Edite /etc/pam.d/sshde substitua a linha:

    @include common-auth
    

    com:

    auth required pam_google_authenticator.so
    

Mais detalhes sobre as diferentes opções de configuração estão no meu blog do ano passado: Melhor autenticação ssh de dois fatores no Ubuntu .

Robie Basak
fonte
21

Faça com que os IPs do cliente do bloco sshd que falharam em fornecer informações de login corretas " DenyHØsts " possam fazer esse trabalho com bastante eficiência. Eu tenho isso instalado em todas as minhas caixas de Linux que são de alguma forma alcançáveis ​​do lado de fora.

Isso garantirá que ataques de força no SSHD não sejam eficazes, mas lembre-se (!) Dessa maneira, você pode acabar se trancando se esquecer sua senha. Isso pode ser um problema em um servidor remoto ao qual você não tem acesso.

LassePoulsen
fonte
2
Existe alguma opção como 10 tentativas de login com falha antes de banir o endereço IP?
sayantankhan
20

Aqui está uma coisa fácil de fazer: instalar o ufw (o "firewall não complicado") e usá-lo para classificar o limite de conexões de entrada.

Em um prompt de comando, digite:

$ sudo ufw limit OpenSSH 

Se o ufw não estiver instalado, faça isso e tente novamente:

$ sudo aptitude install ufw 

Muitos invasores tentarão usar o servidor SSH para senhas de força bruta. Isso permitirá apenas 6 conexões a cada 30 segundos do mesmo endereço IP.

mpontillo
fonte
+1 Usar limite pode ser bom. No entanto, devo salientar que encontrei problemas ao usar o servidor sftp interno, pois limita as conexões para isso também.
Mark-Davidson
2
@ Mark - bom ponto, mas isso não soa como um cliente SFTP mal escrito? Por que eles continuariam se reconectando à porta SSH quando poderiam abrir mais canais SSH?
precisa saber é o seguinte
12

Se eu quiser ter alguma segurança adicional ou precisar acessar servidores SSH dentro de uma rede corporativa, configurei um serviço oculto usando o software de anonimização Tor .

  1. Instale o Tor e configure o próprio servidor SSH.
  2. Verifique se o sshd apenas escuta em localhost.
  3. Aberto /etc/tor/torrc. Conjunto HiddenServiceDir /var/lib/tor/sshe HiddenServicePort 22 127.0.0.1:22.
  4. Olhe para var/lib/tor/ssh/hostname. Existe um nome como d6frsudqtx123vxf.onion. Este é o endereço do serviço oculto.
  5. Abra $HOME/.ssh/confige adicione algumas linhas:

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    

Além disso, preciso do Tor no meu host local. Se estiver instalado, posso entrar ssh myhoste o SSH abre uma conexão via Tor. O servidor SSH do outro lado abre sua porta apenas no host local. Para que ninguém possa conectá-lo via "internet normal".

qbi
fonte
10
Segurança por obscuridade avançada, mas muito interessante.
Johannes
8

Há um artigo de administração Debian sobre este tópico. Abrange a configuração básica do servidor SSH e também as regras de firewall. Isso também pode ser interessante para proteger um servidor SSH.

Veja o artigo: Mantendo o acesso SSH seguro .

Huygens
fonte
3
Tarde demais, mas por favor, ao responder a perguntas, copie as partes importantes de um link para que, se o link se deteriorar, as informações ainda estejam aqui.
umop aplsdn
1
Boa ideia. Embora eu esteja passando por um período com muito menos tempo para participar. Minha resposta é um "wiki da comunidade", portanto, fique à vontade para adicionar as informações do link, se tiver tempo.
Huygens
6

Minha abordagem ao endurecimento SSH é ... complexa. Os itens a seguir estão em termos de como eu faço isso, desde a borda mais extrema da (s) minha (s) rede (s) até os próprios servidores.

  1. Filtragem no nível de borda do tráfego através do IDS / IPS com scanners de serviço e assinaturas conhecidas na lista de bloqueio. Consigo isso com o Snort através do meu firewall de borda (esta é a minha abordagem, um dispositivo pfSense). Às vezes, não posso fazer isso, como nos meus VPS.

  2. Filtragem de firewall / rede da (s) porta (s) SSH. Eu permito explicitamente apenas que determinados sistemas cheguem aos meus servidores SSH. Isso é feito através de um firewall pfSense na borda da minha rede ou dos firewalls de cada servidor que estão sendo configurados explicitamente. Existem casos em que não posso fazer isso (o que quase nunca acontece, exceto em ambientes de laboratório de teste de caneta ou de segurança em que os firewalls não ajudam a testar as coisas).

  3. Em conjunto com o meu pfSense, ou um firewall de borda, NAT - entrando na rede interna e separando da Internet e dos sistemas, acesso apenas a VPN aos servidores . Tenho que VPN em minhas redes para acessar os servidores, porque não há portas voltadas para a Internet. Definitivamente, isso não funciona para todos os meus VPSs, mas em conjunto com o # 2, posso ter um VPS como o 'gateway' por VPNing nesse servidor e depois permitir seus IPs para as outras caixas. Dessa forma, eu sei exatamente o que pode ou não fazer o SSH - minha única caixa que é a VPN. (Ou, na minha rede doméstica por trás do pfSense, minha conexão VPN, e eu sou o único com acesso VPN).

  4. Onde o número 3 não é factível, fail2ban, configurado para bloquear após 4 tentativas com falha e bloquear os IPs por uma hora ou mais, é uma proteção decente contra pessoas que constantemente atacam com força bruta - apenas bloqueie-as no firewall automaticamente com fail2ban e meh. Configurar fail2ban é uma dor ...

  5. Ofuscação da porta alterando a porta SSH. No entanto, essa também não é uma boa idéia sem medidas adicionais de segurança - o mantra de "Segurança através da obscuridade" já foi refutado e contestado em muitos casos. Fiz isso em conjunto com o IDS / IPS e a filtragem de rede, mas ainda é uma coisa MUITO ruim de se fazer por conta própria.

  6. Autenticação de dois fatores OBRIGATÓRIA, através das soluções de autenticação de dois fatores da Duo Security . Cada um dos meus servidores SSH tem o Duo configurado, de modo que, para entrar, prompts 2FA acontecem e eu tenho que confirmar cada acesso. (Esse é o recurso útil final - porque, mesmo que alguém tenha minha senha ou quebre a senha, eles não conseguem passar pelos plugins Duo PAM). Essa é uma das maiores proteções em meus servidores SSH contra acesso não autorizado - cada login de usuário DEVE estar vinculado a um usuário configurado no Duo e, como eu tenho um conjunto restritivo, nenhum novo usuário pode ser registrado no sistema.

Meus dois centavos para garantir SSH. Ou, pelo menos, meus pensamentos sobre a abordagem.

Thomas W.
fonte
1

Convém fazer check-out do aplicativo FreeOTP no RedHat em vez de usar o Google Authenticator. Às vezes, ao atualizar o aplicativo, eles bloqueiam você! ;-)

Se você quiser usar outros tokens de hardware, como um Yubikey ou um eToken PASS ou NG, ou se tiver muitos usuários ou muitos servidores, convém usar um back-end de autenticação de dois fatores de código aberto.

Ultimamente, escrevi um tutorial sobre isso .

cornelinux
fonte
0

Eu escrevi um pequeno tutorial sobre como fazer isso recentemente. Basicamente, você precisa usar a PKI e meu tutorial também mostra como usar a autenticação de dois fatores para obter ainda mais segurança. Mesmo se você não usar nenhuma dessas coisas, também há alguns boatos sobre a proteção do servidor, removendo pacotes de códigos fracos e outros princípios básicos. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/

01000101
fonte
0

Para um grande número de usuários / certificados, considere a integração LDAP. As grandes organizações usam o LDAP como um repositório para credenciais e certificados de usuário armazenados em emblemas ou fobs, independentemente de os certificados serem usados ​​para autenticação ou assinatura de emails. Os exemplos incluem openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks ...

Computadores e grupos também podem ser gerenciados no LDAP, oferecendo gerenciamento central de credenciais. Dessa forma, os balcões de atendimento podem ter um balcão único para lidar com grandes populações.

Aqui está um link para a integração do centOS: http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html

weller1
fonte
0

Você também pode bloquear com base no país de origem usando o banco de dados geoIP.

Basicamente, se você mora nos EUA, não há motivo para alguém na Rússia se conectar ao seu SSH, para que eles sejam bloqueados automaticamente.

O script pode ser encontrado aqui: https://www.axllent.org/docs/view/ssh-geoip/

Você também pode adicionar comandos do iptables (como fiz para minhas gotículas) para eliminar automaticamente todo o tráfego de / para esses IPs.

Michael A Mike
fonte
1
Ocasionalmente, os bancos de dados GeoIP podem estar errados - me perguntaram se eu estava em Moscou ontem ... eh não! :)
Sean