Posted filed under Blog.

 最近、大規模なWordPressのサイトの乗っ取りが発生しました。今回の原因はWordPressではなくサーバの設定に問題があったようですが、LAMPサーバの設定を正しく行うのは難しいですし、ApacheやPHP、WordPressのバージョンアップをきちんと行っていくのは、結構大変です。
 自分でサーバを運用していて、セキュリティ対策をきちんとしていると言える人は、実はあまり多くないのでは無いでしょうか?プラグインなどを複数導入している場合には、それらのプラグインのセキュリティ対策を行うのはかなり難しいといえます。

 そんな中、高セキュリティ環境でWordPressを運用する方法はないのか考えてみました。それにはサーバ上でアプリを動かさないのが一番では無いでしょうか?

 私のブログであれば、Voteなど動的な機能は使っていないので、WordPressのデータから静的なHTMLを生成して、Amazon S3にアップすれば良いのではないかと思いはじめました。それでツイートしたところ、WordPressからHTMLを生成するプラグインのStaticPress教えてもらいました

 コレを使えば、WordPressのコンテンツをそのままHTMLにする事ができ、これをアップすればサーバ上でWordPressを動かす必要がなくなり、サーバの運用がグッと楽になります。

 このStaticPressをさらにS3へアップするプラグインも別途公開されています。これを使えばWordPressの内容をそのままS3上に展開することができ、S3のWebサイトのホスティング機能を使うことで、オリジナルのドメインで公開することができます。

 私はこのブログを早速Amazon S3に移設しました。移設さえ済んでしまえば、ブログの更新の手間などは変わりません。

 本記事では、WordPressからHTMLを生成しAmazon S3にアップすることで、高いセキュリティを保ったブログ運用する方法を前後半の二回でお届けまします。

告知:
 この記事の様にWordPressをS3+Vagrantで運用する方法を紹介する勉強会を10/13に行います。ご興味のある方はぜひ足を運んで頂けるとうれしいです。

【WordPress特別セミナー】StaticPress × S3 × Vagrant 勉強会 : ATND

 WordPressを開発しているAutomattic社の高野さん、StaticPressを開発している株式会社デジタルキューブの古賀さん・岡本さん、AWS社の堀内さん、Vagrantに詳しい澤登さんという冗談のように豪華なメンバーです。

WordPressを静的運用できる条件

 StaticPressを使って、S3上にブログを移設できるのは下記の条件がそろったときです。

  • ドメインのDNS設定を変更できる
  • 標準のコメントやTrackbackを使わなくて良い (FBやDISQUSを使うのは可)
  • User agentをみてサーバ側で動作を変えるテーマを使っていない
  • Voteなどユーザが投稿出来るプラグインを使っていない

 スマホ対応は、レスポンシブなテーマで行う事になります。これら以外でもプラグインやテーマによってはHTML化できないものもあると思います。

 今回は既に運用している、WordPressをS3に移行するステップを説明します。次回ではVagrantを使い、自分のPC上でWordPressを動かすようにしてみましょう。

ステップ1: StaticPressでHTMLを生成する

 StaticPressは、いま稼働中のWordPress全体を静的なHTML変換するプラグインです。WordPressのプラグインページで公開されているので、適当な方法で導入し、Activateしてください。

 左のナビゲーションバー内の「StaticPress」を開くと「Rebuild」ボタンがありますので、これを押すと「/static」に静的なHTMLが生成されます。いまお使いのサイトで既に「/staitc」フォルダを使っている場合は、「StaticPress Options」でディレクトリ名を変更してください。

 生成が終わった後、”http://examplecom/static/” の様にして開くと、ブログが表示されると思います。

ステップ2: HTMLに対応するように調整

 静的なHTMLにすると、コメントやTrackbackなどユーザから書き込むような事はできません。そのため、コメントを有効化・無効化するを参考にしてコメント欄を閉じてください。

 コメントが必要な場合は、FacebookによるコメントDISQUSなどのプラグインを導入してください。

 このブログで使っているwp.Vicuna Ext.というテーマは、CSSの生成を動的に行っています。StaticPressでは、この部分に対応できないようです。そのため、自分でテーマのstyles.cssを変更して対応しました。

 このブログのコメントは、FacebookのComment boxを使うことにしました。特にプラグインは使わずFacebookのDevelopersサイトで生成したHTMLをテンプレートに組み込みました。

ステップ3: Amazon S3を設定する

 StaticPressで生成するHTMLはAmazon S3に保存します。Amazon S3にはWebホスティング機能があり、これを使えば自分のドメインで、index.htmlや独自のNot Foundページを設置できます。

 この機能を使うには、ドメイン名と同じ名前のバケットを作ります。このブログでは「blog.masuidrive.jp」というバケットを作っています。作るときに「Region」を聞かれますが、日本のブログの場合は「Tokyo」選んでおいてください。

 作った後にプロパティの「Static Website Hosting」を「Enable website hosting」にして、「Index Document」に「index.html」を設定します。この画面に書いていてある「Endpoint」のURLはメモしておいてください。

 S3のアップロードには、S3のバケットと、Access key/Secret keyが必要になります。

 普通にS3用のフルアクセスユーザを作成しキーを発行すると、同じアカウントの全てのS3バケットにアクセスできてしまうので、IAMで特定バケット用のユーザを作りキーを発行します。

 IAMでユーザを作るとき下記の様なポリシーにすると、特定のバケットにのみアクセスできるユーザを作れます。そしてこのユーザのAccess keyとSecret keyをメモしておいてください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::バケット名/*"
      ],
      "Effect": "Allow"
    },
    {
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ],
      "Effect": "Allow"
    }
  ]
}

ステップ4: S3にアップロードする

 StaticPressをS3と連携させるStaticPress-S3プラグインをインストールします。画面の右下の「Download ZIP」からダウンロードして、「wp-contents/plugins」ディレクトリにコピーしてください。

 管理画面のサイドバーに「StaticPress options」の中に「S3 Options」言う項目ができるので、先ほどのAccess/Secret Keyを設定します。バケットのRegionを「Tokyo」にした時は「AWS Region」を「AP_NORTHEAST_1」に設定してください。

 上記を入力して少し待つと、バケットリストが出てくるので自分が使うバケット=ドメイン名を選択して保存します。

 これで、準備が完了しました。サイドバーの「Static Press」の中にある「Rebuild」ボタンを押すと全てのページのHTMLを生成し、S3にアップロードします。

 今後、記事を書いた後にこの「Rebuild」ボタンを押すと、最新の状態がS3にアップロードされます。

 アップロードが完了したあと、ステップ3の「Endpoint」のURLにアクセスすると、生成されたブログが表示されているはずです。表示などがおかしい場合は、ステップ2に戻ってテンプレートなどを見直してください。

ステップ5: DNSを切り替え

 先ほどのURLで確認できたら、最後にDNSを切り替えて自分のドメインをS3に向けます。

 DNSの設定を変更し、ブログのドメインを先ほどの「Endpoint」のCNAMEにしてください。設定方法の詳しくはお使いのDNSプロバイダとGoogle先生で確認してください。

 これで、ブログをS3に完全移行できました。あとはWordPressサーバにIP制限したり、BASIC認証を有効にするなどして、外部からのアクセスを塞げば乗っ取られる可能性はかなり低くなるでしょう。また、何かでアクセスが急増してもサーバが落ちることはもうありません。

次回予告

 この記事では、WordPressをサーバに設置したまま、S3へ移行しました。次回はこのWordPressをVagrantを使いローカルのPCへ持ってきます。


WordPressの教科書


基礎からのWordPress