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.
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.
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.
Em meus testes, funcionou perfeitamente.
Qualquer dúvida, é só deixar um comentário.
Até a próxima.
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çãoOutros artigos deste autor
Nenhum artigo encontrado.Leitura recomendada
Backup do Linux utilizando cliente do IBM Tivoli
Backup de máquinas virtuais no ESXi 5.0 com script ghettoVCB
Aumentando Resize (Tamanho) do HD Virtual VMDK - Debian 8 Jessie
Comentários
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.
Parabéns Diego, ficou muito bom e bem explicado seu artigo. Vlw pela contribuição.
[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
Interessante, vou testar aqui também!!
Valeu mano, fui de muita ajuda teu poste, abraço.
Ó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.