wordpressのXML-RPC(xmlrpc)のセキュリティ懸念とXML-RPC(xmlrpc)を無効化する方法

WordPressのXML-RPC(xmlrpc)の役割

WordPressのXML-RPCというプロトコルについて説明しますが、WordPressを使用していても聞き慣れない人が多いのではないでしょうか?
XML-RPCはWordPressサイトと外部アプリケーションとの間でデータの双方向通信を可能にするプロトコルです。
XML-RPCを使用することで、WordPressの機能を利用したり、WordPressサイトのコンテンツを管理したりするための外部アプリケーションやサービスを作成できます。
例えばWordPressサイトに対してリモート操作で投稿を作成したり、記事を編集したり、コメントを追加したりすることができてしまうのです。
なんだかAPIのようですね。

これにより、WordPressサイトをより柔軟にカスタマイズし、他のアプリケーションと連携させることもできます。
上手く使えば、WordPressの投稿を他のサイトやアプリケーションに同期させる、WordPressサイトをモバイルアプリで管理する、WordPressサイトの統合検索を実装する、などできることは色々あるので便利な機能です。

以下のようなエンドポイントを使い、APIのように操作が可能です。

https://ドメイン名/xmlrpc.php

これだけ聞くと、エンジニアにとってはとても利便性が良く、使ってみたい機能ではありますよね。
私なんかはとりあえず使ってみて色々試してみたくなります。

ただし、XML-RPCはセキュリティ上の懸念があるため、最新のWordPressバージョンではデフォルトで無効になっている場合があります。
安全な使用を確保するためには、セキュリティ対策を実施する必要があるのです。
(他のAPIでもセキュリティの懸念は普通あるので一緒ですけどね)

XML-RPC(xmlrpc)はなぜセキュリティ上の懸念があるのか

XML-RPCにはいくつかのセキュリティ上の懸念があります。
その主な理由は次のとおりです。

1. 拡張性の問題
上述したように、XML-RPCはWordPressサイトに対して、非常に柔軟なリモートアクセスを提供しています。
いわばある程度なんでもできてしまうわけです。
しかし、柔軟ゆえに、悪意のある攻撃者が悪用する隙が生まれる可能性があります。
アクセス制限や認証基盤が整っていない場合、攻撃者は不正な操作が可能になります。

2. 脆弱性の悪用
過去にXML-RPCにはいくつかの脆弱性が報告されています。
都度修正されてはいるものの、新たな脆弱性が発見された場合、攻撃者はWordPressサイトに対する様々な攻撃を行うことができます。
過去事例で言えば、XML-RPCを介して不正なコマンドを実行したり、不正なデータを送信したりすることが可能だったりします。

3. ブルートフォース攻撃のリスク
XML-RPCエンドポイントは、通常のWordPressログインフォームと同様に、ユーザー名とパスワードの認証が必要です。
よって攻撃者はXML-RPCを利用して、ブルートフォース攻撃を行うことができます。
ブルートフォース攻撃とは、多数のユーザー名とパスワードの組み合わせを試行し、不正なアクセスを試みることです。

これらの懸念を踏まえて、WordPressの最新バージョンではXML-RPCがデフォルトで無効になっていることがあります。
利用したい場合は、セキュリティ系のプラグインや各種設定周りを変更することで、セキュリティを向上させるなど工夫をした上で使用した方がよいです。

XML-RPC(xmlrpc)を無効化する方法

上記のように使用する上でリスクもあるため、リモートアクセスをしないのであれば無効化してしまった方がよいです。
WordPressでXML-RPCを無効化する方法はいくつかありますので、例を紹介します。

1. WordPressの設定から無効化する:
最新のWordPressバージョンでは、管理画面の「設定」→「書き込み」に進み、「リモート投稿 (XML-RPC) を有効にする」オプションを無効にすることができます。
知識が無くてもできるので、これが一番てっとり早いと思います。

2. セキュリティプラグインを使用する:
XML-RPCを無効にできるセキュリティ系のプラグインが多々あります。
一般的なWordPressセキュリティプラグインの設定画面で、XML-RPCを無効にするオプションを探してみてください。

3. テーマのfunctions.phpファイルにコードを追加する:
テーマのfunctions.phpファイルに次のコードを追加することで、XML-RPCを無効にすることができます。

add_filter( 'xmlrpc_enabled', '__return_false' );

このコードをfunctions.phpファイルの末尾に追加すれば良いだけです。

4. .htaccessファイルを編集する:
アプリケーションに辿り着く前にアクセスを拒否したい場合は、WordPressのルートディレクトリにある.htaccessファイルを編集し、次の行を追加します。

# Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
  order deny,allow
  deny from all
</Files>

これにより、XML-RPCリクエストをブロックできます。

これらの方法のいずれかを使用して、WordPressのXML-RPCを無効化することができます。
対策後に、再度以下のようなエンドポイントにアクセスし、404エラーや「このページにはアクセスできません」などのメッセージが表示されていれば、無効化されていることは確認できます。

https://ドメイン名/xmlrpc.php