Securely copying with escalated privileges with rsync
Recently I had to migrate some files from one machine to another. As usual, rsync was the first tool I reached for, but a few considerations complicated matters: 1. both the source and destination locations required escalated privileges to access 2. remote root logins were not allowed on either machine, ruling out sudo rsync $path root@$dest 3. passwordless sudo was not allowed on either machine, ruling out sudo rsync --rsync-path='sudo rsync'.
Consequently, the solution here is to use rsync’s daemon mode. However, it’s obviously undesireable to start a privileged rsync daemon on the open internet. For this reason, we run the rsync daemon over an ssh tunnel. Here is how,
- on the destination:
ssh -L 9000:127.0.0.1:9000 \$src_host - on the source: create an
rsyncd.conf,
$ cat >rsyncd.conf <<EOF
use chroot = false
port = 9000
[src]
path = $src_path
uid = $user
gid = $group
EOF
- on the source:
sudo rsync --daemon --config=rsyncd.conf --no-detach - on the destination:
sudo rsync -a --info=progress2 rsync://127.0.0.1:9000:\$src_path \$dest_path