Logotipo Dicas-L, por Ricardo Burile

Busca

Visite também: Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

Você está aqui: Home  → Arquivo Dicas-L

 

Assine a Lista Dicas-L

Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.

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

Stumble Upon Digg This Del.icio.us Twitter Recomendar este artigo a um amigo Entre em contato Formato PDF
Newsfeed RSS
Formato para impressão
StumbleUpon Digg Del.icio.us Twitter Recomendar Contato PDF RSS Imprimir

Referências Adicionais

Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.

Avalie esta dica

  • Currently 3.00/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.0 /5 (856 votos)

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*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
Twitter, Chiclete e Camisinha


Encontre imóveis, apartamentos e casas a venda no Imobilien
Saiba mais

Aprenda Inglês em Casa