2012年12月30日日曜日

ロリポップ上のWordPressをWAFで防御する方法

(2013/08/29)追記
ロリポップ上のWordPressが不正アクセスされる事例が増えているようです(参考)。現時点で侵入経路等は明らかでありませんが、以下に説明する方法で、公開ページに対するSQLインジェクション攻撃や、管理コンソールに対する不正ログインに対しては、かなり効果があると考えられます。ユーザーの参考になれば幸いです。また、タイトルを変更しました。
追記終わり

今年の9月27日から、ロリポップのレンタルサーバーの全プランで、WAF(SiteGuard Lite)が標準装備されるようになりました。
http://lolipop.jp/waf/より引用

これは大変良いことですね。インターネット上のすべてのサイトが攻撃の対象ですし、被害も増えている印象があります。ロリポップについても、今年の5月に攻撃を受けたという報告がいくつかあります。たとえば、これ。
今年5月に発表されたCGI版PHPのリモートスクリプト実行の脆弱性(CVE-2012-1823)が狙われたのではないか推測されています。
既に当該脆弱性はロリポップ側で対処が終わっていますが、今後新たな脆弱性が発見されたり、アプリケーションのSQLインジェクション脆弱性などが狙われる可能性もあるので、WAFによる防御は有効です。

レンタルサーバーを利用するサイトは予算が十分でないことが多く、セキュリティにお金がかけられない場合が多いでしょう。共通設備のセキュリティはレンタルサーバー事業者が責任を持って対処すべきですが、CGIプログラムやPHPスクリプトなどはレンタルサーバー利用者の責任で脆弱性対処すべきところ、なかなかそこまで手が回らないというのが実態ではないでしょうか。ということで、良かったなぁと思っていたところ、以下のような話をよく目にするようになりました。

ロリポップ!でWordPressを導入すると403エラーになるので、その場合はWAFを停止するといいよ

ざっとググっても以下のように幾つも出てきます。
なんということでしょう。せっかくのWAFがこういう理由で止めらてしまうなんて、もったいない。そのうちロリポップ!を契約したらまずWAFを停止すべしなんてバッドノウハウが広まってしまうかもしれませんし、既にそうなっているかもしれません。

ということで、ロリポップ!とも、運営会社の株式会社paperboy&co.さんともなんの関係もないのですが、SiteGuard職人としてこの事態を放置することができず、WAFを有効にしたままWordPressを運営する方法を考えましたので紹介します。

基本的な考え方

一般的に、WAFが「正常なリクエスト」まで拒否してしまう現象を誤検知、過剰検知、False Positive、偽陽性といいます。誤検知があると、正常な運用ができなくなるので困ります。この場合、通常はWAFのチューニングで、誤検知がない状態にします。簡単なチューニングとしては、誤検知を起こしているルール(シグネチャ)を無効にするなどで、誤検知がないようにします。
しかし、ロリポップ!のWAF設定は、ドメイン単位で有効・無効の設定しかありません。このため、「サイト全体でWAFを無効にする」しかないと思うのも無理はありません。
しかし、以下のようにすれば、WAFを最大限に有効活用できると考えました。
  • ドメインを閲覧用と管理用で分ける
  • 閲覧用のドメインはWAFで防御する
  • 管理用のドメインはWAFは無効にして、BASIC認証で防御する
ロリポップ!のプランのうち、WordPressが利用できるのはロリポプラン以上ですが、この場合共有SSLを使うことができます。このため、以下のようにすればよいと考えました。
  • 閲覧用のドメインはHTTPとして、独自ドメインかロリポップ!の用意したサブドメインで運用する。このドメインはWAFで防御する
  • 管理用のドメインは共有SSLとして、BASIC認証で保護し、WAFの設定は外す
いい感じですね。管理画面をSSLで運用すると、スタバでコーヒーを飲みながらWi-FiサービスでWordPressのメンテンスをするなんて際も安心です。WAFの件がなくても、そうしたほうがいいですね。
以下、具体的な設定方法を説明します。

検証用サイトの前提説明

検証用にロリポップ!のお試しをお借りして、コンテンツはなんでも良かったのですが、「千葉県浦安市が東京都浦安区になった」という想定の偽サイトをでっちあげてみました。


このサイトのドメイン名は下記となります。
  • 閲覧用:http://www.urayasu.tokyo.jp/
  • 管理用:https://oops-ock.ssl-lolipop.jp/

WordPressの管理画面をSSL対応にする

WordPressの管理画面をSSL対応するには、「WordPress HTTPS」というプラグインが便利です。導入するには、WordPressの管理画面(ダッシュボード)から、プラグイン|新規追加というメニューを選択し、httpsというキーワードで検索するとすぐ出てきます。「いますぐインストール」というリンクをクリックしてインストールしましょう。


プラグインのインストールが完了すると以下の画面になります。「プラグインを有効化」をクリックします。


その後、プラグインの一覧からWordPress HTTPSのSettingsをクリックすると以下の画面が表示されます。


上記のように、SSL HostにURL(HTTPSのホスト)を入力し、「Force SSL Administration」と「Force SSL Exclusively」にチェクを入れ、「Save Changes」をクリックします。これで、WordPressの管理画面がHTTPSでアクセスするようになります。

BASIC認証を設定する

次に、BASIC認証を設定します。まず、FTP画面(Webツールロリポップ!FTP)で .htaccess というファイルがあるかどうかを確認して、ある場合は内容をコピーしておきます。
次に、Webツール|アクセス制御メニューをクリックして以下の画面から、新規作成ボタンをクリックします。


以下の画面が表示されるので、認証フォームタイトルを適当に入力(下記例ではPlease Login)して、ユーザ1にアカウント名とパスワードを入力します。WordPressに設定したパスワードとは別のパスワードを設定するとよいでしょう。


入力を確認して、「作成」ボタン(画面下部)をクリックします。

以上でBASIC認証の設定は終わりですが、ここから .htaccess をカスタマイズします。FTPツールで、.htaccessを開くと、以下の様な内容が入っているはずです。1行目のパス名は少し違うはずです。

AuthUserFile /home/users/1/oops.jp-ock/web/.htpasswd
AuthGroupFile /dev/null
AuthName "Please Login"
AuthType Basic
require valid-user

ここに、追記して以下のようにします(青字が追記部分)。

AuthUserFile /home/users/1/oops.jp-ock/web/.htpasswd
AuthGroupFile /dev/null
AuthName "Please Login"
AuthType Basic
require valid-user

SetEnvIf Host "^www.urayasu.tokyo.jp$" allow_host
SetEnvIf Host "^urayasu.tokyo.jp$" allow_host
order deny,allow
deny from all
allow from env=allow_host

satisfy any

「SetEnvIF Host」のホスト名は貴サイトのものに置き換えてください。上記は、BASIC認証で通るか、ホスト名がwww.urayasu.tokyo.jpあるいはurayasu.tokyo.jpの場合にアクセスできるという設定です(SetEnvIfは複数書いても構いません)。これにより、閲覧用ドメインは認証なしで、管理用ドメインはBASIC認証ありでアクセスという設定を実現しています。

最後に、元々.htaccessに設定があった場合は、その内容は消えているはずなので、あらかじめコピーしておいた内容を上記の下にペーストして復元しておきます。最後にFTPツールの「保存する」ボタンをクリックして内容をセーブします。

WAFの設定を変更する

次に、WAFの設定を変更します。ロリポップ!のユーザ専用ページからWebツール|WAF設定を選び、以下の画面を表示します。管理用ドメイン(以下の画面ではhttps://oops-ock.ssl-lolipop.jp/)のみを「無効にする」をクリックして以下の状態にします。


以上で、BASIC認証の設定とWAFの設定が終わりました。

試してみる

設定が終わりましたので、利用者として該当ページを閲覧してみましょう…以下のように、とくに認証を求められることもなく普通にアクセスできます。大丈夫ですね。


WAFの効き目を確かめるために、URL末尾に ?a=<script>alert(1)</script> を追加してアクセスしましょう。下記のように、403 FORBIDDENとなり、WAFが働いていることがわかります。


この403ページはロリポップ!標準のものですが、カスタマイズして変更したほうがよいでしょうね。
次に、管理画面に移りましょう。元のページに戻り、メタ情報ログインをクリックします。下記のように、BASIC認証のユーザ名とパスワードの入力画面が表示されます。


先に登録したユーザ名とパスワードを入力してOKボタンをクリックすると、ワードプレスのログイン画面になります。ログインが2回出てウザい感じですが、WordPress自体を守りたいため、これは仕方ありません。ブラウザにパスワードを記憶させても良いので、このBASIC認証はかけるべきです。そうでないと、WAFの防御が無意味になってしまいます。


WordPresにログインしてから、先ほど同様URL末尾に ?a=<script>alert(1)</script>を追加してアクセスしてみます。以下のように、403にならず、通常通り使用できます。WordPressのダッシュボードはWAFの防御が無効になっていることがわかります。


注意事項

WordPressのダッシュボードはBASIC認証で守られているので、SQLインジェクションなどの能動的攻撃を受けることはなくなります。しかし、クロスサイトスクリプティング(XSS)のような受動的攻撃は受ける可能性があります。
このため、WordPressのダッシュボード作業は、いつも使っているブラウザとは別のブラウザを用い、作業終了後すぐにブラウザも終了させることにより、受動的攻撃のリスクを最小限に留めることができます。
また、ロリポップ!に導入されているWAFはSiteGuard Liteという簡易版のWAFなので、おもにSQLインジェクションとXSSに特化した防御機能であり、WordPress固有の脆弱性に対してはシグネチャはありません。このため、定期的にダッシュボードを確認して、プラグインなどを最新の状態に更新することが重要です。

また、一般ユーザがコメントを付ける場合は、WAFの防御機能が有効なので、タグを使って入力した場合にWAFが誤検知する可能性はあります。私がWordPressのコメント欄で許可されているタグをひと通り試した範囲では検知はされませんでした。

まとめ

ロリポップ!のWordPressとWAFが干渉して誤検知が発生するという問題に対して、WordPressの管理画面(ダッシュボード)のみWAFを無効化して、一般利用者の閲覧する画面についてはWAFによる防御を有効化する方法を説明しました。
貴サイトの安全性強化の参考になれば幸いです。

PR

HASHコンサルティング株式会社では、WAFの選定、導入、運用のサービスを提供しております。WAFの誤検知に対しても、防御機能を最大限活かした状態でのチューニングが可能です。詳しくは弊社ホームページをご参照ください。

3 件のコメント:

  1. wordpressの管理画面で
    「wordpress アドレス」を
    共有SSLのアドレスに変更しないと
    強制的にhttpsで接続された場合に、
    アドレスが無効となり、
    wordpressにログインできなくなります。

    上の例で言うと、
    https://ock.oops.jp/wp-admin/
    にリダイレクトされてしまい、
    not found となります。

    wordpress アドレスを
    https://oops-ock.ssl-lolipop.jp/
    に変更するあたりの手順も入れて
    いただくと良いのではないでしょうか?

    返信削除
    返信
    1. 突然申し訳ありません。
      随分と前の投稿に対する返信で申し訳ないのですが・・・

      wordpress アドレスを
      https://oops-ock.ssl-lolipop.jp/
      に変更するあたりの手順

      まさにこれがわからず、自分の管理画面に入れなくなってしまっています。
      数日間あれこれやっていますが、超初心者でどうにもならず困っています。
      方法を教えていただけないでしょうか。宜しくお願いいたします。

      削除
  2. はじめまして。
    HP製作超初心者です。あたインターネットの知識もほとんどありません。

    ロリポップを利用しておりますが、有効にしたいプラグインがあったので載せておられた方法を試みたところ、
    wordpressの編集画面が開かなくなってしまいました。

    "上記のように、SSL HostにURL(HTTPSのホスト)を入力し、「Force SSL Administration」と「Force SSL Exclusively」にチェクを入れ、「Save Changes」をクリックします。これで、WordPressの管理画面がHTTPSでアクセスするようになります。"

    この部分、「Save Changes」をクリックした後です。
    エラー画面が表示され、編集画面がでなくなってしまいました。
    すぐにエラー画面を消してしまい、何のエラーだったのか今となってはわかりません・・・
    ちなみにポートのところ何を入れたらよいのかわからず空欄にしておりました・・・(そんなレベルです。)

    申し訳ないのですがアドバイスいただけると助かります。
    何卒よろしくお願いいたします。

    返信削除

フォロワー