Índice - Tutoriais

Dominando o SSH

Por Carlos E. Morimoto em 26 de agosto de 2006 às 22h05

8

Usando chaves de autenticação


Por mais seguras que sejam suas senhas, sempre existe uma pequena possibilidade de que um atacante descubra alguma delas, observando enquanto você digita no teclado, ou que simplesmente consiga adivinhá-la a partir de informações pessoais ou de senhas antigas. Se você tem o hábito de usar as mesmas senhas em vários locais, a possibilidade cresce, pois muitos serviços armazenam ou transmitem senhas de formas não seguras. Com isso, as senhas acabam sendo o ponto fraco da segurança.

Como de praxe, o SSH oferece uma resposta para o problema. Em vez de depender unicamente da senha como forma de autenticação, você pode utilizar um par de chaves de autenticação, onde a chave pública é instalada nos servidores que serão acessados e a chave privada (que nunca sai da sua máquina) é protegida por uma passphrase, sem a qual a chave se torna inútil.

Nesse caso, temos uma segurança de dois níveis, em que é preciso saber a passphrase e, além dela, ter a chave privada, um arquivo salvo no HD ou em um pendrive, algo similar ao sistema bancário, onde você precisa ter o cartão e saber a senha.

Para gerar o par de chaves, use (no cliente) o comando:

$ ssh-keygen -t rsa

Ele deve ser executado usando seu login de usuário (o mesmo que você usa para acessar os servidores remotos), não como root:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/morimoto/.ssh/id_rsa):
Created directory '/home/morimoto/.ssh'.
Enter passphrase (empty for no passphrase): ********
Enter same passphrase again: ********
Your identification has been saved in /home/morimoto/.ssh/id_rsa.
Your public key has been saved in /home/morimoto/.ssh/id_rsa.pub.

The key fingerprint is:
ff:28:26:f6:87:67:9f:4c:9a:c8:0a:3b:21:81:88:b4 morimoto@athenas

A passphrase pode ser desde uma senha "normal", com 8 ou 12 caracteres, até uma frase complexa, sem limite de tamanho; o importante é que não seja algo fácil de adivinhar. A passphrase é, na verdade, um componente da chave de encriptação; sem ela é impossível usar a chave.

O comando gerará os arquivos ".ssh/id_rsa" e ".ssh/id_rsa.pub" dentro do seu diretório home, que são, respectivamente, sua chave privada e sua chave pública. O ".ssh/id_rsa" é um arquivo secreto, que deve usar obrigatoriamente o modo de acesso "600" (que você define usando o chmod), para evitar que outros usuários da máquina possam lê-lo. Muitos servidores recusam a conexão caso os arquivos estejam com as permissões abertas.

Depois de gerar seu par de chaves, falta o comando final, que instala a chave pública no servidor, permitindo que ela seja usada para autenticação:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub login@servidor

Como o nome sugere, o comando "ssh-copy-id" copia sua chave pública, instalando-a no servidor. Ao usá-lo, substitua o "login" pelo seu login de usuário e o "servidor" pelo endereço IP ou o domínio do servidor.

Ao ser executado, ele abrirá uma conexão via SFTP (ainda utilizando seu login e senha de acesso), que é usada para instalar a chave pública (o arquivo ".ssh/id_rsa.pub", dentro do seu home) no diretório correspondente do servidor. Naturalmente, para que a transferência funcione, é necessário que o SFTP esteja ativo na configuração do servidor.

Caso você utilize o mesmo login de usuário nas duas máquinas (usa o usuário "joao" em ambas, por exemplo), pode omitir o login no comando, digitando apenas "ssh-copy-id servidor", como em:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.0.1

A partir daí, ao invés de pedir sua senha, o servidor envia um "desafio" encriptado usando a chave pública. Para respondê-lo, o cliente SSH na sua máquina precisa usar a chave privada, que por sua vez precisa ser destravada usando a passphrase. Mesmo que alguém consiga roubar sua chave privada, não conseguirá conectar sem saber a passphrase e vice-versa.

Em resumo, o que o ssh-copy-id faz nada mais é do que copiar o conteúdo do arquivo ".ssh/id_rsa.pub", dentro do seu diretório home, para o arquivo ".ssh/authorized_keys" dentro do diretório home do servidor remoto, uma operação que também pode ser realizada manualmente em caso de problemas.

O arquivo ".ssh/id_rsa.pub" é composto por uma única (e longa) linha, que contém sua chave pública de encriptação. Ela segue este padrão:

ssh-rsa AAAA(muitos caracteres)6lYzxBpu6M3Moe4HXaTs= login@nomedamaquina"

Você pode instalar a chave manualmente simplesmente logando-se na máquina remota via SSH e copiando a linha para dentro do arquivo ".ssh/authorized_keys", o que pode ser feito copiando e colando o texto através de qualquer editor que suporte esta função, como o joe ou o vi. No final, o arquivo ".ssh/authorized_keys" da máquina remota (dentro do home) terá o mesmo conteúdo do arquivo ".ssh/id_rsa.pub" da sua máquina, o que orienta o servidor remoto a passar a checar sua chave privada e a passphrase, ao invés de pedir senha.

Concluindo, depois de gerar a chave e conseguir se conectar através dela, você pode desativar a possibilidade de fazer logins normais, usando senha. Nesse caso, apenas você, que possui a chave gerada, conseguirá se conectar ao servidor.

Outras pessoas, mesmo que descubram a senha de alguma das contas, não terão como se conectar e nem como instalar uma nova chave para fazê-lo, a menos que tenham acesso físico ao servidor, a fim de copiar a chave manualmente. Isso significa que, mesmo alguém com a senha de root do seu servidor em mãos não conseguirá fazer nada remotamente (o sonho de todo administrador ;). Isso pode ser usado para incrementar a segurança.

Para isso, mude as opções "PasswordAuthentication" e "UsePAM" para "no" no arquivo "/etc/ssh/sshd_config" do servidor:

PasswordAuthentication no
UsePAM no

A opção "PasswordAutentication no" permite desativar o uso das senhas, como esperado, enquanto a "UsePAM no" reforça a configuração, desativando qualquer outra forma de autenticação com exceção das chaves.

Para que as alterações entrem em vigor, reinicie o servidor SSH:

# /etc/init.d/ssh restart

ou:

# service sshd restart

8 comentáriosPor Carlos E. Morimoto. Revisado 26 de agosto de 2006 às 22h05

Comentários

Parabéns
por Dirac (anônimo) em 7 de dezembro de 2011 às 20h31
Mandou muito bem. O tutorial é auto-contido, o que difícil de se ver por ai. Não é necessário um background gigante em linux ou rede para acompanhar a leitura.

Vale a pena separar um tempo e ler tudo com calma.
Muito bom mesmo!
por Marcos (anônimo) em 3 de novembro de 2011 às 14h00
Muito bom o seu tutorial, deu para dar uma boa introduzida no assunto e tentar realizar algumas aplicações.

Além do mais que foi sempre claro, e colocou resposta para as dúvidas que iam surgindo.

Obrigado.
Parabens ótima explicação
por Alexsandro Pereira (anônimo) em 20 de outubro de 2011 às 16h41
Parabens muito vom sua explicação, mesmo nos iniciantes podemos entender mais sobre esse protocolo.

Muito bom mesmo, Parabens pela iniciativa de colaborar com a comunidade.
PERFEITO
por Fernando (anônimo) em 2 de julho de 2011 às 11h55
PERFEITO é a palavra que melhor descreve este artigo. Nunca tive contato com o ssh, quando tomei conhecimento das possibilidades resolvi testar e utilizei como base um pouquinho do conhecimento aqui adquirido. Parabéns
Muito bem.
por Alex (anônimo) em 19 de maio de 2011 às 16h21
Otimo. a forma da explicação esta perfeita. ate pessoa leigas podem entender de forma plena.

muito bom mesmo, e o layout do site facilita demais.

parabens
exelente explicação
por Carlos (anônimo) em 23 de novembro de 2010 às 19h47
Muito boa sua explicação, valeu, fiz um seminário na minha faculdade sobre o assunto, e suas dicas me ajudaram muito. parabéns.
MUITO BOM
por SÉRGIO SOUSA (anônimo) em 23 de novembro de 2010 às 18h32
MUITO BOA MATÉRIA... DISSEMINAR CONHECIMENTO É SINAL DE SABEDORIA !
Excelente matéria
por Lucas (anônimo) em 16 de setembro de 2010 às 20h49
Pude entender como funciona o SSH, sua matéria está de parabéns