Мне нужно автоматически зеркалировать большое количество (терабайт) файлов на двух машинах unix по медленному каналу (1 Мбит / с). Это нужно делать часто, но данные не меняются слишком сильно (дельта-передача не насыщает канал).
Обычное решение было бы rsync
, но есть дополнительное требование: с точки зрения безопасности нежелательно, чтобы исходная или конечная машины имели (без ключа) ssh-ключи друг к другу или какой-либо доступ к файловой системе. Таким образом, вся связь между двумя машинами должна быть инициализирована (и опосредована) через третью машину.
Я задал отдельный вопрос о rsync в частности Вот. Есть ли другие очевидные решения, которые мне не хватает?
Не совсем то, о чем вы спрашиваете. Но на всякий случай ...
Вы можете легко разрешить конкретному ключу ssh запускать только определенные команды на удаленном компьютере (это похоже на то, как gitosis и gitolite и, возможно, любой другой безопасный git-over-ssh работают). Короче говоря, добавьте эти параметры к конечным пользователям authorized_keys
файл:
command="/path/to/validation/script"
no-port-forwarding
no-X11-forwarding
no-agent-forwarding
no-pty
В итоге файл должен выглядеть так:
command="/path/to/validation/script",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2E.....
В no-*
варианты говорят сами за себя.
В command=
опция запускает «принудительную» команду, «игнорируя любую команду, предоставленную клиентом». Команда, изначально предоставленная клиентом, доступна в SSH_ORIGINAL_COMMAND
переменная окружения "(цитируется из sshd
страницу руководства). Другими словами, когда кто-то входит в систему с этим ключом, единственная команда, которая будет запущена, - это сценарий проверки. Вам решать, разрешить им запускать это или нет. Итак, ваш сценарий проверки может делать что-то вроде:
#!/bin/bash
if [[ $SSH_ORIGINAL_COMMAND == rsync --server -vtr --delete /source/path/ /destination/path/ ]]; then
$SSH_ORIGINAL_COMMAND
end
И из-за другого no-
варианты, этот ключ не позволяет делать что-либо еще слишком вредное.
Обновить: Eсть готовый сценарий что немного упрощает эту конфигурацию. - Микко
Я думаю, что ваша самая большая потребность - передать только дельту, поэтому, если вы не хотите компрометации / накладных расходов безопасности, я подозреваю, что для этого вам придется сохранить третью копию.
Я делал это (без дельты!):
dir=`mktemp -d` && cd $dir \
&& rsync -avz user1@host1:~/source . \
&& rsync -avz . user2@host2:~/dest \
&& rm -rvf $dir
Вам понадобится
rsync -avz user1@host1:~/source mirror \
&& rsync -avz mirror user2@host2:~/dest \
И возможно захотите --delete
слишком