Acesso SSH via chaves públicas/privadas

Frequentemente precisamos acessar diversos servidores diferentes, usando SSH como transporte. Existem casos onde é necessário zelar de atualizações e patches de centenas, ou até milhares de servidores.

Digitar senha a cada tentativa de conexão pode se tornar um pesadelo se forem definidas políticas de troca de senha na empresa. Como simplificar o acesso a estes equipamentos ?

Bem, existe uma forma segura e prática: Usar chaves criptografadas. Com elas, no momento em que você perguntar ao servidor de destino se “pode se conectar”, ele irá conferir a chave pública já presente nele e irá autorizar (ou não) você a logar-se automaticamente.

Mãos à massa: Em primeiro lugar, vamos criar as chaves. Você guardará a cópia privada em seu computador (nunca a distribua!) e enviará a pública para os servidores que desejar. Rode o seguinte comando:

ssh-keygen -t dsa

Os diálogos a seguir irão aparecer. Nas três perguntas que ele te apresentar, não preencha nada, simplesmente deixe em branco e pressione [enter].

Generating public/private dsa key pair.
Enter file in which to save the key (~/.ssh/id_dsa): (deixe em branco)
Enter passphrase (empty for no passphrase): (deixe em branch)
Enter same passphrase again: (deice em branco)
Your identification has been saved in ~/.ssh/id_dsa
Your public key has been saved in ~/.ssh/id_dsa.pub
The key fingerprint is:

Pronto, agora só nos resta enviar a chave pública a todos os destinos que desejarmos !
Em distribuições Linux, você pode usar o comando ssh-copy-id, porém no OSX (e possivelmente Solaris, HP-UX e AIX) não temos essa opção por padrão.
Podemos então copiar manualmente o conteúdo da chave (presente em ~/.ssh/id_dsa.pub) para o arquivo ~/.ssh/authorized_keys do servidor.

O seguinte script é uma cópia do ssh-copy-id presente num servidor CentOS que eu tinha em mãos:

#!/bin/sh
 
# Shell script to install your identity.pub on a remote machine
# Takes the remote machine name as an argument.
# Obviously, the remote machine must accept password authentication,
# or one of the other keys in your ssh-agent, for this to work.
 
ID_FILE="${HOME}/.ssh/identity.pub"
 
if [ "-i" = "$1" ]; then
  shift
  # check if we have 2 parameters left, if so the first is the new ID file
  if [ -n "$2" ]; then
    if expr "$1" : ".*\.pub" ; then
      ID_FILE="$1"
    else
      ID_FILE="$1.pub"
    fi
    shift         # and this should leave $1 as the target name
  fi
else
  if [ x$SSH_AUTH_SOCK != x ] ; then
    GET_ID="$GET_ID ssh-add -L"
  fi
fi
 
if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ] ; then
  GET_ID="cat ${ID_FILE}"
fi
 
if [ -z "`eval $GET_ID`" ]; then
  echo "$0: ERROR: No identities found" >&2
  exit 1
fi
 
if [ "$#" -lt 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
  echo "Usage: $0 [-i [identity_file]] [user@]machine" >&2
  exit 1
fi
 
{ eval "$GET_ID" ; } | ssh $1 "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1
 
cat <

Agora é só testar ! Tente conectar-se diretamente, ele não deverá solicitar senha daqui em diante, para o seu usuário.

Em alguns poucos casos, pode ser que ainda esteja pedindo senha. Esta é uma dúvida bastante frequente nos usuários, e a solução é bastante simples: Confira se, no servidor de destino, a pasta ~/.ssh possui chmod 700.

🙂

Abraços!

Sobre Jeremias Zerbini

Jeremias Zerbini escreveu 76 artigos neste blog.

27 anos, entusiasta de tecnologias opensouce, geek, adorava perder as partições do HD aos 15 anos instalando GNU/Linux. Gosta de video-games, e isso inclui instalar o Yellow Dog no PS3 novinho. Consultor autônomo na área de infra-estrutura de servidores, está sempre dedicando, quando possível, um tempinho extra para pesquisar sobre novas e melhores alternativas ao software proprietário [mas sem histeria].

Related Posts Plugin for WordPress, Blogger...

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *