rsync over ssh を使ってバックアップ

DATやDLTでサーバーのバックアップを取ってきたが、せいぜい持って2年位なもので、
ドライブが長持ちした試しがない。使い方が悪いのか、環境が悪いのか、それともこういうものなのか?
つーことで、テープは捨てて重要なデータは別マシンのHDDへミラーしておくことにした。

やりたいこと

  • 2台のPC UNIX間(FreeBSD, Linux)で、一方のマシンからもう一方のマシンへ指定したディレクトリ群をコピーする。
    この時、root権限でしか読めないファイルもコピーする。
  • セキュリティ上、一応sshの上でrsyncを使う。
  • cronで毎晩自動的にまわす。

rsyncって?

  • リモートホストへファイルをコピーするrcpみたいなものだが、ずっと高機能らしい。
  • 今どきのPC UNIXには大抵入っているらしい。
  • 入ってない時は、ここから取ってきてインストールする。
  • 詳しくはぐぐる

sshって?

  • Secure Shell
  • 今どきのPC UNIXには必ず入っている。
  • リモートアクセスのためのプロトコルで、通信の内容(データ)が暗号化される。
  • 詳しくはぐぐる

設定してみる

参考(というか、書かれていることをそのまま実行)にしたサイト

 
次の手順で。
  1. 「コピー元」のマシンから「コピー先」のマシンへroot権限で自動的にログインできるように「コピー元」のマシンで秘密鍵と公開鍵のセットを作成する。
  2. 「コピー先」のマシンへ作成した公開鍵をインストールする。
  3. 「コピー先」のマシンでsshd関連の設定を変更し、特定のコマンドのみがroot権限でリモート実行できるようにする。
  4. テスト
  5. 最終設定、cronに登録する。

1. 秘密鍵、公開鍵作成

鍵のペアは「コピー元」マシン上で ssh-keygen コマンドにより作成する。

  • 「Enter file in which to save the key」では適宜キー名を指定する。
  • 「Enter passphrase (empty for no passphrase)」では、パスフレーズを空にしたいので
    言われたとおり何も入力せずにEnterを押す。
src# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): /root/.ssh/rsync
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
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@src.hoge.com

この例の場合、/root/.ssh に 秘密鍵「rsync」と公開鍵「rsync.pub」が生成される。

2. 公開鍵を「コピー先」マシンへインストールする。

今回は「コピー先」マシンでもrootアカウントを使う。
よって、「コピー元」マシンで作成した公開鍵を「コピー先」マシンのrootが持っている公開鍵群に追加する。

  • 「コピー元」で作成した公開鍵(/root/.ssh/rsync.pub)を「コピー先」の/root/.ssh/authorized_keys に追加する。
    既にauthorized_keysが存在している場合は、追記すること。上書きしてしまうと、既存の公開鍵が失われるので注意。
    例えばコピー元から公開鍵ファイルをコピー先に持って行き、次のように追記しておく。
    dest# cat rsync.pub >> /root/.ssh/authorized_keys

3. sshd関連の設定、authorized_keys の修正

「コピー先」マシンにて sshd の設定を変更し root アカウントでsshログインを許可する。ただし、特定のコマンドのみ実行可能なように制限する。また、「コピー先」マシンの/root/.ssh/authorized_keys にcommandオプションを追加して、実行するコマンドを設定する。

  • /etc/ssh/sshd_config(関係ありそうなディレクティブのみ)
    PermitRootLogin forced-commands-only
    PubkeyAuthentication yes
    AuthorizedKeysFile      .ssh/authorized_keys
  • /root/.ssh/authorized_keys(commandオプションを追加)
    試しにlsコマンドが実行されるようにしておく。
    command="/bin/ls" ssh-dss AAAA....
    ....
    .... root@src.hoge.com

4. テスト

「コピー元」マシンから「コピー先」マシンに接続してテストしてみる。

src# ssh -i /root/.ssh/rsync root@dest.hoge.com
Desktop  anaconda-ks.cfg  install.log  install.log.syslog
Connection to dest.hoge.com closed.
src#

分かりにくいが、「Desktop anaconda-ks.cfg...」という行は、リモートマシンのlsの結果である。

5. 最終設定、cron登録

リモートからコマンド実行の確認ができたら、rsyncのコマンドラインを設定する。
オプションの意味はrsyncのmanページなどを参照すること。

  • コピー元で実行するrsyncコマンド例
    /usr/local/bin/rsync -az --delete -e "/usr/bin/ssh -i /root/.ssh/rsync" /etc/ root@dest.hoge.com:/var/BAK/etc/
    この例の場合、dest.hoge.comという「コピー先」マシンの/var/BAK/etc ディレクトリに「コピー元」の/etcの内容をミラーリングする。
  • コピー先マシンのauthorized_keysの例 上記のrsyncコマンドを実行するために必要な「コピー先」マシンの/root/.ssh/authorized_keys の内容は次のようになる。
    command="rsync --server --delete -logDtprz . /var/BAK/etc/" ssh-dss  AAAA....
    ....
    .... root@src.hoge.com
    command="" に記述する内容は「コピー元」マシン上で -vvオプションを付加してrsyncを実行すると得られる結果を参考にする。
    src# rsync -az -vv --delete -e "ssh -i /root/.ssh/rsync" /etc/ root@dest.hoge.com:/var/BAK/etc/
    opening connection using ssh -i /root/.ssh/rsync dest.hoge.com -l root rsync --server -vvlogDtprz --delete . /var/BAK/etc/
    ....
    ....
    2行目の「opening connection....」で始まる行にあるrsyncコマンドのオプションから-vvを除いたものをそのままauthorized_keysのcommand=""に指定していることがわかる。
  • コピー先マシンの/root/.ssh/authorized_keys にcommand=""オプションを追加し、コピー元マシンで例のようなrsyncコマンドを実行して正しくコピーされることを確認したら、そのコマンドラインをコピー元マシンのrootのcronに登録すればよい。

6. 複数のディレクトリを個別にバックアップするには?

例えば、「コピー元」の/etc/*は「コピー先」の/var/BAK/etc/*へ、/home/* は /var/BAK/home/* へバックアップしたい場合はどうするか?
私の場合は、/etcのバックアップ用、/homeのバックアップ用として個別に2つのキーペアを生成し、コピー先のauthorized_keysへ追加している。

command="rsync --server --delete -logDtprz . /var/BAK/etc/" ssh-dss  AAAA....
....
.... root@src.hoge.com
command="rsync --server --delete -logDtprz . /var/BAK/home/" ssh-dss  AAAA....
....
.... root@src.hoge.com

そして、コピー元では単純に次のようなバッチを実行している。

#!/bin/sh
## /etc/*
/usr/local/bin/rsync -az --delete -e "/usr/bin/ssh -i /root/.ssh/rsync_etc" /etc/ root@dest.hoge.com:/var/BAK/etc/

## /home/*
/usr/local/bin/rsync -az --delete -e "/usr/bin/ssh -i /root/.ssh/rsync_home" /home/ root@dest.hoge.com:/var/BAK/home/

他にもっと単純な方法がありそうな悪寒...。


  • いいいい -- ああああ? 2005-05-13 18:45:11 (金)
  • 2. 公開鍵を「コピー先」マシンへインストールする。のところ、 ファイルrsyncは秘密鍵では? -- 通りすがり? 2006-09-17 09:13:00 (日)
  • すみません、その通りです。 -- charly? 2006-09-20 22:14:11 (水)


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-05 (月) 17:34:21 (1270d)