auto_prepend_fileとhttpd.conf双方の対応方法
wp-login.phpへの連続アクセスに対処する2種類の方法。
WordPressのlogin_headアクションを利用して、ローカルネットワークと一部のグローバルアドレス以外からのwp-login.phpに対するアクセス制御をおこなってきたが、
- WordPressの実行するコスト
- httpdからのDBコネクション発生コスト
が生じるため、より良いwp-login.phpに対するDOS攻撃対策を書いてみる。
auto_prepend_file
auto_prepend_fileを利用してPHPのメインスクリプト(WordPress)を実行する前に、フックする感じで別のPHPスクリプトを実行することができる。
apacheのconfかhtaccessのVirtualHostディレクティブ内でauto_prepend_fileの設定をすることができる。
php_value auto_prepend_file C:\xampp\htdocs\vhost\wordpress3.9.1ja\wp-content\before_script.php
before_script.phpでローカルネットワーク以外からのwp-login.phpへのアクセスに404エラーを返すコードを追加する。
if( strpos($_SERVER['REQUEST_URI'], "/wp-login.php") !== false ) { if ( strpos(getenv("REMOTE_ADDR"), "192.168.0") !== false ) { } else { header("HTTP/1.1 404 Not Found"); exit(); } }
ここまでの設定で外部ネットワークからwp-login.phpに対するブルートフォースアタックなどから保護することができる。
この方法は、PHPを実行するコストは発生するもののWordPress実行前にアクセスを制御することができるため、WordPressのデータベースに対する接続コストも発生しない。また、純粋なPHPスクリプトであるため、より手の込んだDDOS攻撃を軽減するための処理やログ出力処理などを追加で書くことが可能。
httpd.confとhtaccess
wp-login.phpのアクセス制御でより一般的なのが、httpd.confもしくはhtaccessを利用した方法になる。一例として、locationディレクティブを利用して以下のようにwo-login.phpを保護することが可能。
<Location /wp-login.php> order deny,allow deny from all allow from 192.168.0.2 </Location>
wp-login.phpへのアクセスについては、192.168.0.2からのアクセスのみ可能にする設定になる。
wp-login.phpを保護するのであればこちらの設定の方がおすすめ。