você está aqui: Home  → Arquivo de Mensagens

Como melhorar a segurança do ssh

Colaboração: Ederson L. Corrêa

Data de Publicação: 13 de Janeiro de 2005

Sabemos que o ssh é uma forma de acesso remoto razoalvelmente segura, bem mais segura que nosso velho conhecido telnet.

Entretanto, na net encontram-se disponiveis diversos scripts de "brute force" para tentar se obter acesso pelo ssh, e como não faltam idiotas metidos a crackers para tentarem essas coisas, sempre é bom se cercar de todo o cuidado.

Aqui listarei algumas sugestões coletadas de várias fontes (agradecimentos especiais ao Alejandro Flores, que me deu boas idéias), que ajudam a aumentarmos nossa segurança.

1. Use senhas fortes: Não use senhas fáceis, muito menos pequenas, de preferência assimétricas e sem padrão (nada de "letra numero letra numero ..." ou "numero letra numero letra ...") e faça bom uso dos caracteres como @,#,$,&, ...;

2. Mude a porta do ssh: Só com isso minimizamos problemas com um ataque automatizado, ou ataques de script kiddies que não sabem mudar a porta do ssh no exploit que baixaram da internet. Isso pode ser feito através da opção 'Port' do /etc/ssh/sshd_config.

3. Bloqueie o acesso como usuário root: Assim, evita-se problemas de alguém conseguir quebrar a senha do root e já acessar com plenos poderes. Com isso, o 'atacante' teria que descobrir o login e password de um usuário e depois a senha do root. Isso pode ser feito adicionando 'PermitRootLogin no' no /etc/ssh/sshd_config.

4. Certifique-se de o sshd estar rodando com separação de privilegios: Dessa forma, o sshd cria um processo não privilegiado para tratar as conexões iniciais. Após sucesso na autenticação, cria um outro processo que tem os provilegios necessários. Isso é default no ssh, mas devemos garantir que NÃO exista uma linha com 'UsePrivilegeSeparation no' no /etc/ssh/sshd_config.

5. Permita acesso a apenas um usuário: Isso é possivel através da opção 'AllowUsers' do /etc/ssh/sshd_config. Bastaria acrescentar uma linha com 'AllowUsers nome_do_usuario_autorizado_a_logar_via_ssh'.

6. Crie um usário com o máximo de restrições possiveis e que você só use para o shh: Exemplos de restrições:

  • Não o inclua em nenhum outro grupo além do users;
  • Edite o /etc/ftpusers e acrescente o nome desse usuário. Assim bloqueamos o acesso dele ao ftp.
  • Evite que ele possa se tornar root (adicione uma linha com 'root:nome_usuario_do_ssh:DENY' no /etc/suauth). Assim, vc deverá se tornar outro usuário e ai sim se tornar root. Exemplo, suponhamos que 'teste' seja o usuario criado para o acesso por ssh, e que 'elcorrea' seja um outro usuário cadastrado na máquina, assim para se tornar root estando logado com teste teriamos que fazer:

      $ (aqui somos teste)
      $ su - elcorrea (aqui nos logamos como usuario elcorrea)
      Password: (password do elcorrea)
      $ (agora somos elcorrea)
      $ su - (aqui nos tornamos root)
      Password: (password do root)
      # (agora somos root)
    

    Assim, vemos que alguém teria que descobrir dois nomes de usuário e três senhas para conseguir se tornar root.

  • Utilize algum programa pós-login para efetuar um 'challenge' para certificar de que você é você mesmo. Essa foi uma grande idéia do Alejandro. O que ele quis dizer é para criarmos um programa ou script que faz uma pergunta, a qual pode ser um gerador de caracteres baseado na hora ou uma simples pergunta de carater pessoal, que só você saberia responder. E caso o usuário erre ou tente fechar o programa/script (ctrl+c) a sessão é fechada. Um exmeplo bem simplista seria:

  • Crie (ou edite acrescentando no inicio) um .bash_profile para o usuário do ssh com o seguinte conteudo:

      trap '' SIGINT SIGTERM
      ./eu.sh
      if [ -e sou_eu.txt ]; then
         echo "Acesso Autorizado"
         rm -f sou_eu.txt
      else
         echo "Acesso Negado"
         logout
      fi
      trap SIGINT SIGTERM
    

  • Crie um arquivo chamado eu.sh no home do usuário do ssh, com:
      #!/bin/bash
      echo "Qual a senha do seu cartao?"
      read resp
      if [ "$resp" == "123456" ]; then
       touch sou_eu.txt
      fi
    

    E não se esqueça de torna-lo executavel: chmod +x eu.sh

7. Se possivel, limite os endereços IPs que podem acessar a maquina por ssh: Caso você sempre acesse a máquina através de um número limitado de maquinas, ou então somente internamente a rede, você pode limitar o acesso ao ssh a somente essas maquinas.

Isso pode ser feito de diversas formas, com regras no iptables, através da dupla /etc/hosts.allow e /etc/hosts.deny, e, o que eu acho mais fácil, através da opção AllowUsers na forma user@host.

Assim, suponhamos que eu sempre acesso a maquina remoatamente através de uma máquina de IP 10.0.0.5 e que eu criei o usuário 'teste' para acesso por ssh, assim eu acrescentaria uma linha com 'AllowUsers teste@10.0.0.5' no /etc/ssh/sshd_config, e limitaria o acesso a apenas esse usuário e de apenas essa maquina.

Se você não pode limitar os endereços, por qualquer razão, é bom utilizar um script que detecte uma tentaiva de acesso por brute force e que bloqueie o IP do atacante. Veja também um script desse tipo, criado pelo Mastah listado abaixo:

  #!/bin/bash
  # Shellscript criado para bloquear os corriqueiros bruteforce probes
  # feitos para a porta do ssh. Pega as ultimas 20 tentativas ilegais na porta do ssh.
  # Verifica se voce já bloqueou o mané e se voce quer adicionar na regra do iptables.
  # Caso queira usar no crontab, é so mudar o valor da var $MODE pra "AUTO"...
  # Abracos, Mastah
  
  MODE="AUTO"
  #MODE="MANUAL"
  
  if [ -f /var/log/messages ] ; then
    ips=$(cat -n /var/log/messages | tail -n 20 | grep -i Illegal | grep -i sshd | awk -F" " {'print $11'})
    attempts=1
    for ip in $ips ; do
       lastip=$ip
       if [ "$lastip" == "$ip" ] ; then
          attempts=$(expr $attempts + 1)
          if [ $attempts -ge 5 ] ; then
             echo "Brute force SSHD attack detected from $ip"
             attempts=1
             lastip=""
             blocked=$(iptables -L INPUT | grep -i $ip | grep -i DROP)
                    if [ "$blocked" ] ; then
                echo "> Ip Already Blocked. Continuing with scan"
                echo " "
             else
                if [ $MODE == "MANUAL" ] ; then
                   echo "> Do You Want to add this IP to INPUT DROP in IPTABLES rules? (y/n)"
                   read resp
                   if [ "$resp" == "y" ] ; then
                      iptables -A INPUT -s $ip -j DROP
                      echo "> IP $ip ADDED TO IPTABLES INPUT DROP ruleset"
                      echo " "
                   fi
                else
                   iptables -A INPUT -s $ip -j DROP
                   echo "> IP $ip ADDED TO IPTABLES INPUT DROP ruleset"
                   echo " "
                fi
             fi
          fi
       fi
    done
  fi

Assim, utilizando apenas algumas dessas dicas já aumentamos enormemente a nossa segurança.

Caso não tenha ficado claro, todas as alterações mencionados aqui devem ser feitas na maquina que será acessada remotamente.

Referências



 

 

Veja a relação completa dos artigos de Ederson L. Corrêa

Opinião dos Leitores

Flavio Alberto
14 Nov 2012, 12:01
O script de changele esta realmente correto? não estou conseguindo faze-lo funcionar
Osmar Klein
16 Ago 2010, 10:49
Olá Ederson, ótimo artigo. Porem nao consegui executar o passo "evite que ele possa se tornar root (adicione uma linha com 'root:nome_usuario_do_ssh:DENY' no /etc/suauth)" , pois nao encontrei no /etc o suauth

Abracos

Osmar
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script