Como transferir arquivos grandes entre dois controles remotos usando uma terceira máquina?

1

Eu preciso espelhar automaticamente uma grande quantidade (terabytes) de arquivos em duas máquinas unix em um link lento (1 Mbps). Isso precisa ser feito com freqüência, mas os dados não mudam muito (a transmissão delta não satura o link).

A solução usual seria rsync , mas há um requisito adicional: É indesejável, do ponto de vista da segurança, que as máquinas de origem ou de destino tenham chaves ssh (sem chave) umas nas outras, ou qualquer tipo de acesso ao sistema de arquivos. Toda a comunicação entre as duas máquinas deve ser inicializada (e mediada) através de uma terceira máquina.

Eu fiz uma pergunta separada sobre o rsync em particular aqui . Existem outras soluções óbvias que estão faltando?

    
por goncalopp 18.11.2012 / 02:31

2 respostas

3

Não é exatamente o que você está perguntando. Mas apenas no caso ...

Você pode autorizar facilmente uma chave ssh específica para ter permissão apenas para executar determinados comandos na máquina remota (isso é semelhante a como gitosis e gitolite e possivelmente qualquer outra implementação segura git-over-ssh trabalhos). Resumindo, adicione essas opções ao arquivo authorized_keys dos usuários de destino:

  • command="/path/to/validation/script"
  • no-port-forwarding
  • no-X11-forwarding
  • no-agent-forwarding
  • no-pty

O arquivo deve ficar assim no final:

command="/path/to/validation/script",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2E.....

As opções no-* são auto-explicativas.

A opção command= executa um comando "forçado" "ignorando qualquer comando fornecido pelo cliente". O comando originalmente fornecido pelo cliente está disponível na variável de ambiente SSH_ORIGINAL_COMMAND "(um pouco citado da página sshd man). Em outras palavras, quando alguém efetua login com essa chave, o único comando que será executado é a validação script. Cabe a você permitir que eles o executem ou não. Assim, seu script de validação pode fazer algo como:

#!/bin/bash
if [[ $SSH_ORIGINAL_COMMAND == rsync --server -vtr --delete /source/path/ /destination/path/ ]]; then
     $SSH_ORIGINAL_COMMAND
end

E, devido às outras opções de no- , essa chave não pode fazer nada muito prejudicial.

Atualização: Existe um script pronto que simplifica um pouco essa configuração. - Mikko

    
por 18.11.2012 / 05:43
0

Acho que sua maior necessidade é transferir apenas o delta e, se você não quiser o comprometimento / sobrecarga de segurança, suspeito que terá que manter uma terceira cópia para fazer isso.

Eu tenho feito isso (sem delta!):

dir='mktemp -d' && cd $dir \
&& rsync -avz user1@host1:~/source . \
&& rsync -avz . user2@host2:~/dest \
&& rm -rvf $dir

Você precisaria

rsync -avz user1@host1:~/source mirror \
&& rsync -avz mirror user2@host2:~/dest \

E possivelmente queira --delete também

    
por 25.07.2014 / 01:46