Command disabled: index


̃Gg[͂ĂȃubN}[Nɒlj

Unix :: rsync / root ユーザーで rsync するときにセキュリティーを確保する



異なるサーバー間でデータの同期(バックアップ)をとる。
その際、root ユーザーで rsync を行うが、できる限りセキュリティーを高めたい。

具体的には、

  1. データの同期元(バックアップ元)の root ユーザーは公開鍵認証でなければ rsync させない
  2. その root ユーザーは、rsync 以外のコマンドを発行できなくする(※ su で root になった場合はすべてのコマンドを発行できます)
  3. その rsync は、指定した IP アドレスからのアクセス(rsync)のみ許可する

という設定を行います。


今回は例として、
サーバーA<SRC>のディレクトリ「/aaa/bbb/ccc」を、サーバーB<DEST>の「/xxx/yyy/zzz/」配下に同期(バックアップ)します。
同期が完了すると、サーバーB<DEST>に「/xxx/yyy/zzz/ccc」として「ccc」ディレクトリとその中身のデータが保存されることになります。
下記は略式図となります。

rsync 略式図


サーバーB<DEST>からサーバーA<SRC>に対して、データを取りに行くイメージです。


なお、設定作業の流れですが、以下の4段階に別れます。
サーバー A と B を行ったり来たりしますのでご注意ください。

1. サーバーA<SRC>の設定①

2. サーバーB<DEST>の設定

3. サーバーA<SRC>の設定②

4. サーバーB<DEST>で確認


これ以降は、サーバー A , B ともに、root ユーザーになって作業する前提です。


1. サーバーA<SRC>の設定①

1.1. root ユーザーは公開鍵認証でなければ rsync(sshログイン)させない設定

(パスワード認証を拒否する設定)

# vi /etc/ssh/sshd_config

  :

PermitRootLogin without-password

  :
  • sshd_config を修正したら、sshd の設定を再読込する
# /etc/init.d/sshd reload


1.2. 指定したIPアドレスからのアクセス(rsync)のみ許可する

root ユーザーの authorized_keys を開き、公開鍵の先頭に from= の項目を追加します。

# vi /root/.ssh/authorized_keys

from="xxx.xxx.xxx.xxx" ssh-rsa AAA..........
from=“xxx.xxx.xxx.xxx”

xxx.xxx.xxx.xxx の部分は、サーバーB<DEST>の IP アドレスを指定します


2. サーバーB<DEST>の設定

2.1. 同期元(バックアップ元)サーバーのエイリアスを登録

# vi /root/.ssh/config

Host SRC_HOST
    HostName yyy.yyy.yyy.yyy
    user root
    IdentityFile /root/.ssh/<SRC_KEY>
SRC_HOST

SRC_HOST というエイリアス名である必要はありません。
ご自身で分かりやすい名前を付けてください。

yyy.yyy.yyy.yyy

サーバーA<SRC> の IP アドレス or ドメイン名

/root/.ssh/<SRC_KEY>

サーバーA<SRC>の root ユーザーの秘密鍵


2.2. サーバーA<SRC>に root ユーザーで ssh ログインできるか確認

# ssh SRC_HOST
  • ログインできたら次に進みます


2.3. 同期(バックアップ)をとるための rscync コマンドを試します

  • ドライラン
# rsync -avn --delete SRC_HOST:/aaa/bbb/ccc /xxx/yyy/zzz/
-avn

-n はドライランの指定です(本番実行で実際に同期を取るときは n を外し、-av とします)

–delete

完全な同期(差分なし)をとる場合は –delete を指定します。
サーバーAで削除されたデータであっても、サーバーBでは残しておきたい場合は、–delete を指定しません。


  • ドライランで正しく同期(バックアップ)が動作していることが確認できたら、次の作業に進みます。


2.4. 実際に発行されている rsync コマンドを確認する

先ほど試したドライランのコマンドに -e 'ssh -v' を追加します。

# rsync -avn --delete -e 'ssh -v' SRC_HOST:/aaa/bbb/ccc /xxx/yyy/zzz/

  :

debug1: Sending command: rsync --server --sender -vlogDtpre.iLs . /aaa/bbb/ccc

  :

すると、上記のように「debug1: Sending command: …」から始まる行が出力されるので、メモ(クリップボードにコピー)しておきます。
今回の場合は、

rsync –server –sender -vlogDtpre.iLs . /aaa/bbb/ccc

になります。


次に再びサーバーA<SRC>の設定に移ります。


3. サーバーA<SRC>の設定②

3.1. rsync 以外のコマンドを発行できなくする

(※この設定を行っても su で root になった場合はすべてのコマンドを発行できます)

# vi /root/.ssh/authorized_keys

from="xxx.xxx.xxx.xxx",command="rsync --server --sender -vlogDtpre.iLs . /aaa/bbb/ccc" ssh-rsa AAA...

authorized_keys を開き、先ほど追加した from= の次に command= を追加します。
from= との区切り文字は ,(カンマ)です。
Wクォーテーション内の文字列は、前項でメモ(クリップボードにコピー)した下記の文字列です。

rsync –server –sender -vlogDtpre.iLs . /aaa/bbb/ccc

これを指定することで、リモートからログインしてきた root ユーザーのコマンド発行を rsync に限定することができます。


4. サーバーB<DEST>で確認

4.1. サーバーA<SRC>への root ユーザーでのログインができないことを確認

# ssh SRC_HOST
  • 厳密には、ログインできても rsync 以外実行できないため、ログインプロンプトすら表示されません。
  • ログインできなければ次に進みます。


  • 本番実行
# rsync -av --delete SRC_HOST:/aaa/bbb/ccc /xxx/yyy/zzz/

ドライランの n を外して -av とし、サーバーA<SRC>のデータが同期(バックアップ)できるか確認します。
問題なければ、一連の rsync の設定は完了です。
必要であれば rsync コマンドを cron に登録するなどして、定期的に rsync する環境を作ります。


まとめ

  1. データの同期元(バックアップ元)の root ユーザーは公開鍵認証でなければ rsync させない
  2. その root ユーザーは、rsync 以外のコマンドを発行できなくする
  3. その rsync は、指定したIPアドレスからのアクセス(rsync)のみ許可する

すべての作業を行うことで上記3つの設定が適用され、セキュリティーがある程度確保されたデータの同期(バックアップ)環境が構築できます。


関連エントリー:





unix/command/rsync/security_for_root.txt