玄箱 Debianでrsyncとcronで定期的にバックアップする

ここでの環境は、玄箱とGLAN Tankのそれぞれにsshとrsyncをインストールします。

手動でのバックアップは実現できたのですが、パスワードを入力する必要があり自動化することができません。 そこで、「rsync + cron + ssh (rsyncd を立てない編)」を参考にrsync(ssh)とcronを使ってバックアップを 定期的に取るようにします。

鍵ペアの作成

バックアップ元のPCで鍵ペアを生成します。

# ssh-keygen -t dsa -N "" -f /root/.ssh/rsync
Generating public/private dsa key pair.
Your identification has been saved in /root/.ssh/rsync.
Your public key has been saved in /root/.ssh/rsync.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx root@KURO-BOX

鍵ペア rsync (秘密鍵)、 rsync.pub (公開鍵)が作成されるので、公開鍵をバックアップ先の /root/.ssh/authorized_keys に追加します。

# cd /root/.ssh/
# cat rsync.pub >> authorized_keys

指定したコマンドのみを実行するようにする

このバックアップ方法は、rootアカウントで行うため実行できるコマンドを制限します。

バックアップ先の sshd_config の設定を変更し指定したコマンドのみを実行するようにします。

#PermitRootLogin no
PermitRootLogin forced-commands-only

バックアップ先のrsyncを実行するコマンド

バックアップ先のrsyncはデーモンとして動作していないため、バックアップ先のrsyncが何らかの形で 動作しないといけないようです。そのためのコマンドを知るには、次のようにバックアップ元でrsync を実行します。

# rsync -vv -az -e "ssh -i /root/.ssh/rsync" /mnt/sharep/ \
> root@192.168.xxx.010:/mnt/public/
Password:
opening connection using ssh -i /root/.ssh/rsync -l root 192.168.xxx.010 rsync
 --server -vvulogDtprz . /mnt/public/ 
protocol version mismatch - is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(69)

コマンドを実行すると、上記メッセージが表示され失敗します。この失敗したメッセージにバックアップ先 で実行すべきコマンドが表示されています。

rsync --server -vvulogDtprz . /mnt/public/

このコマンドをバックアップ先の authorized_keys に追加します。

# vi /root/.ssh/authorized_keys
command="rsync --server -vvulogDtprz . /mnt/public/" ssh-dss AAA…

ここまで設定できたら、バックアップができるか確認します。

# rsync -vv -az -e "ssh -i /root/.ssh/rsync" /mnt/sharep/ \
> root@192.168.xxx.010:/mnt/public/

バックアップができていることを確認したら cron で定期的に実行するよう設定します。

私が調べた範囲では、--serverオプションを見つけることができませんでした。

より信頼性を高める(セキュリティ)

rsync + cron + ssh (rsyncd を立てない編)」のページには、 よりセキュリティを高めるために authorized_keys へ設定する内容も紹介されています。

from=""オプションを指定することで、指定したホストからのみ接続するように設定できるようです。

# vi /root/.ssh/authorized_keys
Password:
command="rsync --server -ulogDtprz . /mnt/public/",from="192.168.xxx.001",
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AAA...