Backups remotos automáticos SSH

16

Eu tenho duas máquinas Ae B. Máquina Apode ssh em B. Atem muito espaço livre. Bos dados estão em uma espécie de situação de risco. Como faço backup de todos Bos dados para Aautomaticamente. Não precisa ser muito frequente, mas deve ser de mãos livres. Toda vez que a Ainicialização é frequente o suficiente. Ouvi que a sincronização pode fazer isso.

PyRulez
fonte

Respostas:

11

Para fazer isso diariamente na maioria das distribuições Linux, você deve poder colocar o rsynccomando (conforme a resposta do @ guido ) em um script e colocá-lo no /etc/cron.dailydiretório Enquanto anacronestiver instalado (por padrão), os cron.dailytrabalhos perdidos serão capturados na próxima vez em que a máquina inicializar (além de serem executados à meia-noite, se a máquina for ligada).

Para o script, você apenas faria:

#!/bin/sh
rsync -a user@serverB:/source/folder/ /destination_folder

Você pode adicionar a -zopção (compactação) se o backup estiver em uma conexão lenta (ish) ou se desejar economizar largura de banda, mas, na minha experiência, isso prejudicará o desempenho das máquinas / redes modernas.

Se você deseja manter o registro de cada backup, pode fazer algo como:

#!/bin/sh
rsync -av user@serverB:/source/folder/ /destination_folder \
  >/var/log/backup_log 2>&1

Observe que para que isso funcione como uma tarefa cron, você deve ter o ssh sem senha configurado para raiz no servidorA para efetuar login no servidorB. Deve ser a conta raiz (ou seja, digitar /root/.ssh), pois os cron.dailytrabalhos são executados como raiz.

Graeme
fonte
Não necessariamente se você usar uma chave pública e cronjobs por usuário.
Braiam
@Braiam, anacronnão será aceito por crontrabalhos do usuário . Embora você sempre possa usar su/ sudodo script para executar o rsync como um usuário específico. Mas observe que as chaves serão mantidas com mais segurança /root.
Graeme
11
se você deseja usar uma tarefa cron e ssh com root, é muito mais seguro restringir o que a raiz pode fazer na segunda máquina no arquivo allowed_keys.
guido
11
@ guido, não há necessidade de fazer login como root no serverB apenas porque você é root no serverA. O @JennyD já deu sugestões sobre o que fazer aqui, mas userpoderia ser apenas um usuário normal na máquinaB, dependendo do que você está fazendo backup.
Graeme
11
Provavelmente, seu usuário não tem acesso de leitura aos arquivos no servidor severB. Se esse for o caso, você precisará usar um usuário que faça ou conceda ao usuário atual as permissões corretas, adicionando-o aos grupos corretos ou alterando as permissões nos arquivos. Se você adicionar uma amostra dos erros que você está recebendo e a saída de ls -lalguns dos arquivos à sua pergunta, as pessoas poderão dar mais conselhos.
Graeme
5

Eu sugeriria o uso do rdiff-backup . Eu o uso agora para fazer backups incrementais automáticos todas as noites de meus próprios dados (duas estações de trabalho, dois servidores e uma conta no servidor de outra pessoa).

Eu usei o rsync anteriormente para isso, mas mudei para o rdiff-backup, pois é mais conveniente e pode fazer backups incrementais de arquivos grandes, como imagens de disco da máquina virtual. O rdiff-backup é muito parecido com os scripts de backup rsync anteriores, mas foi feito corretamente .

Coloquei um arquivo de script em /etc/cron.daily na máquina em que o backup está armazenado, que inicia o rdiff-backup uma vez por dia no início da manhã e busca os dados na máquina remota.

Thomas Padron-McCarthy
fonte
4

Além de todas as respostas anteriores, aqui está uma que se baseia em chaves SSH com restrições sobre o que pode ser feito ao fazer login com essa chave.

No servidor A

Neste, é menos importante se você criar um usuário separado ou usar um de seus nomes de usuário existentes, mas se fosse eu, eu criaria um usuário separado. Usarei o nome bkpuserde usuário para os dois servidores nos meus exemplos abaixo.

Quando conectado bkpuser, crie uma chave SSH sem uma senha.

No servidor B

Ativar PubkeyAuthenticationno sshd_config.

Crie o usuário bkpuser. Defina uma senha muito complicada ou desative o login de senha para esse usuário (exatamente como você faz isso dependerá de qual unix e distro você está executando). O ponto é que o usuário deve efetuar login apenas com uma chave SSH. Verifique se bkpuserpossui acesso de leitura a todos os diretórios e arquivos que você deseja fazer backup.

Copie a parte pública da chave criada em A para ~bkpuser/.ssh/authorized_keysB. Edite para executar automaticamente um comando na conexão. Esse comando não deve ser um ponteiro para um script de shell; em vez disso, insira o script de shell diretamente na chave. Inclua também uma limitação para que a chave possa ser usada apenas no servidor A e em nenhum outro servidor. No exemplo abaixo, estou dando ao servidor A o endereço IP 10.1.2.3e estou assumindo que os arquivos nos quais quero fazer backup estão todos em baixo /data.

from="10.1.2.3",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="cd /data;/usr/bin/tar -cf - *; /usr/bin/logger -t BACKUP -p daemon.info \"INFO: Backup-files on $HOST fetched from ${SSH_CLIENT%% *} by $USER\";" ssh-dss AA.....

No servidor A

Se você estiver usando uma das guias cron que suporta @rebootentradas, adicione uma entrada como a bkpusers crontab com o comando ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz. Se não permitir, defina-o a qualquer momento - se fossem meus dados, provavelmente o faria diariamente.

Jenny D
fonte
2

Aqui está uma solução completa para fazer backup do servidor B para o servidor A todos os dias às 04:00, usando SSH.

Crie uma conexão SSH automática do servidor B para o servidor A

ssh-keygen -t dsa -b 1024
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p ssh_port root@server_a"

Crie um script de backup no servidor B

nano / root / backup

# !/bin/sh

# Variables loading
HOST="root@server_a"
PORT=22
DIR="/var/backups/server_b"

# Directories creating
ssh -p $PORT $HOST <<EOF
    mkdir -p $DIR/home
    logout
EOF

# Files backing up
rsync -aze "ssh -p $PORT" --delete /home/user $HOST:$DIR/home

chmod 744 / root / backup

Automatize o backup no servidor B

crontab -e

0 4 * * * /root/backup > /dev/null

Para mais detalhes, consulte as páginas Conecte-se ao SSH sem inserir uma senha no Linux e faça backup de um servidor no Debian ou Ubuntu Linux .

Guillaume
fonte
1

Você pode usar o rsync para isso (de maneira inversa):

serverA# rsync -avz user@serverB:/path-to-backup.tar.gz /var/backup

Onde:

-avz  archive, compress and be verbose
guido
fonte
Tenho certeza que -aimplica -r.
Shadur
você está totalmente certo
guido
-1

O cerne da questão é como fazê-lo automaticamente (não é necessário inserir senhas):

  • iniciar uma screenou tmuxsessão
  • executar eval $(ssh-agent)
  • adicione sua chave com ssh-add
  • sinalizadores para rsync export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • faça backup a cada 24 horas com while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

fonte
+1 para o sem senha ssh.
Graeme
Então, eu colocaria tudo isso em um script de inicialização, certo?
PyRulez
11
Eu acho que aqui começa a "questão realmente importante" quanta segurança é necessária? Faça isso com senhas ou sem? Isso só funcionará se você 1) fizer de B, suspender ou hibernar A. Não funcionará se você desligar A. Se você ficar sem senhas, você se tornará uma espécie de "situação de risco".
Não é necessário adicionar RSYNC_SSHpara pesquisar locais padrão das chaves SSH.
Pavel Šimerda
11
Eu sei disso. Você supervisionou também os ...pontos onde pode adicionar argumentos úteis. Você também não leu meu último comentário, onde mencionei a "questão realmente importante", portanto nunca faria isso com chaves sem senha. Você também precisará ativar PubkeyAuthenticatione ninguém disse isso.