そんなにアクセスがあるわけでもないのにサイトが重いなーと思ってサーバのアクセスログを見たら、WordPressのxmlrpc.phpにものっそいPOSTくらってたのでDenyしました。
ググってみたら、WordPressのXML-RPCの機能を利用してDoSの踏み台にする方法があるらしく。言われてみれば今までもアクセスが特別多いわけでもないのにサーバが重い事があったのですが、たぶんこれだわ……Pingは飛ばさない設定になっているはずですが(正直よく分からん)、踏み台になっちゃったりしてたらごめんなさい。
xmlrpc.phpの無効化
今のところ、Pingを飛ばしたり、リモート投稿を利用する予定は無いので、この機会にxmlrpc.phpを無効化しました。
プラグインで無効化する方法
WordPressのプラグインにxmlrpc.phpの機能を無効化してくれるものがあります。サーバの設定をいじれない場合はこれを利用するくらいしか方法がないかも?
これを入れれば、とりあえず踏み台にされるリスクは減るはず。でも、これって結局、PHPが動くので、今回みたいに1秒間に3、4回とかいうレベルでアクセスされるとサイトが重くなっちゃうのは変わらない気がするんですよね……
Nginxでの無効化
というわけで、Nginx側でxmlrpc.phpへのアクセスをまるごとdenyしちゃうことにしました。サーバの設定に以下の記述を追加しました。
location = /xmlrpc.php {
allow 192.0.0.0/16;
deny all;
proxy_pass http://backend;
}
ログを見たら「The Incutio XML-RPC PHP Library」と「Jetpack by WordPress.com」なる、なにやらJetpackに関係していそうなものが「192.0.0.0/16」を使用していたので、このアクセスを許可してバックエンドのPHPに回しています。
192.0.81.13 - - [19/May/2015:22:08:21 +0900] "POST /xmlrpc.php HTTP/1.0" 200 162 "-" "The Incutio XML-RPC PHP Library"
192.0.81.13 - - [19/May/2015:22:08:21 +0900] "POST /xmlrpc.php?for=jetpack&token=pW0ONLLIP%265(中略) HTTP/1.0" 200 162 "-" "Jetpack by WordPress.com"
これで動かしてみて192.0.0.0/16以外からのxmlrpc.phpへのアクセスが403になってればおkです。
という感じ
一週間くらいこれで回していますが、今のところ、特に問題なく動いているようです。サーバの負荷も激減。てか、踏み台として利用するつもりなら、踏み台のサーバをダウンさせるようなやり方はダメだろ……