Visite também: Viva o Linux · Dicas-L · NoticiasLinux · SoftwareLivre.org



» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha


[Artigo] Dicas avançadas de segurança para SSH

Linux user
rubens.queiroz
16/06/2010
Neste artigo irei demonstrar alguns truques simples para ajudá-lo a aperfeiçoar a segurança do seu serviço ssh.
[ Hits: 15515 ] Por: Rubens Queiroz de Almeida

Introdução

Este artigo foi traduzido e adaptado a partir do original, publicado no site Linux.com, chamado Advanced SSH security tips and tricks, de autoria de Anze Vidmar.

Neste artigo irei demonstrar alguns truques simples para ajudá-lo a aperfeiçoar a segurança do seu serviço SSH.

O arquivo de configuração do servidor SSH fica em /etc/ssh/sshd_conf. Você precisará reiniciar o serviço SSH após cada mudança que fizer no arquivo para que as alterações sejam efetivadas.

Técnicas para melhoria da segurança do serviço SSH:

Alterar a porta em que o servidor SSH ouve

Por default, o serviço SSH atende conexões na porta 22. Invasores usam software de scan de portas para identificar se os computador está rodando o serviço SSH. É recomendável mudar esta porta para um valor acima de 1024, visto que a maioria dos scanners de portas (inclusive o nmap), por default, não analisam portas altas.

Edite o arquivo /etc/ssh/sshd_config e procure por uma linha como:

Port 22

Altere o número da porta e reinicie o serviço SSH:

# /etc/init.d/ssh restart

Permita apenas SSH protocolo 2

Existem duas versões do protocolo SSH. Usar apenas a versão 2 do protocolo SSH é muito mais seguro; a versão 1 do protocolo SSH está sujeita a problemas de segurança, inclusive o ataque man-in-the-middle e ataques de inserção.

Edite o arquivo /etc/ssh/sshd_config e procure por uma linha com o seguinte conteúdo:

Protocol 2,1

Mude a linha para que especifique apenas a versão 2 do protocolo SSH.

Permita o login via SSH apenas para determinados usuários

Você não deve permitir login do usuário root via SSH, pois é um risco de segurança grande e desnecessário. Se um atacante consegue logar como root em seu sistema, ele pode causar mais danos do que se conseguisse acesso como um usuário comum.

Configure seu servidor SSH de modo a impedir que o usuário root consiga fazer o login diretamente. Encontre a linha abaixo:

PermitRootLogin yes

Mude o valor yes para no e reinicie o serviço. Você poderá fazer o login como qualquer outro usuário definido e mudar para o usuário root se precisar executar tarefas restritas ao superusuário.

É aconselhável criar um usuário local sem nenhum privilégio no sistema usar este usuário para fazer o login com SSH. Desta forma, nenhum prejuízo poderá decorrer se a conta deste usuário for comprometida. Ao criar este usuário certifique-se de que pertence ao grupo wheel, de forma a que ele possa se tornar o superusuário.

Se você deseja ter uma lista de usuários que são os únicos a poderem logar via SSH, você pode especificar estes usuários no arquivo de configuração sshd_config. Por exemplo, digamos que eu queira permitir que os usuários anze, dasa e kimy possam logar via SSH. Ao final do arquivo sshd_config adicione uma linha como abaixo:

AllowUsers anze dasa kimy

Criar um banner customizado para o SSH

Se você quiser que qualquer usuário que se conecte através de seu serviço SSH veja uma mensagem específica, você pode criar um banner SSH customizado. Basta criar um arquivo de texto (em meu exemplo este arquivo se chama /etc/ssh-banner.txt) e escrever dentro dele qualquer mensagem que desejar; por exemplo:

*****************************************************************
* Este é um serviço SSH privado. Não é para você estar aqui     *
* Por favor, saia imediatamente.                                *
*****************************************************************

Ao terminar a edição, salve o arquivo. No arquivo sshd_conf, procure por uma linha que diz:

#Banner /etc/issue.net

Descomente a linha e coloque o caminho para o seu banner SSH customizado.

Usando chave pública DSA para autenticação

Ao invés de usar nomes de login e senhas para autenticação via SSH, você pode usar chaves públicas DSA. Observe que você pode ter tanto nomes de login e autenticação por chaves públicas DSA habilitados ao mesmo tempo.

Ter a autenticação por chaves públicas DSA habilitadas torna o seu sistema a prova de balas para ataques de dicionário, porque você não precisa de um nome de login e senha para se logar no serviço SSH. Ao invés disto, você precisa de um par de chaves DSA -- uma pública e uma privada. Você mantém a chave privada na sua máquina e copia a chave pública para o servidor. Quando você quiser estabelecer uma sessão SSH, o servidor verifica as chaves, e se elas baterem, você recebe uma shell. Se as chaves não baterem, você é desconectado.

Neste exemplo, a máquina pessoal (a partir da qual me conectarei ao servidor) é station1 e a servidora é server1. Em ambas as máquinas eu tenho o mesmo diretório home; isto não irá funcionar se os diretórios home são diferentes nas máquinas cliente e servidor. Primeiro, você precisa criar um par de chaves em sua máquina pessoal com o comando:

$ ssh-keygen -t dsa

Você precisará especificar uma frase para sua chave privada, mas você pode deixá-la em branco, o que não é recomendável. Um par de chaves é gerado. Sua chave privada será gravada em ~/.ssh/id_dsa e sua chave pública será gravada em .ssh/id_dsa.pub.

A seguir, copie o conteúdo de ~/.ssh/id_dsa.pub para server1, para o arquivo ~/.ssh/authorized_keys. O conteúdo de ~/.ssh/id_dsa.pub deve ser algo como:

$ cat .ssh/id_dsa.pub

ssh-dss AAAAB3NzaC1kc3MAAACBAM7K7vkK5C90RsvOhiHDUROvYbNgr7YEqtrdfFCUVwMWcJYDusNG
AIC0oZkBWLnmDu+y6ZOjNPOTtPnpEX0kRoH79maX8NZbBD4aUV91lbG7z604ZTdrLZVSFhCI/Fm4yROH
Ge0FO7FV4lGCUIlqa55+QP9Vvco7qyBdIpDuNV0LAAAAFQC/9ILjqII7nM7aKxIBPDrQwKNyPQAAAIEA
q+OJC8+OYIOeXcW8qcB6LDIBXJV0UT0rrUtFVo1BN39cAWz5puFe7eplmr6t7Ljl7JdkfEA5De0k3WDs
9/rD1tJ6UfqSRc2qPzbn0p0j89LPIjdMMSISQqaKO4m2fO2VJcgCWvsghIoD0AMRC7ngIe6btaNIhBbq
ri10RGL5gh4AAACAJj1/rV7iktOYuVyqV3BAz3JHoaf+H/dUDtX+wuTuJpl+tfDf61rbWOqrARuHFRF0
Tu/Rx4oOZzadLQovafqrDnU/No0Zge+WVXdd4ol1YmUlRkqp8vc20ws5mLVP34fST1amc0YNeBp28EQi
0xPEFUD0IXzZtXtHVLziA1/NuzY= anze@station1.example.com

Se o arquivo ~/.ssh/authorized_keys já existir, adicione o conteúdo do arquivo ~/.ssh/id_dsa.pub ao arquivo ~/.ssh/authorized_keys em server1. A única coisa que resta fazer é definir as permissões de leitgura e gravação corretas para o arquivo ~/.ssh/authorized_keys em server1.

$ chmod 600 ~/.ssh/authorized_keys

Agora, configure o arquivo sshd_conf para usar as chaves de autenticação DSA. Certifique-se de que as linhas a seguir estão descomentadas:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

Reinicie o serviço. Se você configurou tudo corretamente, você deve poder efetuar conexões SSH para o seu servidor e cair diretamente no seu diretório home, sem a necessidade de qualquer tipo de interação.

Se você deseja habilitar apenas a autenticação DSA, certifique-se de descomentar e alterar a linha PasswordAuthentication no arquivo sshd_config de yes para no:

PasswordAuthentication no

Se alguém tentar se conectar ao seu serviço SSH e não possuir uma chave pública no servidor, ele será rejeitado sem ao menos ver o prompt de login, com o seguinte erro:

Permission denied (publickey).

Usando TCP Wrappers para permitir a conexão de hosts específicos

Esta técnica é útil se você deseja autorizar que apenas hosts específicos em uma rede se conectem ao seu serviço SSH, mas você não quer usar ou estragar a sua configuração do iptables. Ao invés disto, você pode usar TCP wrappers; neste caso, o wrapper sshd.

Criarei uma regra para autorizar a conexão ao meu serviço SSH apenas para hosts em minha subrede local 192.168.1.0/24 e para o host remoto 193.180.177.13.

Por default, TCP Wrappers primeiro consultam o arquivo /etc/hosts.deny para ver quais hosts não podem acessar qual serviço. Em seguida, consultam o arquivo /etc/hosts.allow para verificar se existe alguma regra que permite que determinados hosts se conectem a serviços específicos. Criarei uma regra como esta no arquivo /etc/hosts.deny:

sshd: ALL

Isto significa que, por default, todos os hosts são proibidos de acessar o serviço SSH. Preciso fazer esta especificação, pois caso contrário, todos os hosts teriam acesso ao serviço SSH, pois o TCP Wrappers primeiro consulta o arquivo hosts.deny e se não existir nenhuma regra bloqueando o serviço SSH, qualquer host poderá se conectar.

Em seguida, crie uma regra em /etc/hosts.allow para autorizar apenas hosts específicos (como definido anteriormente) a usar o serviço SSH:

sshd: 192.168.1 193.180.177.13

Agora, apenas hosts da rede 192.168.1.0/24 e o host 193.180.177.13 poderão acessar o serviço SSH. Todos os outros hosts serão desconectados antes mesmo de chegar ao prompt de login, e receberão um erro como abaixo:

ssh_exchange_identification: Connection closed by remote host

Usando iptables para autorizar a conexão de hosts específicos

Uma alternativa ao TCP Wrappers (embora você possa usar os dois ao mesmo tempo) é limitar o acesso ao serviço SSH com iptables. Aqui está um exemplo simples de como você pode autorizar apenas um host específico a se conectar usando o seu serviço SSH:

# iptables -A INPUT -p tcp -m state --state NEW --source 193.180.177.13 --dport 22 -j ACCEPT

Certifique-se de que ninguém mais tenha acesso ao serviço SSH:

# iptables -A INPUT -p tcp --dport 22 -j DROP

Salve as suas novas regras e pronto.

SSH time-lock

Você pode usar parâmetros diferentes do iptables para limitar as conexões ao seu serviço SSH por períodos de tempo pré-determinados. Você pode usar as diretivas /second, /minute, / hour ou /day, em qualquer dos exemplos abaixo.

No primeiro exemplo, se o usuário fornece a senha errada, seu acesso ao serviço SSH é bloqueado por um minuto, e o usuário só pode tentar um login por minuto a partir daquele momento:

# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP


Em um segundo exemplo, iptables é configurado para permitir que apenas o host 193.180.177.13 se conecte ao serviço SSH. Depois de três tentativas mal sucedidas, o iptables permitirá apenas uma tentativa de login por minuto:

# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/ minute --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP


Conclusão

Estes recursos não são difíceis de serem configurados, mas são técnicas poderosas para melhorar a segurança de seu serviço SSH. É um pequeno preço a ser pago para uma boa noite de sono.



Páginas do artigo
   1. Introdução

Outros artigos deste autor

Leitura recomendada

Comentários
[1] Comentário enviado por henrique.inside em 18/06/2010 - 10:51h:

Parabéns, eu tinha também uns bons conteúdos sobre segurança em SSH, mas esse complementou bastante meus conceitos.

[2] Comentário enviado por wryel em 21/06/2010 - 16:05h:

Obrigado por compartilhar, gostei bastante da ideia do banner :P

[3] Comentário enviado por anonymous em 26/06/2010 - 11:38h:

Bom artigo!!!

[4] Comentário enviado por elgio em 28/06/2010 - 19:57h:

Particularmente há de se fazer uma séria crítica a esta sugestão:

# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP

Alguém mal intencionado, que saiba disto, pode TIRAR o teu serviço do ar apenas mantendo uma taxa de SYNs a mais de 1 por minuto. Este é o SÉRIO PROBLEMA do módulo limit que, na minha opinião, não deve NUNCA ser usado (salvo na honrosa exceção que é para evitar lotar o arquivo de logs).

Um simples hping derruba este serviço:

hping3 IPDOSERVIDOR -p 22 -S

E bloquear o IP que está fazendo os Syns não adianta, pois pode-se falsificá-lo (a imensa maioria dos provedores de acesso ESCANDALOSAMENTE não tratam IP spoofing!!)

É o mesmo problema descrito em http://www.vivaolinux.com.br/artigo/Iptables-protege-contra-SYN-FLOOD/

[5] Comentário enviado por dastyler em 04/08/2010 - 00:20h:

òtimo conteudo, mas gostaria de salientar uma pequena maxima classica de seguranca:

Desabilite o serviço e ainda por cima de DROP na porta do iptables caso nao esteja usando. Alias isso é valido para qualquer serviço de rede: se nao o usa, drope o mesmo.
Uma outra opção tambem é deixar o SSH rodando apenas na rede local, sem nenhum acesso externo e logar os acessos ao SSH via iptables.
Basta altera a linha na conf (sshd_config):

ListenAddress 0.0.0.0

Para

ListenAddress seuendereconaredelocal

BTW, o Elgio fala isso do modulo limit há anos. E quem testar realmente verá que ele tem razao.

[]´s






[6] Comentário enviado por joaobps em 05/11/2010 - 11:53h:

Excelente artigo, ainda mais que com os comentarios enriquecem muito o conteudo do artigo e isso nao tem preço.

[7] Comentário enviado por osvaldohp em 06/12/2010 - 17:19h:

Muito bom este post, queria deixar uma dica que seria a utilização do DenyHost para ajudar contra ataques de força bruta. Para maiores informações é só acessar o site: http://denyhosts.sourceforge.net/

Valew :-)
http://osvaldohp.blogspot.com


[8] Comentário enviado por clandestine em 05/01/2011 - 12:57h:

otimo artigo parabens rubens

[9] Comentário enviado por piquen0 em 30/03/2011 - 21:50h:

Parabéns pelo artigo!!!

[10] Comentário enviado por mpesmartins em 03/04/2011 - 10:22h:

Excelente artigo. Eu gostaria de complementar com um outro artigo sobre segurança em SSH:

http://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html

Além das dicas mencionadas aqui, tem também outras boas práticas, como o port knocking.

[11] Comentário enviado por mcnd2 em 24/04/2011 - 02:07h:

Muito bom.

Até eu que não entendo muito de confguração de segurança deu gosto de ler esse belo trabalho.

Parabéns Rubéns.


Contribuir com comentário
  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Contribuir com: [ Artigo | Conf | Dica | Notícia ]
Responsáveis pelo site: Fábio Berbert de Paula / OYS Academy
Site hospedado por:

Segurança Linux

Site especializado em conteúdo de segurança para Linux.