quarta-feira, 21 de julho de 2010

Sincronia de diretórios remotos - SSH, SCP E RSYNC com autenticação por chave pública

Uma opção muito útil para scripts de automatização de cópias de arquivos locais para remotos é uso do scp ou simplesmente o rsync para sincronizar esses arquivos. Tanto o scp quanto o rsync, usam o serviço ssh ou sshd que é o daemon em execução no servidor para receber conexões de acesso remoto seguras, que também permite a cópia de arquivos, que trafegam, de maneira segura, através de um canal. Desta meneira é possível criar um script para sincronizar um ou mais arquivos ou até diretórios inteiros de maneira automatizada, o pequeno empecilho neste caso é que os comandos ssh, scp e rsync, quando executados irão pedir uma senha para o usuário informado como parâmetro, inviabilizando o uso do script em um agendamento, por exemplo. Porém existem maneiras de tornar o scp e o rsync automatizados, é o que muitas pessoas chamam errôneamente de ssh sem autenticação, pois existe a falsa impressão de que não está acontecendo nenhum tipo de autenticação no momento da conexão, pois não é solicitada a senha logo após o comando.
Na verdade acontece uma autenticação por chave pública, que nada mais é do que informar-mos ao servidor ssh que uma conexão vinda de um determinado usuário, de uma determinada máquina, com uma chave pública conhecida por ele e confirmada pela máquina cliente com a chave privada, é autorizada a acessar o serviço ssh sem a necessidade de senha, pois a conexão já foi autenticada pelo processo anterior e  confirmada como segura. Desta forma podemos utilizar scripts automatizados para sincronismo de arquivos e eles não irão deixar de ser executados por falta de autenticação.

Vamos aos passos:
Primeiramente, devemos na máquina cliente, criarmos as chaves pública e privada do usuário que irá ter permissão no servidor remoto, usando o comando ssh-keygen, que por omissão criará chaves do tipo RSA. Por padrão serão criadas as chaves chaves pública e privada com 512, para melhorar a segurança dessas chaves passe o parâmetro -b e aumente para 4096 bits, desta maneira:

#ssh-keygen -t rsa -b 4096

Será exibida a mensagem:
Enter file in which to save the key, com a sugestão de nome para o arquivo, permita o padrão e pressione enter;
Em seguida será exibida:
Enter passphrase (empty for no passphrase):
Como nesta situação, o objetivo é viabilizar a automatização, deixe a frase em branco e confirme.

Neste momento será criado no diretório ~/.ssh/ os arquivos de chave pública id_rsa.pub e chave privada id_rsa.pub, uma boa prática é alterar as permissões no arquivo de chave privada, para outros usuários não possam lê-lo e copiá-lo, havendo a possibilidade de se passar pelo usuário em questão.

#chmod 600 id_rsa 

Neste momento você pode enviar a sua chave pública e adicioná-la como confiável no servidor remoto, de uma só vez, com o comando ssh-copy-id, com  parâmetro -i para informar o nome do arquivo de chave pública, desta maneira:

#ssh-copy-id ~/.ssh/id_rsa.pub usuario@servidor

Executado o comando acima o servidor remoto irá criar no diretório ~/.ssh/ o arquivo authorized_keys e adicionará nele o conteúdo do arqvuivo id_rsa.pub do usuário na maquina cliente, note que ao exibir o conteúdo deste arquivo você observará no final da linha o nome do usuário @ nome da máquina cliente.

A partir deste momento os comandos ssh, scp, rsync e outras ferramentas que utilizem o serviço ssh terão autenticação por chaves e não será solicitada senha após o comando, possibilitando a utilização em scripts de automatização.