当ブログでも利用している「WordPress」はとても便利なブログソフトです。
無料で利用でき導入も簡単なので数多くのブログサイトでこのソフトを利用していますが、オープンソースなので改ざんなどの攻撃の対象になりやすく、脆弱性も頻繁に見つかっています。
2013年に発生した“ロリポップ!の改ざん被害”は規模も大きく、多くのWordPressサイト管理者を震撼させたものでした。
こういった攻撃に対してどのように対処するか?
ガチガチにセキュリティを高めて対策することも大事だと思いますが、まずは“何かあったときにすぐに元に戻せるようバックアップを取っておく”ことが第一だと思います。
というわけで、今回は私のサイトのバックアップ手順を紹介していきたいと思います。
※ あくまでも私の環境を前提にしていますので、すべてのサイトに対して同じ方法が使えるわけではありません。
1. WordPressのファイルとデータベースのバックアップ
WordPressを構成しているのは画像や本体などのファイルとデータベース(MySQL)で、要はこの2つさえバックアップを取っておけば良いわけです。
データベースはサーバー側で用意されているphpMyAdminを使って簡単にバックアップが取れるのですが、phpMyAdminだとファイルのバックアップが取れません。
FTPソフトを使ってファイルのバックアップをデータベースとは別に取ることもできるのですが、手間はなるべく減らしたいところです。
TelnetやSSHが使えればコマンドを打ち込んですぐにバックアップが取れるのですが、私が使っているサーバーではTelnetもSSHも使うことができません。
仕方がないのでPHPでスクリプトを組んで対応することにしました。
PHPであればexec関数やsystem関数でコマンドを実行できるので、PHP上からファイルやデータベースのバックアップを取るコマンドを走らせれば、サーバー上にバックアップを作成できるはずです。
早速組んだスクリプトが下記になります。
2. バックアップを取るためのスクリプト
<?php /* WordPressのバックアップスクリプト 2014/01/08 @kinuasa */ //***** 下記必要に応じて変更 ***** $yyyymmdd = date('Ymd'); //日付 $filename_dat = $yyyymmdd . "-bk_blog_dat.tar.gz"; //ファイルの出力先ファイル名 $filename_sql = $yyyymmdd . "-bk_blog_db.sql.gz"; //データベースの出力先ファイル名 $path_datdir = "(ファイルのディレクトリパス)"; $db_dbname = "(データベース名)"; $db_user = "(データベースのユーザー名)"; $db_pass = "(データベースのパスワード)"; $db_host = "(データベースのホスト名)"; //******************************** //ファイルのバックアップ $cmd = "tar -cvzf $filename_dat --ignore-failed-read $path_datdir"; exec($cmd, $output, $return_code); if($return_code != 0) exit("ファイルのバックアップに失敗しました。"); //データベースのバックアップ $cmd = "mysqldump $db_dbname --user=$db_user --password=$db_pass --host=$db_host --opt | gzip > $filename_sql"; exec($cmd, $output, $return_code); if($return_code != 0) exit("データベースのバックアップに失敗しました。"); print "処理が終了しました。"; ?>
上記の通り非常に短く、やっていることも下記2つだけです。
- tarコマンドでWordPressのファイルをディレクトリごと圧縮
- mysqldumpでデータベースの内容をSQL形式でダンプし、gzipコマンドで圧縮
ファイルのディレクトリパスは、サーバーの管理画面やスペックが記載されているページには大抵ドキュメントルート(例:/wwwroot/example、/home/usr/public_html)が記載されているのでそれらを参考にするか(例:/wwwroot/example/blog、/home/usr/public_html/wordpress)、サーバー上のWordPressディレクトリに下記コードのPHPファイルをアップしてブラウザーでアクセスすれば、パスを取得することができます。
※ アップしたPHPファイルはパス確認後必ず削除するようにしてください。
<?php print dirname(__FILE__); ?>
ユーザー名やパスワードといったデータベースの情報は、WordPressインストール時に設定したものです。
上記スクリプトをサーバー上の適当な場所にアップして、動作を確認(ブラウザーでアクセス)したところ、無事に「処理が終了しました。」とのメッセージが表示され、PHPファイルと同じ場所に2つのgzファイルが出力されました。
※ ここで作成したバックアップファイルとPHPファイルは、サーバー上に置きっぱなしにするのは非常に危険であるため、用が終わったら必ず削除してください。
これでWordPressのバックアップは終了です。
次回は今回取ったバックアップをローカル環境で動かす方法について説明します。
【編集後記】
記事の下に編集後記として近況を書いています。
ここだけ読んでいただけることも多く、それでもありがたいです。
前述したとおり、毎回興味のある記事ではないですからね。
といったことを仰っているので、真似をして編集後記を書いてみます。
毎回書くのはキツそうなので、気が向いた時だけ書くことにします。
今回の記事について、バックアップの仕組みを考えるのは簡単だったのですが、実際にコマンドを走らせてみようといったときに結構苦労しました。
mysqldumpでダンプを取るだけなのに、何度やってもAccess deniedエラー・・・。
原因は「all-databases」オプションが使えないにも関わらずこのオプションを付けていたことで、外してデータベースを指定したらあっさりコマンドが通りました。
それならそうと「使えないオプションくっついてるよ!」なんて感じで教えてほしいものです。
何はともあれ、一つ勉強になりました!
この記事へのコメントはありません。