Re: rsync over ssh
At Mon, 5 Dec 2011 12:24:23 +0400,
Victor Wagner wrote:
>
> Народ, а посоветуйте как попараноидальнее организовать unattended backup
> по rsync over ssh (на самом деле, rsnapshot, конечно).
>
> Что бы такое написать в /root/.ssh/authorized_keys, чтобы минимизировать
> последствия в случае утечки секретного ключа с той машины, которая
> инициирует бэкап?
>
> Пока что мне пришло в голову только
>
> command="/usr/local/sbin/rsynconly" ssh-dsa ....
>
> где /usr/local/sbin/rsynconly имеет вид
>
> #!/bin/sh
> PATH=""
> export $PATH
> case "$SSH_ORIGINAL_COMMAND" in
> *;*)
> echo "Go away, you yellow earthworm!"
> exit 1;
> ;;
> rsync\ *)
> /usr/bin/$SSH_ORIGINAL_COMMAND
> ;;
> *)
> echo "Go away, you yellow earthworm!"
> exit 1;
> ;;
> esac
>
> Но что-то мою паранойю это не удовлетворяет. Ну во-первых, input
> sanitizing явно недостаточный. Во-вторых, хотелось бы предотвратить не
> только запуск команд, отличных от rsync, но и закачку файлов туда
> посредством rsync.
command="/usr/local/sbin/bind-chroot-rsync --server --sender -logDtprRe.iL --numeric-ids . /",no-port-forwarding,no-X11-forwarding,no-pty
где
zsh% cat /usr/local/sbin/bind-chroot-rsync
#!/bin/sh
rc=0
root=/.bind-for-backups
case "$SSH_ORIGINAL_COMMAND" in
/usr/local/sbin/bind-chroot-rsync\ --server\ --sender\ *)
set -- $SSH_ORIGINAL_COMMAND
shift
;;
*)
echo "Invalid command $SSH_ORIGINAL_COMMAND"
exit 2
;;
esac
[ -d $root ] || /bin/mkdir $root
for d in /; do
if /bin/mount --bind -r $d $root$d; then
umount_dirs="$root$d $umount_dirs"
else
rc=2
fi
done
if [ $rc = 0 ]; then
# all mounts are good - do backup
if /usr/sbin/chroot $root /usr/bin/rsync "$@"; then
:
else
rc=$?
fi
fi
for d in $umount_dirs; do
/bin/umount $d
urc=$?
[ $rc = 0 ] && rc=$urc
done
exit $rc
Однажды, года два назад, при смене версии rsync пришлось поменять параметры
запуска.
--
The last good thing written in C was Franz Schubert's Symphony number 9.
-- Erwin Dieterich
Reply to: