まだまだ記憶に新しいファーストサーバのデータ消失事件。レンタルしているWebサーバーと同一サーバー内にバックアップする簡易バックアップサービスもあったようですが、サーバー内の全てのデータが消失するとあっては、そのようなサービスも意味をなさなかったようです。
事件の炎上具合からみて、日頃からきちんとバックアップをとっているという人は以外に少なかったように見えます。ファーストサーバーの事件に巻き込まれなかった人も、きちんとバックアップをとらなければと改めて思ったのではないでしょうか?
僕もそのうちの一人。僕はよく、さくらのレンタルサーバーやVPSを使っており、データ消失の経験がありませんが、もしものときのために備え、さくらのレンタルサーバーで外部にバックアップをとる方法をまとめてみました。
前提
一応、前提条件をまとめておきます。
- バックアップをとりたい側(以下ローカル)は、さくらのレンタルサーバー。
- バックアップを保存するのはさくらのVPS(以下リモート)。
- ローカルでWebディレクトリとMySQLを圧縮し、rsyncでリモートに転送。
- ローカルからリモートへのアクセスは公開鍵認証で行う。
バックアップの保存先も同じ「さくら」かい!というツッコミがありそうですが、今のところ使える環境がそれしかなかったので、一応試した条件のまま掲載しています。
設定方法
リモートにバックアップ用のユーザーを作成する
rsyncはsshでリモートに接続してデータを転送する仕組みのため、リモートに受け手となるユーザーが必要です。ここでは「remote-backup」というユーザーを作成し利用することにします。
# リモート # ユーザーを作成 $ sudo useradd remote-backup # パスワードを設定 $ passwd remote-backup
nologin設定で作成したユーザーをrsyncで使用しようとすると「protocol version mismatch」というエラーがでて転送できません。rsyncはsshを利用するため、よくよく考えると当たり前なのですが僕はこれにハマってしまいました…。もしnologinで作成してしまった場合は、下記で修正できました。
# リモート $ sudo vi /etc/passwd # 当該ユーザーの /sbin/nologin を /bin/bash 等に変更
ローカルで鍵ペアを生成する
公開鍵認証で使用する秘密鍵と公開鍵のペアを、ローカルで作成します。ここで注意することは、秘密鍵のパスフレーズを設定しないということです。通常、もし秘密鍵が漏洩してしまったときのことを考えパスフレーズを設定しますが、パスフレーズを設定してしまうと、cronによる自動化ができなくなってしまいます。そのため、ここではパスフレーズを未設定とします。作成した公開鍵はリモートへ転送します。
# ローカル $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): #「Enter」を押す Enter passphrase (empty for no passphrase): # 「Enter」を押す(パスフレーズは入力しない) Enter same passphrase again: # もう一度 # 他のユーザーに見られないように秘密鍵パーミッションを変更 $ chmod 600 .ssh/id_rsa # リモートに公開鍵を転送(リモートのsshポート番号を-Pオプションで指定) $ scp -P 20022 .ssh/id_rsa.pub remote-backup@example.com:/home/remote-backup/.ssh/ remote-backup@example.com's password: # リモートのパスワードを入力
もしすでに公開鍵認証を設定済みで、パスワードログインを禁止にしている場合、scpで公開鍵を転送することができませんので、その場合は一旦パスワード認証を有効にするか、公開鍵をコピーアンドペーストで作成するなどの対処が必要です。
リモートで公開鍵を設定する
公開鍵は通常、ユーザーディレクトリの.ssh/authorized_keyという名称で使用するように設定されています。さきほどid_rsaという名称で転送していますので、authorized_keyにリネームします。もしすでに他のホストの公開鍵を利用中の場合は、その公開鍵に今回の公開鍵の内容を追記します。
# リモート # 転送されてきた公開鍵をリネーム $ mv .ssh/id_rsa.pub .ssh/authorized_keys # 他のユーザーに見られないようにパーミッションを変更(未設定の場合) $ chmod 700 .ssh $ chmod 600 .ssh/authorized_keys # 既に他のホストの公開鍵が設定されている場合はリネームでなく追記する $ cat .ssh/id_rsa.pub >> .ssh/authorized_keys $ rm .ssh/id_rsa.pub
公開鍵認証の設定をする
鍵の設定が完了したら、いよいよ公開鍵認証を利用できるように設定を行います。公開鍵認証の設定は、sshの設定ファイルである「sshd_config」を編集することで行います。
# リモート $ sudo vi /etc/ssh/sshd_config # 公開鍵認証を許可(ssh2のみ) PubkeyAuthentication yes # 公開鍵の場所 AuthorizedKeysFile .ssh/authorized_keys # パスワードでのログインを禁止 PasswordAuthentication no # rootでのログインを禁止 PermitRootLogin no # パスワードなしのログインを許可しない PermiyEmptyPasswords no # 再起動を忘れずに! $ service sshd restart
リモートにバックアップデータ保存用のディレクトリを作成する
リモートにバックアップデータを保存するためのディレクトリを作成します。ここでは、ユーザー「remote-backup」のホームディレクトリに「backup」というディレクトリを作成することにします。
# リモート # バックアップ用のディレクトリを作成 $ mkdir backup
ローカルでバックアップの設定を行う
ローカルでバックアップを行うシェルスクリプトの作成を行います。ローカルにもバックアップデータを保存するためのディレクトリが必要となりますので、リモートと合わせて、ここでもホームディレクトリに「backup」というディレクトリを作成し利用することにします。
# ローカル
$ mkdir backup
$ vi backup.sh
# 以下backup.shの内容
#!/bin/sh
# 何日分保存するか
day=3
# さくらのレンタルサーバーのアカウント名
account=hoge
# バックアップディレクトリ
bkdir=/home/$account/backup
# バックアップのファイル名
filename=`date '+%Y%m%d'`
# webディレクトリ
webdir=/home/$account/www
# MySQLホスト名
dbhost=mysqlxxx.db.sakura.ne.jp
# MySQLユーザ名
dbuser=hoge
# MySQLパスワード
dbpasswd=xxxxx
# バックアップ実行
/usr/local/bin/mysqldump -A -h$dbhost -u$dbuser -p$dbpasswd --opt | gzip > $bkdir/$filename.mysql.sql.gz
tar cvfz $bkdir/$filename.www.tar.gz $webdir
# 古いバックアップを削除
# oldfile=`date -d "$day days ago" '+%Y%m%d'`(CentOSの場合)
oldfile=`date -v-${day}d +%Y%m%d`
rm -f $bkdir/$oldfile.*
# リモートの保存先
remotedir=remote-backup@example.com:/home/remote-backup/backup/
# rsyncで転送(-pでリモートのsshポート番号を指定)
/usr/local/bin/rsync -avze "ssh -p 20022" $bkdir/$filename.mysql.sql.gz $remotedir
/usr/local/bin/rsync -avze "ssh -p 20022" $bkdir/$filename.www.tar.gz $remotedir
# backup.shの実行権限を設定
$ chmod 700 backup.sh
# テストしてみる
./backup.sh
さくらのレンタルサーバーのcronに登録する
シェルスクリプトの作成が済んだら、あとはそれをさくらのレンタルサーバーのcronに登録するだけです。cronへの登録もコマンドで設定できますが、5件までなら管理画面でも登録が可能ですので、そちらで登録してみました。毎日深夜3時に実行するようにしています。
さくらのレンタルサーバーのcron設定は下記が参考になりました。