rsyncのインストールと設定


rsyncはrcpコマンドと同様にリモート環境でファイルのコピーを行うためのコマンドです.rsyncの特徴は更新の必要のあるファイルだけをコピーしたり,送信データを圧縮して更新にかかる時間を短縮することができることです.また,rcpよりもセキュリティ面でも優れており,SSLを使うことで通信を暗号化したり,SSHのRSA認証を使うことでID+パスワードを使わずに安全な認証を行うことができます.
今回はSSHを使ったrsyncの設定方法を紹介します.
RedHat Linuxなどのディストリビューションパッケージではrsyncはパッケージ管理コマンド(rpmなど)でインストールできますので、インストール自体に困ることは特にないと思います.RPMパッケージなどでインストールされる場合は設定の項目からご覧下さい.

1. ダウンロード


ソースコードをダウンロードし,コンパイルする場合には,以下の4つのソースが必要です.zlibやopensslにはセキュリティホールが見つかっていますので,古いパッケージをお使いであれば,最新版にアップデートされることを強くお勧めします.

1.1 zlibのダウンロード

以下のURLからダウンロードできます.
http://www.gzip.org/zlib/

1.2 opensslのダウンロード

以下のURLからダウンロードできます.
http://www.openssl.org/

1.3 opensshのダウンロード

以下のURLからダウンロードできます.
http://www.openssh.com/

1.4 rsyncのダウンロード

以下のURLからダウンロードできます.
http://rsync.samba.org/

2. コンパイル・インストール


2.1 zlibのコンパイル・インストール

ダウンロードしたファイルを適当なディレクトリで展開し,configure + make + make installでインストールします.

# cd /usr/local/src
# tar -zxvf /tmp/zlib-1.1.4.tar.gz
# cd zlib-1.1.4
# ./configure --prefix=/usr --shared
# make
# make install

2.2 opensslのコンパイル・インストール

ダウンロードしたファイルを適当なディレクトリで展開し,configure + make + make installでインストールします.
# cd /usr/local/src
# tar -zxvf /tmp/openssl-0.9.6g.tar.gz
# cd openssl-0.9.6g
# ./config --prefix=/usr shared
# make
# makeinstall

2.3 opensshのコンパイル・インストール

openssh用のアカウントとグループを作成します.その後,ダウンロードしたファイルを適当なディレクトリで展開し,configure + make + make installでインストールします.
# mkdir /etc/ssh
# mkdir /var/empty
# chown root.sys /var/empty
# chmod 755 /var/empty
# groupadd sshd
# useradd -g sshd -c 'sshd privsep' -d /var/empty -s /bin/false sshd
# cd /usr/local/src
# tar -zxvf /tmp/openssh-3.5p1.tar.gz
# cd openssh-3.5p1
# LIBS=-lcrypt ./configure --prefix=/usr --sysconfdir=/etc/ssh
# make
# make install

2.4 rsyncのインストール

ダウンロードしたファイルを適当なディレクトリで展開し,configure + make + make installでインストールします.
# cd /usr/local/src
# tar -zxvf /tmp/rsync-2.5.5.tar.gz
# cd rsync-2.5.5
# ./configure
# make
# make install

3. 設定


3.1 opensshの設定

まず,サーバ側とクライアント側の両方で,"ssh-keygen"コマンドを使って,RSA認証の秘密鍵と公開鍵を作成します.デフォルトの設定では,これら鍵はユーザのホームディレクトリの下の".ssh"というディレクトリ下に作成されます.公開鍵は"identity.pub"というファイルに作成されますので,"authorized_keys"というファイル名でコピーを作成しておきます.
# su -l postgres
$ ssh-keygen -t rsa1
$ cd .ssh
$ cp identity.pub authorized_keys

次にサーバ側のSSHサーバの設定ファイルを編集します."rsync"コマンドを使ってパスワードを入力せず,RSA認証だけでファイルのコピーを行いたいので,"/etc/ssh/sshd_config"ファイルに以下の設定値を設定します.
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#RhostsRSAAuthentication no
#PasswordAuthentication yes

最後にサーバの".ssh/authorized_keys"ファイルに,ログインを許可したいクライアントの公開鍵を追加登録します.この時,エディタなどでサーバとクライアントの公開鍵ファイルを開き,カット&ペーストでサーバの公開鍵ファイルにクライアントの公開鍵を貼り付けて追加登録しないようにしてください.エディタでのカット&ペーストでは,ウィンドウ上で表示のために折り返している個所に改行コードが入ってしまい,見た目は正しく公開鍵が登録されているように見えるのに,どうしてもログインできないという状態になります.クライアントの公開鍵の登録は面倒でもファイル転送で行ってください.
(クライアントの公開鍵ファイルを".ssh/client.pub"にFTPで取ってあるものとします)
$ cd .ssh
$ cat client.pub >> authorized_keys
sshdのデーモン起動のスクリプトはソースのcontribの下に色々と用意されています.例えばRedHatの場合は以下の要領で起動スクリプトをコピーして使うことができます.
# cp /usr/local/src/openssh-3.5p1/contrib/redhat/sshd.init /etc/rc.d/init.d/sshd

4. テスト


以上の設定で実際に"rsync"を使ってファイルを取得できるか確認します.
"master"サーバの/usr/local/pgsql/dataディレクトリ下のファイルを全て/usr/local/pgsqlディレクトリにコピーしてみます.
# su -l postgres
$ rsync -auzr -e "ssh -1" dual:/usr/local/pgsql/data /usr/local/pgsql

最初の一回目だけはサーバを登録するか聞いてきますので,"yes"と答えておくと,次からは聞かれずにファイルコピーが実行されます.
rsyncコマンドで指定できる形式やオプションは沢山あります.詳細はmanコマンドで確認してください.上記の例で使用した形式とオプションの意味は以下の通りです.
形式
---------------------------------------------------------------------------
  rsync [OPTION]... [[USER@]HOST:]SRC DEST
---------------------------------------------------------------------------
オプション
---------------------------------------------------------------------------
SRC
  転送元ファイル、ディレクトリ
DEST
  転送先ファイル、ディレクトリ
-a archive
  ファイルの情報を保ち転送
-u update
  コピー先が新しいファイルは更新しない
-v verbose
  情報を表示しながら実行
-z compress with zlib
  圧縮して転送
-r recursive
  ディレクトリ内のファイルを再帰的に転送
--delete
  転送元に存在しないファイルは削除
-e ファイル転送に使用するコマンド
  ("ssh -1"はファイル転送はSSHを使い,プロトコルはRSA1を使用する,という意味)