WordPressのDoS攻撃対策

WordPress を使い始めて二年半になりますが,Jetpack からよく「ダウンしています」と通知が来ます.たぶん前にも書きましたね.毎度 CPU 使用率とディスク I/O が高まり,とうとうさくらの VPS が CPU リソース制限を受けるまでになってしまいました.

そこで調べたところ,いくつかのファイルを無効化すると改善される可能性がありそうなので,これを行って様子見することにしました.

XMLRPC 無効化

まず,xmlrpc.php を無効化します.ピンバック機能とかに使われるらしいですが,たぶん使ってないと思うので.

これを有効化してると DDoS の踏み台にされるらしいので,被害も拡大します.

SiteGuard

プラグインの機能の中に [XMLRPC 防御] というのがあって,それをピンバック機能ではなく XMLRPC 自体を無効化するよう設定を変更すれば,簡単に行けるのでは...?(わからない)

その他にもいくつか方法があったので,それもメモっておきます.

.htaccess でアクセス禁止

どちらにせよ Apache を通すことになりますが,.htaccess で xmlrpc.php へのアクセスを禁止する方法です.

.htaccess
<Files "xmlrpc.php">
order deny,allow
deny from all
</Files>

これだとすべてのアクセスを弾くので,自分の IP アドレスだけ承認するときは allow from xxx.xxx.xxx.xxx と追記する必要があります.

.htaccess でリダイレクト

また,アクセスを禁止するのではなく,トップページにリダイレクトするという方法もありました.サーバ負荷的にはこちらのほうが良いらしいです.

.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

mod_rewrite.c が有効になっていないと動かないので,Apache の設定も変更します.

/etc/httpd/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so

ファイアウォールで IP アドレスを遮断

発信元の IP が特定できれば,それごと遮断することができます.

/var/log/httpd 下に Apache のログは溜まっているので,xmlrpc.php にアクセスしているログを抜き出します.

terminal
# cd /var/log/httpd
# grep "xmlrpc.php" access_log

ログを見ると IP が特定できます.今回は少なかったのでやりません.

wp_cron.php 無効化

メール投稿,予約投稿,サイトマップなどに使われる PHP ファイルですが,サイトにアクセスがあると毎回起動するために,アクセス数が増えるほど処理が重くなっていくらしいです...PV が増えすぎると処理過負荷になって PV が減るってことか...

で,これを単純に無効化しただけだと,予約投稿とかも止まってしまうので,wp_cron を止めつつ,CentOS 7 側で cron を設定します.

まず,WordPress の最上位ディレクトリ内の wp-config.php を編集します.

/var/www/html/wp-config.php
<?php
define('DISABLE_WP_CRON', 'true');

次に,PHP のパスを調べます.

terminal
$ which php
/usr/bin/php

wp-cron.php を一定時間ごとに叩くように cron を設定します.

terminal
# vim /etc/crontab

* * * * * apache /usr/bin/php /var/www/html/wp-cron.php > /dev/null 2>&1

ディレクトリの部分は環境に合わせて変更してください.

ちなみに,CentOS 7 にはデフォルトで cronie-anacron がインストールされていて,時間ぴったりにジョブを実行しないらしいです.もし,時間にシビアな実行が求められるなら,cronie-anacron をアンインストールし,cronie-noanacron を入れるといいようです.

最後に

これでアクセス状況が改善されると本当に嬉しい.

参考