Backups remotos com rSync e chaves SSH

rSync e comandos / SSH e automatização

rSync e alguns comandos

rSync, assim como o SCP, são ótimas ferramentas para transferências de arquivos entre máquinas, porém, possuem uma deficiência, eles são inseguros.

Originalmente, o rSync não utiliza nenhuma forma de criptografia, o que o torna um tanto ineficaz para backups via Internet. Entretanto, este problema pode ser facilmente resolvido, utilizando o nosso “canivete suíço” SSH como meio de transporte, possibilitando automatizar a tarefa com um script básico. 

Neste exemplo, vou me referir a máquina local como (A) e o servidor como (B). O comando com o rsync, seria o seguinte:

$ rsync -av –rsh=”ssh -l bkuser” /mnt/backup/ bkuser@IPServidorRemoto:/home/bkuser/backup/

Onde, no comando anterior:

  • O parâmetro –rsh=ssh, orienta o rSync a utilizar o SSH como meio de transporte.
  • -l bkuser, informa com qual usuário o SSH deve conectar-se no servidor remoto (B).
  • Adiante, vem a pasta local (A), o endereço IP do servidor remoto (B) e a pasta para onde vão os arquivos.

Naturalmente, para que tudo funcione, é necessário que o serviço SSH esteja em execução nas duas máquinas e que o usuário local (A) tenha um login de acesso na máquina servidora (B).

Os parâmetros -av, fazem com que o rSync grave e atualize novos arquivos na pasta do servidor (B), caso o usuário apague arquivos na pasta local (A) e quiser que essa ação seja sincronizada com o servidor (B), será necessário adicionar o parâmetro –delete.

Outro parâmetro interessante, é o -z, que ativa a compressão na transferência dos arquivos reduzindo o volume de bytes transferidos.

O comando para deleção, seria o seguinte:

$ rsync -av –delete –rsh=”ssh -l bkuser” /mnt/backup/ bkuser@IPremoto:/home/bkuser/backup/

O comando para compressão dos arquivos, seria o seguinte:

$ rsync -avz –rsh=”ssh -l bkuser” /mnt/backup/ bkuser@IPremoto:/home/bkuser/backup/

Outra operação interessante, seria realizar um backup da máquina servidora (B) para a máquina local (A) em uma operação inversa, o comando seria o seguinte:

$ rsync -av –rsh=”ssh -l bkuser” bkuser@IPremoto:/home/bkuser/backup/ /mnt/backup/

Observação: a barra no final do caminho faz toda diferença, sem ela, o comando criará um subdiretório e copiará os arquivos. Com ela, o comando só copiará os arquivos.

Algumas opções comuns do rsync:

  • -r :: cópia recursiva;
  • -a :: modo de arquivamento;
  • -v :: de modo verbose, para mostrar na tela tudo o que ele está fazendo;
  • -z :: para compactar o arquivo durante a transferência (e descompactar no destino);
  • -u :: modo update. Se o arquivo não foi atualizado, pula para o próximo, poupando tempo;
  • -p :: preserva as permissões dos arquivos.

Existem diversas outras opções para o rsync, bastando apenas uma consulta simples com o comando:

$ man rsync

Fatalmente, o usuário precisará fornecer a senha de acesso ao servidor, toda vez que executar o comando, o que impossibilita o uso em scripts de backup automático.

Para resolver esse problema, a melhor solução, é utilizar um par de chaves SSH com a passphrase em branco. Dessa forma, o usuário não precisa digitar a senha, tornando a operação automática.

Gerando as chaves SSH e automatizando o acesso

O primeiro passo, caso o administrador ainda não tenha feito, seria criar um usuário na máquina servidora (B). Esse usuário permitirá o acesso aos arquivos por parte da máquina local (A).

Nesse exemplo, foi criado o usuário bkuser na máquina (B), ou seja, no servidor que receberá os arquivos, com o comando:

# adduser bkuser

O passo seguinte será gerar as chaves SSH na máquina local (A), com o comando:

$ ssh-keygen -t rsa

Para isso, utilize um usuário normal do sistema, é recomendado não utilizar o root para essa operação por uma questão de segurança.

No Ubuntu, onde fiz os testes, as chaves nem foram criadas como root. Não precisa nomear o arquivo, deixe tudo em branco, assim como a passphrase.

Serão geradas duas chaves, a privada e a pública. As duas chaves se encontram no diretório home do usuário, com o qual foi dado o comando dentro da pasta oculta .ssh. É importante que as chaves estejam dentro desse diretório.

A chave pública será enviada para o servidor remoto (B), usando o comando:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub bkuser@IPServidorRemoto

Se tudo ocorrer normalmente, o usuário já poderá logar-se no servidor remoto (B) sem precisar fornecer a senha. Isso poderá ser feito, executando o seguinte comando:

$ ssh bkuser@IPServidorRemoto

Isso, supondo que a porta seja a 22, que é a padrão do SSH. Caso não seja, utilize o parâmetro -p e especifique a porta.

Agora, é só gerar o script de backup com algum dos comandos mostrados e inserir uma linha no arquivo crontab, para que a operação seja automatizada.

Finalizando

Espero que dê certo com vocês.

Em meus testes, funcionou perfeitamente.

Qualquer dúvida, é só deixar um comentário.

Rolar para cima