Backups remotos com rSync e chaves SSH

Este artigo tem, por finalidade, demonstrar a configuração necessária para utilizar o rSync para realizar backups remotos de forma segura. Utilizando, para isso, um par de chaves SSH.

[ Hits: 36.011 ]

Por: diego santana em 19/03/2014


rSync e comandos / SSH e automatização



rSync e alguns comandos

O 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/ [email protected]:/home/bkuser/backup/

Onde, no comando anterior:
  • O parâmetro --rsh=ssh, orienta o rSync a utilizar o SSH como meio de transporte.
  • O -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/ [email protected]:/home/bkuser/backup/

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

rsync -avz --rsh="ssh -l bkuser" /mnt/backup/ [email protected]:/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" [email protected]:/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 [email protected]

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 [email protected]

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.

Até a próxima.

   

Páginas do artigo
   1. rSync e comandos / SSH e automatização
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Clonar HD com o comando pv salvando em .img

Conhecendo o rSync

Virtualização com ESXi 5.5.0 - pfSense virtualizado + backup de VMs no FreeNAS via iSCSI

Bacula 7.4.3 - Instalação e configuração

Recovery de um desastre total | utilizadores Bacula "backup"

  
Comentários
[1] Comentário enviado por leandromoreirati em 19/03/2014 - 23:37h

Diego,

Ótimo artigo parabéns, estava pesquisando uma forma de fazer esse tipo e backup e seu artigo me adiantou a vida, por acaso você sabe me dize ou conhece alguma documentação para criar uma exclude list, quero copiar todo o diretório menos uma pasta por exemplo, é possível fazer isso?

Desde já agradeço a atenção.

[2] Comentário enviado por diego_santana em 20/03/2014 - 16:53h

Olá Léo, obrigado pelo seu comentário, o rSync tem várias opções, ainda não testei todas, como ele é uma ferramenta de sincronização, acredito que não exista essa opção.

[3] Comentário enviado por netocortes em 21/03/2014 - 11:19h

Parabéns Diego, ficou muito bom e bem explicado seu artigo. Vlw pela contribuição.

[4] Comentário enviado por linux.cunha em 21/03/2014 - 12:38h


[1] Comentário enviado por leo_jfa em 19/03/2014 - 23:37h:

Diego,

Ótimo artigo parabéns, estava pesquisando uma forma de fazer esse tipo e backup e seu artigo me adiantou a vida, por acaso você sabe me dize ou conhece alguma documentação para criar uma exclude list, quero copiar todo o diretório menos uma pasta por exemplo, é possível fazer isso?

Desde já agradeço a atenção.



Eu uso assim para exlcuir pastas da sincronização ex: rsync -av --exclude 'lixeira' --exclude '.*' --exclude '._*' /origem /destino


[5] Comentário enviado por diego_santana em 21/03/2014 - 14:23h

Interessante, vou testar aqui também!!

[6] Comentário enviado por P3DR0S0 em 09/02/2017 - 11:37h

Valeu mano, fui de muita ajuda teu poste, abraço.


Contribuir com comentário