quarta-feira, 1 de junho de 2016

Acessando servidores remotos usando SSH sem senha

Quando trabalhamos em servidores remotos frequentemente precisamos fazer diversas operações em sequência usando os comandos ssh, scp, rsync, etc. Um dos maiores incovenientes é ter que digitar a senha a cada execução de um comando. Neste post ensino como criar uma chave de autenticação usando SSH que permite o login sem senha.

Neste tipo de autenticação uma chave privada fica armazenada na máquina A e para obter seu segredo é preciso digitar uma senha. Uma chave pública é armazenada na máquina remota B e ela só é "aberta" pelo segredo escondido em sua chave privada correspondente. Logo, é necessário "destravar" a chave privada somente no primeiro acesso.

A criação do par de chaves é feita pelo comando ssh-keygen:

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ~/.ssh/id_rsa.
Your public key has been saved in ~/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0rOezO7MDuoyUEzTIDp8JrEswn6K7XIvvikRm1JbG1E Igor@rouennais

A chave privada foi armazenada em ~/.ssh/id_rsa, enquanto a pública está em ~/.ssh/id_rsa.pub. Para permitir o login em B com o usuário user sem senha a partir de A basta adicionar o conteúdo de ~/.ssh/id_rsa.pub em A no fim do arquivo ~user/.ssh/authorized_keys na máquina B.

$ cat ~/.ssh/id_rsa.pub | ssh user@B 'cat >> ~/.ssh/authorized_keys'

Com isto, qualquer operação que involva ssh (scp, rsync, sshfs, etc) pode ser realizada sem senha. Isto inclui, inclusive, bibliotecas como a Paramiko, que permite acessar máquinas remotas usando Python.