ミラーリング(rsync)


遠隔地にあるサーバ一部と私のサーバ間でミラーリングする必要が出てきました。
同期は、1日に1回行えばよく特に時間の指定もありません。
ただし、データの転送は暗号化されている必要があります。
1.5ヶ月程度の暫定処置ですが、毎日手動でコピーするのも芸がありません。
自動で、サーバ間の同期が取られるように設定します。

これらの条件を満たすシステム構成として、下記組み合わせを使います。
ssh+rsync+cron

ssh関連の設定


sshでの認証方法は下記の3つがあります
  1. パスワード認証
    PasswordAuthentication (SSH1, SSH2)
  2. 公開鍵認証
    PubkeyAuthentication (SSH2)
    RSAAuthentication (SSH1)
  3. ホストベース認証
    HostbasedAuthentication (SSH2)
    RhostsRSAAuthentication (SSH1)

パスワード認証は、自動化の観点から不向きです。
(パスワード入力待ち状態になられると困る)

パスフレーズを使用しない「公開鍵認証」か「ホストベース認証」のどちらかを選択します。
筆者は、パスフレーズを使用しない「公開鍵認証」方式で実施することにしました。
例によって、これと言った根拠のない選択ですJ
(信頼される2者間のミラーリングであれば「ホストベース認証」の方が、好ましいのかも知れません)

root の ssh ログインでは、/root/.ssh/authorized_keys の command="〜〜" オプションに指定されたコマンドを実行させることができます。
ミラー化には、この機能を使います。

ミラー先(ヨッパサーバ)の設定を下記のようにして、rootのコマンドログインを許可します。
<変更ファイル:/etc/ssh/sshd_config>
変更前 変更後
PermitRootLogin no PermitRootLogin forced-commands-only

鍵の作成


ssh-keygen を使いパスフレーズを使用しない鍵を作成します
この操作はミラー元で行っています。
# ssh-keygen -t dsa -N "" -f /root/.ssh/key_Private
Generating public/private dsa key pair.
Your identification has been saved in /root/.ssh/key_Private.←秘密鍵ファイルができる(パーミッションを600にする)
Your public key has been saved in /root/.ssh/key_Private.pub.←公開鍵ファイルができる
The key fingerprint is:
9f:d5:c8:58:76:22:cb:9e:8d:d8:8d:d8:4a:38:49:8b root@xxxxx

/root/.ssh/key_Private.pub(ミラー元) を /root/.ssh/authorized_keys と名前を変えてミラー先(ヨッパサーバ)にコピーします。

このときに、下記のように先頭に commandオプションを記述しておきます。
command="rsync --server -logDtprz . /home/mirror/" ssh-dss AAAAB3NzaC1kc3MAAACBAJZCZKH〜〜〜〜〜

このように記述したファイルを /root/.ssh/authorized_keys に設置することで、root が ssh でログインしたとき、command を実行します。

rsyncオプションの意味


rsync のオプションに --server -ulogDtprz を指定していますが、どのようにして決めたのでしょうか?
これは、実際に rsync を詳細情報表示(パラメータ:vv)で実行させて、パラメータを確認しました。

<実行画面>
# rsync -vv -az -e "ssh -i /root/.ssh/key_Private.ppk" /home/mirror/ root@alk.dip.jp:/home/mirror/
opening connection using ssh -i /root/.ssh/key_Private.ppk -l root alk.dip.jp rsync --server -vvlogDtprz . /home/mirror/
The authenticity of host 'alk.dip.jp (219.122.218.99)' can't be established.
RSA key fingerprint is 9c:73:07:36:49:52:a9:26:1f:e1:22:1c:1f:09:f8:31.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
上記の赤文字が、ミラー先(ヨッパサーバ)で実行されたコマンドです。
(実行されるコマンドを見たいだけなので、rsync は失敗させています)
実際の運営では、詳細情報表示は必要がありません。
vv のパラメータを外したコマンドを command パラメータとして authorized_keys に記述しました。


使用オプション 意 味
-v 詳細情報の表示
-l ソフトリンクを維持する
-o オーナーを維持する (root のみ)
-g グループを維持する
-D デバイスを維持する (root のみ)
-t タイムスタンプを維持する
-p パーミッションを維持する
-r ディレクトリで再帰的に実行する
-z 受信ファイルを圧縮

詳細な意味については、マニュアルを参照してください。

ミラー化


ミラー先(ヨッパサーバ)の準備が終了したので、実際にミラー化を実行します。

<ミラー元での実行>
# rsync -vv -az -e "ssh -i /root/.ssh/key_Private" /home/mirror/ root@alk.dip.jp:/home/mirror/
opening connection using ssh -i /root/.ssh/key_Private -l root alk.dip.jp rsync --server -vvlogDtprz . /home/mirror/
The authenticity of host 'alk.dip.jp (219.122.218.99)' can't be established.
RSA key fingerprint is 9c:73:07:36:49:52:a9:26:1f:e1:22:1c:1f:09:f8:31.
Are you sure you want to continue connecting (yes/no)? yes ←相手先が初めての接続の為、確認待ちになる。2回目以降は聞かれない
Warning: Permanently added 'alk.dip.jp,219.122.218.99' (RSA) to the list of known hosts.
building file list ...
expand file_list to 4000 bytes, did move
done
ここからファイルのコピーが始まる
   :

   :
   :
total: matches=0 tag_hits=0 false_alarms=0 data=3254356
wrote 1745471 bytes read 852 bytes 151854.17 bytes/sec
total size is 3254356 speedup is 1.86
#ミラー化終了

cronへの登録


# crontab -e ←cronへの登録
<登録内容>
0 4 * * * /usr/bin/rsync -az -e "ssh -i /root/.ssh/key_Private" /home/mirror/ root@alk.dip.jp:/home/mirror/

これで毎朝4時に、サーバー間の同期がとられます。