QA@IT

CentOSサーバをrsyncで丸ごとバックアップ

3973 PV

会社で、使用中のサーバ(CentOS5.5)に対してのバックアップサーバを立てることを頼まれました。
当初、

  • 新しく「CentOS5.5でバックアップサーバ」を立てて、xinet.dからrsyncdが起動できるようにする
  • 「今使用中のサーバ」で、--password-file指定させたrsyncコマンドをcronに追加 (http://unixlife.jp/linux/centos-5/rsyncd.html この辺りを参考にさせていただきました)

したのですが、構築後「これじゃない」とダメ出しが入りました。

幾つか条件が難しそうなので、済みませんがお知恵をお借りできませんでしょうか。
##指定された条件について:

  • 「使用中のサーバ(CentOS5.5)が対象」

  • 「丸ごとバックアップ、cronで定時動作」

  • 「IPを付け替えれば、障害時もすぐに使用できるようにすること。数世代分圧縮して保存もする」

  • 「使用するのはrsync。scp等ではない」

  • 「"バックアップサーバ側"でrsyncコマンドを実行すること」

  • 「秘密鍵は使用しない。代わりに、パスワードを保存したファイルを作成する」

  • 「-e sshを指定する」
    (今は退職した前担当者が、こういう風にやっていたそうです)

依頼者が見た、というサーバがないため、現物がなくて済みません。
アドバイスいただけたら幸いです。

  • rsync に転送先を圧縮する機能はないし、パスワードファイル使うくらいだったら秘密鍵をパスフレーズなしで保存して公開鍵認証にしたほうが簡単だし、rsync は転送元だけでなく転送先でも起動する必要があるし(最初の起動という意味?)、と突っ込みどころが沢山あります。各要件(条件)が何故必要なのか、自明な項目以外は依頼者に聞くべきだと思います。 -
  • 要件に合うかわからないけど、これが参考になるかもしれません。 http://qa.atmarkit.co.jp/q/2077 -
  • 有難うございました。拝見します。
    (条件については「この会社の流儀」とのことで、理由は無いような雰囲気です。)
    -

回答

どこまでのことの質問なのか判らないので、rsync のことだけ回答します。

-e sshを指定する」ということは、rsync over ssh か rsync daemon over ssh なので、xinetd で rsync デーモンを立てる必要はありません。rsync デーモンは rsync コマンドの実行時に ssh 経由で勝手に起動します。

以下の通りで説明します。

  • バックアップ対象サーバを A
  • バックアップサーバを B
  • A の中のバックアップするディレクトリを /path/to/src/
  • B の中のバックアップ先ディレクトリを /path/to/dst/ とします。
  • A の中のバックアップに使用するアカウントを backup-user とします。

rsync over ssh

B で次のように実行します。

rsync -aL -e ssh --delete backup-user@A:/path/to/src/ /path/to/dst/

rsync daemon over ssh

A の backup-user アカウントのホームディレクトリに下記のようにファイルを作成しておきます。

rsyncd.conf

[backup]
use chroot = no
path = /path/to/src/
read only = yes

B で次のように実行します。

rsync -aL -e ssh --delete backup-user@A::backup/ /path/to/dst/

どちらの方法もコマンドの実行時に(公開鍵認証しないなら)A の backup-user のパスワードを聞かれるので except でパスワードの入力を自動化する必要があります。

cron で実行する場合 rsync や ssh のパスは絶対パスにしておく必要があります。

公開鍵認証と rsync のパスワード認証を併用

A の backup-user アカウントのホームディレクトリに下記のようにファイルを作成しておきます。

rsyncd.conf

[backup]
use chroot = no
path = /path/to/src/
read only = yes
auth users = backup-user
secrets file = /home/backup-user/rsyncd.pass

rsyncd.pass

backup-user:hogehoge

rsyncd.pass はパーミッションを 600 にしておく必要があります。

chmod 600 rsyncd.pass

A の backup-user アカウントの .ssh/authorized_keys に下記のように追記します。

command="rsync --server --daemon .",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ~公開鍵~

B のバックアップを実行するアカウントで、パスワードファイルを作成します。

echo hogehoge > .rsync-pass
chmod 600 .rsync-pass

B のスクリプトを実行するアカウントで下記の通りに .ssh/config を作ります。

Host A
  IdentityFile 秘密鍵のパス

B で次のように rsync を実行します。

rsync -avn backup-user@A::backup/ -e ssh --password-file=.rsync-pass

簡単に解説すると・・・

  • 公開鍵認証で B から A にログイン
  • authorized_keys の指定により A で実行出来るコマンドは rsync --server --daemon . のみに限定される
  • SSH のセッションをトランスポート層として A で起動した rsync デーモンと B の rsync コマンドが接続される
  • A から rsyncd.conf の指定どおりにパスワードが要求される
  • rsync コマンドの --password-file の指定の通りパスワードが提供される
編集 履歴 (1)
  • 有難うございました。解決しそうです。
    もし宜しければ、一点確認させて下さい。
    >(公開鍵認証しないなら)A の backup-user のパスワードを聞かれるので
    「-e ssh」指定の場合は「パスワード」「鍵認証」のどちらかが必要、という理解で宜しいでしょうか?
    (前担当者は「rsync.confで指定した.rsync-passで動作させていた」らしいのですが、これは出来ないですよね?)
    -
  • 「-e ssh」の場合 ssh で対象サーバへログインするので、何らかの方法で認証する必要があります。認証方法は幾つかありますが、普通は「パスワード認証」か「公開鍵認証」です。 -
  • 「rsync.conf」も「.rsync-pass」も私は聞いたことがないので、その前任者が自分で作成したスクリプトからそれらのファイルを参照してパスワード認証をさせていたのでは無いでしょうか? -
  • パスフレーズ無しの公開鍵認証と、rsync のパスワード認証を併用するという方法だったのかもしれません(余り意味無さそな気もしますが)。 -
  • 公開鍵認証と rsync のパスワード認証を併用する方法を追記しました。今思いついたことなので私自信きちんと試したことはありませんが、わりと便利そうです。 -
  • 有難うございました。
    これで随分進みます。お陰さまで解決しそうです。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。