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: 32.703 ]

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/ 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.
  • 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/ 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.

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

storage FreeNas 9.2.1.6 - Instalação e configuração

Criando backups com Amazon S3

Backup de máquinas virtuais no ESXi 5.0 com script ghettoVCB

Backup e restore para iniciantes

TimeShift - Restaure seu Linux com eficiência

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts