rsync でネットワーク越しに差分でミラーリングする

自分が契約している VPS のデータを定期的にデータのミラーを差分でローカルサーバに取るように設定した際のメモです。

■前提

VPS 側は固定 IPv4 / IPv6 アドレスをもつ。
ローカルサーバ側は動的 IPv4 / 固定 IPv6 をもつ。

上記から、

  • rsync + ssh を使用する
  • 双方とも固定のアドレスを持っている IPv6 経由を使用する
  • 常に起動している保証が無いローカル側から VPS 側のデータを取りに行く

と言う方法が一番安全と考えました。

なお、ミラーリングなので、VPS 側で無くなったファイルは、ローカルサーバ側でも無くなります。これを防ぐために、ローカルサーバ側は、ミラーリングされるディレクトリについても複数世代バックアップを別媒体に取得しています。

■ネットワーク環境

・VPS
Static IPv4 Address: aaa.bbb.ccc.ddd
Static IPv6 Address: 2002:xxxx:zzzz::1
FQDN : www.example.com

・ローカルサーバ
Dynamic IPv4 Address : www.xxx.yyy.zzz
Static IPv4 Address : 2001:xxxx:yyyy::1

■仕様

VPS の /etc と /home をローカルサーバの /backups ディレクトリにミーラーリングを取るようにします。また、接続開始はローカルサーバから行います。

■方法

・ローカルサーバ

root になります。
次に、ssh のキーペアを作成します。

# ssh-keygen -b 2048 -t rsa -N "" -f /root/.ssh/rsync-backups

/root/.ssh/rsync-backups.pub という公開鍵が出来ているので、これを VPS 側に何らかの方法で転送します。

・VPS

ローカルサーバから転送してきた公開鍵に安全のため、接続元を限定するため、下記の内容を先頭に追加します。

from="2001:xxxx:yyyy::1"

※実際の公開鍵の内容としては「from="2001:xxxx:yyyy::1" ssh-rsa xxxxxx…」となります。

この公開鍵を「/root/.ssh/authorized_keys」に追加します。
※なおこのファイルの所有権は root:root で、アクセス権は 600 にしておくべきです。

/etc/ssh/sshd_config について「PermitRootLogin without-password」とします。さらに sshd を再起動します。

・ローカルサーバ

ローカルサーバ側で root になり、以下のコマンドでパスワード不要で VPS 側に root でログインできることを確認します。

# ssh -6 -i ~/.ssh/rsync-backups root@www.example.com

ログイン確認できたら、VPS からログアウトします。

ミラーリング先のディレクトリを作成します。今回はローカルサーバの /backups 以下に取ることにします。

# mkdir /backups

ここまで出来たら、実際にどういう動作をするか、ファイル転送をせずに確認だけ行います。

# rsync -nvaz --delete --force -e "ssh -6 -i /root/.ssh/rsync-backups" \
root@www.example.com:/etc \
root@www.example.com:/home \
/backups/

問題が無ければ、実際に転送してみます。

# rsync -vaz --delete --force -e "ssh -6 -i /root/.ssh/rsync-backups" \
root@www.example.com:/etc \
root@www.example.com:/home \
/backups/

上手く転送できていれば OK です。あとは、cron で定期的に実行するなりすると良いと思います。

■さらにセキュリティを高めるために

rsync を実行中に VPS 側で ps コマンドなどで rsync がどのように実行されているのかを確認します。
この内容を、公開鍵に「command」を追加してあげて、/etc/ssh/sshd_config では「PermitRootLogin forced-commands-only」として、sshd を再起動してあげるとさらに安全になると思います。