この記事は最後に更新してから1年以上経過しています。

xmlrpc.phpへのアクセスについてちょっと考えた

説明

少し前のことですが、こちらのサーバーを何度かダウンさせてしまったのですが、その原因はxmlrpc.phpへアクセスが集中したことによってサーバーが過負荷となってしまったというものでした。すぐにサーバー性能を上げることはできないため、xmlrpc.phpのアクセスを全部拒否するという暫定対応してしまいました。

とりあえずdeny from all

xmlrpc.phpへのアクセス集中(DoS)は、これまでにも何度か盛り上がりを見せ、WordPressシステム本体でもいくつかの対策が行われました。こちらのサイトは最新版のWordPressを使用しているのですが、それでも今回このような事象に遭遇したことに軽い衝撃があったわけですが、サーバー運営側も何らかの対策が必要なのは確かでしょう。

とりあえず現状ですが、.htaccessに次の内容を記述しています。

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

これによりxmlrpc.phpへの全アクセスが無効となり、サーバーが過負荷になる事態は回避できました。WordPressのプラグインでPingbackを無効化するものもあるようですが、プラグインが動作する段階でそれなりにCPUを使用してしまうことを考えて、.htaccessでアクセスをブロックしました。

さてxmlrpc.phへのアクセス集中がどの程度だったかというと、アクセスログを見た限りそれほど多くはなかったので、ある程度のサーバー性能があればもう少し持ちこたえたのかもしれません。抜本的な対策はサーバー性能アップなので、現状よりも高性能なサーバーへの引っ越しということになるでしょう。

xmlrpc.php再開の是非

これとは別にxmlrpc.phpを再開するかどうかも検討しなければなりません。まずはxmlrpc.phpによって実現する機能について整理してみます。

A.Pingbackによる相互リンク
B.スマートフォンアプリなどを利用したサイト状況確認と更新
C.その他のXML-RPC機能

このサイトに限れば、Aは利用していましたが、BとCは利用していない。現状はPingbackを利用できないのが、最大の問題であり、解決したい課題ということになります。

さてアクセス解析ですが、少し前からGoogleアナリティスクにまかせっきりになっており、とんとWebサーバー(ここではApache)のアクセスログには目を向けていなかったわけですが、xmlrpc.phpのアクセスログに頼ることになりそうです。httpd.conf(バーチャルホストの場合はhttpd-vhosts.conf)に次の内容を記述し、xmlrpc.phpのみのアクセスログを別ファイルとして保存するようにしてみます。

SetEnvIf Request_URI xmlrpc\.php xmlrpc
CustomLog "logs/xmlrpc.log" common env=xmlrpc

Apacheを再起動しテストとしてxmlrpc.phpにアクセスした際に保存されたxmlrpc.logの内容は次の通りです。

127.0.0.1 - - [10/Jul/2015:11:40:03 +0900] "GET /xmlrpc.php HTTP/1.1" 405 42
127.0.0.1 - - [10/Jul/2015:12:00:07 +0900] "GET /xmlrpc.php?rsd HTTP/1.1" 200 698

これでxmlrpc.phpのアクセス状況の確認はだいぶ楽になるでしょう。

xmlrpc.phpのアクセスについては、例えば日本だけは許可するといった対応も考えられるのですが、正確な日本のIPアドレスを.htaccessに記述するとそれなりのボリュームになってしまうので、ちょっと躊躇しています。とりあえず、サーバーの引っ越しまでに具体的な対策をまとめたいところです。続く。


最終更新 : 2018年05月27日 10:45

お勧め

get_post_time(2018年5月27日 更新)

mixed get_post_time( [ string $d = 'U' [ , bool $gmt = false [ , mixed $post = null [ , bool $translate = false ] ] ] ] )
パラメータ$dで指定されたフォーマットに従って投稿データの投稿時刻を取得する。

has_tag(2012年1月17日 更新)

bool has_tag( [ mixed $tag = '' [ , mixed $post = null ] ] )
投稿記事に投稿タグが付属しているか調べる。

delete_term_meta(2018年5月27日 更新)

bool delete_term_meta( int $term_id, string $meta_key [ , mixed $meta_value = '' ] )
タームのメタ情報を削除する。

wp_save_post_revision(2023年4月3日 更新)

int | WP_Error | void wp_save_post_revision( int $post_id )
現状の投稿のリビジョンを作成する。

safecss_filter_attr(2023年3月31日 更新)

string safecss_filter_attr( string $css [ , string $deprecated = '' ] )
インラインスタイルをサニタイズする。