rsyncでリモートバックアップ
公開しているWebサーバーのバックアップ作業を簡素化したいと思い、rsyncを使ってみたメモ。
バックアップ対象のサーバーでは既に日次バックアップが行われていて、そのアーカイブを手作業で吸い上げていた。
その作業もcronで自動化することが目的。
バックアップ対象のWebサーバーのSSHポートを解放しているので、rshにsshを使用して接続することにする。
cronでssh接続する時に課題となるのが認証の部分。少しググってみると
あたりが一般的な方法らしい。
HostbasedAuthentication方式がうまく設定できなかったorz
ので、パスフレーズなしの鍵での認証方式で実現した。
改めて、以下のエントリーが非常に参考になった。ありがとうございました。
以下が、登場するホスト
- 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が参照するファイルにコピー
[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の自動運転は
- 自動運転専用の鍵をパスフレーズなしで作成する。
- でもって、その鍵を使ってやれることを、いかにして必要最小限の作業だけに制限するかを考える
ことを基本ポリシーとし、できる作業を制限する方法としては、
- 毎回完全に同じコマンド(引数含めて)しか実行しないなら、authorized_keysでcommand=’…’を使って実行できるコマンドをそれだけに制限。
- ファイル転送用途だけなら、scponlyとかの転送用途に限定されたシェルをリモートのアカウントのシェルに設定する。
- 上記2つのケースには該当しないけれど、特定のコマンドに実行を制限したい時はrestricted shellとか。
- 可能ならchroot patchをあてたsshdを使ってchroot環境作るのも良い。
- あるいはauthorized_keysのcommand=’…’機能を使って強制的に特定のコマンドを実行された場合に、本来リモートから(ssh host ‘cmd…’等で)与えられたコマンドラインが環境変数SSH_ORIGINAL_COMMANDに保存されるのを利用して、 SSH_ORIGINAL_COMMANDを自前で安全に処理するコマンドを作るとか。
と述べられている。この話に沿うならば、3番目くらいの対処をした方がいいのかも。
現状は秘密鍵を秘密にするということに頼っていて、秘密鍵が漏れた時のために公開鍵のオプション”from”で接続元を制限している、というレベル。
安全性は・・・どうなんだろ?教えてエロい人。



