rsyncでリモートバックアップ

公開しているWebサーバーのバックアップ作業を簡素化したいと思い、rsyncを使ってみたメモ。

バックアップ対象のサーバーでは既に日次バックアップが行われていて、そのアーカイブを手作業で吸い上げていた。
その作業もcronで自動化することが目的。

バックアップ対象のWebサーバーのSSHポートを解放しているので、rshにsshを使用して接続することにする。

cronでssh接続する時に課題となるのが認証の部分。少しググってみると

あたりが一般的な方法らしい。

HostbasedAuthentication方式がうまく設定できなかったorz

ので、パスフレーズなしの鍵での認証方式で実現した。

改めて、以下のエントリーが非常に参考になった。ありがとうございました。

ssh scp sftp の正しい自動実行方法

以下が、登場するホスト

host_foo
Webに公開されている、バックアップ対象となるサーバー
host_foo.fqdn
host_fooのFQDN
host_bar
Webに公開されている、host_fooからアーカイブを吸い上げるサーバー
host_bar.fqdn
host_barのFQDN
host_bar.ipaddr
host_barのIP ADDRESS
hoge
ssh接続するユーザー

鍵の生成

host_fooへ接続するときに使用する鍵を生成する。
以下、host_fooにおいて、バックアップ時に接続をするユーザー”hoge”で作業。

[hoge@host_foo ~]$ ssh-keygen -t dsa -N “” -f ~/.ssh/rsync
Generating public/private dsa key pair.
Your identification has been saved in ~/.ssh/rsync.
Your public key has been saved in ~/.ssh/rsync.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx hoge@host_foo.fqdn

公開鍵にオプションを追加。

[hoge@host_foo ~]$ vim ~/.ssh/rsync.pub
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,from=”host_bar.ipaddr” ssh-dss QCcfhnnF8y(中略)hnnF8CR1 hoge@host_foo.fqdn

オプションの内容については、以下参考。

sshd.0

鍵の内容をsshdが参照するファイルにコピー

[hoge@host_foo ~]$ cat ~/.ssh/rsync.pub >> ~/.ssh/authorized_keys

hogeの.sshディレクトリとホームディレクトリのパーミッションを変更

[hoge@host_foo ~]$ chmod -R 700 ~/.ssh/
[hoge@host_foo ~]$ chmod 755 .

秘密鍵の”~/.ssh/rsync”をローカルなりにダウンロード後、削除しておく。

[hoge@host_foo ~]$ rm ~/.ssh/rsync

バックアップ処理

バックアップはrootユーザーで実行することにした。
ダウンロードした秘密鍵をhost_barにアップロードして、”/root”においた。

バックアップを行うコマンドは以下のようになる。

[root@host_bar ~]# rsync -avz –delete -e “ssh -i /root/rsync” hoge@host_foo:/path/from/ /path/to/


上のコマンドで、host_fooの”/path/from/”で指定されるディレクトリの内容が、host_barの”/path/to/”で指定されるディレクトリの内容が同期される。
“/path/from/”で指定されるパスは、host_fooのユーザーhogeの権限でアクセスできる必要がある。
上のコマンドをcronで定期実行するなり、スクリプトファイルを作成してそれを定期実行させるなりすれば、定期バックアップが実現できる。

セキュリティについて

ぴろ日記


こちらでは正しいssh/scpの自動運転は

  • 自動運転専用の鍵をパスフレーズなしで作成する。
  • でもって、その鍵を使ってやれることを、いかにして必要最小限の作業だけに制限するかを考える

ことを基本ポリシーとし、できる作業を制限する方法としては、

  1. 毎回完全に同じコマンド(引数含めて)しか実行しないなら、authorized_keysでcommand=’…’を使って実行できるコマンドをそれだけに制限。
  2. ファイル転送用途だけなら、scponlyとかの転送用途に限定されたシェルをリモートのアカウントのシェルに設定する。
  3. 上記2つのケースには該当しないけれど、特定のコマンドに実行を制限したい時はrestricted shellとか。
  4. 可能ならchroot patchをあてたsshdを使ってchroot環境作るのも良い。
  5. あるいはauthorized_keysのcommand=’…’機能を使って強制的に特定のコマンドを実行された場合に、本来リモートから(ssh host ‘cmd…’等で)与えられたコマンドラインが環境変数SSH_ORIGINAL_COMMANDに保存されるのを利用して、 SSH_ORIGINAL_COMMANDを自前で安全に処理するコマンドを作るとか。

と述べられている。この話に沿うならば、3番目くらいの対処をした方がいいのかも。
現状は秘密鍵を秘密にするということに頼っていて、秘密鍵が漏れた時のために公開鍵のオプション”from”で接続元を制限している、というレベル。

安全性は・・・どうなんだろ?教えてエロい人。

Leave a Reply