序章

WordPressは、人気のある強力なCMS(コンテンツ管理システム)プラットフォームです。 その人気は、WordPressサイトを特に標的とした悪意のあるトラフィックの形で不要な注目を集める可能性があります。

保護または最適化されていないサーバーで、少量の悪意のあるトラフィックを受信した後、問題やエラーが発生する可能性がある場合が多くあります。 これらの攻撃により、システムリソースが使い果たされ、MySQLなどのサービスが応答しなくなります。 これの最も一般的な視覚的な手がかりは、Error connecting to databaseメッセージです。 WebコンソールにOut of Memoryエラーが表示される場合もあります。

このガイドでは、Ubuntu14.04システムでのXML-RPC攻撃からWordPressを保護する方法を説明します。

前提条件

このガイドでは、次のものが必要です。

  • Ubuntu14.04ドロップレット
  • sudo権限を持つroot以外のユーザー( Ubuntu 14.04 を使用した初期サーバーセットアップでは、これをセットアップする方法について説明しています。)

すでにWordPressがUbuntu14.04ドロップレットにインストールされていることを前提としています。 WordPressをインストールする方法はたくさんありますが、一般的な方法は次の2つです。

このチュートリアルのすべてのコマンドは、root以外のユーザーとして実行する必要があります。 コマンドにrootアクセスが必要な場合は、その前にsudoが付きます。 Ubuntu 14.04を使用したサーバーの初期設定では、ユーザーを追加してsudoアクセスを許可する方法について説明しています。

XML-RPCとは何ですか?

WordPressは、 XML-RPC を利用して、関数をリモートで実行します。 人気のあるプラグインJetPackとWordPressモバイルアプリケーションは、WordPressがXML-RPCを使用する方法の2つの優れた例です。 この同じ機能を利用して、WordPressに数千のリクエストを短時間で送信することもできます。 このシナリオは、事実上ブルートフォース攻撃です。

XML-RPC攻撃の認識

XML-RPC攻撃を認識する2つの主な方法は次のとおりです。

  1. WordPressサイトがダウンしているときに「データベースへの接続中にエラーが発生しました」というメッセージが表示される
  2. Webサーバーログで"POST /xmlrpc.php HTTP/1.0”に類似した多くのエントリを検索する

Webサーバーのログファイルの場所は、実行しているLinuxディストリビューションと実行しているWebサーバーによって異なります。

Ubuntu 14.04上のApacheの場合、次のコマンドを使用してXML-RPC攻撃を検索します。

  1. grep xmlrpc /var/log/apache2/access.log

Ubuntu 14.04のNginxの場合、次のコマンドを使用してXML-RPC攻撃を検索します。

  1. grep xmlrpc /var/log/nginx/access.log

上記のコマンドの結果、次の例のように多くの行が出力される場合、WordPressサイトはXML-RPC攻撃を受けています。

access.log
111.222.333.444:80 555.666.777.888 - - [01/Jan/2016:16:33:50 -0500] "POST /xmlrpc.php HTTP/1.0" 200 674 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

この記事の残りの部分では、さらなるXML-RPC攻撃を防ぐための3つの異なる方法に焦点を当てます。

方法1:Jetpackプラグインをインストールする

理想的には、XML-RPC攻撃が発生する前に防止する必要があります。 WordPress用のJetpackプラグインは、Protect関数を使用してXML-RPCマルチコールメソッドリクエストをブロックできます。 Jetpackが有効になっている場合でも、WebサーバーログにXML-RPCエントリが表示されます。 ただし、Jetpackは、これらの悪意のあるログイン試行によるデータベースの負荷を90%近く削減します。

注: Jetpackプラグインをアクティブ化するには、WordPress.comアカウントが必要です。

JetpackはWordPressバックエンドから簡単にインストールできます。 まず、WordPressコントロールパネルにログインし、左側のメニューでプラグイン->[新規追加]を選択します。

WordPress Plugins Menu

Jetpackは、 AddNewページの注目のプラグインセクションに自動的にリストされます。 表示されない場合は、検索ボックスを使用してJetpackを検索できます。

Jetpack Install Page

[今すぐインストール]ボタンをクリックして、Jetpackをダウンロード、解凍、およびインストールします。 正常にインストールされると、ページにプラグインのアクティブ化リンクが表示されます。 そのプラグインのアクティブ化リンクをクリックします。 プラグインページに戻り、上部に Jetpackの準備がほぼ整ったことを示す緑色のヘッダーが表示されます! Connect to WordPress.com ボタンをクリックして、Jetpackのアクティベーションを完了します。

Connect to WordPress.com button

次に、WordPress.comアカウントでログインします。 必要に応じてアカウントを作成することもできます。

Log into WordPress.com form

WordPress.com アカウントにログインすると、Jetpackがアクティブ化されます。 ジャンプスタートを実行するオプションが表示されます。これにより、Jetpackの一般的な機能が自動的に有効になります。 このステップでスキップリンクをクリックします。

Jump Start Screen

ジャンプスタートプロセスをスキップしても、保護機能は自動的に有効になります。 これで、保護機能がアクティブであると表示されるJetpackダッシュボードが表示されます。 Protect 名の横にある歯車をクリックして、IPアドレスがProtectによってブロックされる可能性がないようにホワイトリストに登録します。

Jetpack Dashboard

ホワイトリストに登録するIPv4またはIPv6アドレスを入力し、保存ボタンをクリックして保護ホワイトリストを更新します。

Protect Settings

方法2:a2enconfでblock-xmlrpcを有効にする

a2enconf block-xmlrpc機能は、2015年12月にDigitalOceanWordPressワンクリック画像に追加されました。 これを使用すると、WebサーバーレベルですべてのXML-RPC要求をブロックできます。

注:この方法は、2015年12月以降に作成された DigitalOcean One-Click WordPressInstallでのみ使用できます。

XML-RPCブロックスクリプトを有効にするには、DOWordPressワンクリックイメージがインストールされているドロップレットで次のコマンドを実行します。

  1. sudo a2enconf block-xmlrpc

Apacheを再起動して、変更を有効にします。

  1. sudo service apache2 restart

警告:このメソッドは、JetpackやWordPressモバイルアプリなど、XML-RPCを利用するすべての機能を停止します。

方法3:すべてのXML-RPCトラフィックを手動でブロックする

または、XML-RPCブロックをApacheまたはNginx構成に手動で適用することもできます。

Ubuntu 14.04上のApacheの場合、次のコマンドを使用して構成ファイルを編集します。

  1. sudo nano /etc/apache2/sites-available/000-default.conf

<VirtualHost>タグの間に下の強調表示された行を追加します。

Apache VirtualHostConfig
<VirtualHost>
…    
    <files xmlrpc.php>
      order allow,deny
      deny from all
    </files>
</VirtualHost>

終了したら、このファイルを保存して閉じます。

Webサーバーを再起動して、変更を有効にします。

  1. sudo service apache2 restart

Ubuntu 14.04のNginxの場合、次のコマンドを使用して構成ファイルを編集します(構成ファイルを反映するようにパスを変更します)。

  1. sudo nano /etc/nginx/sites-available/example.com

サーバーブロック内に以下の強調表示された行を追加します。

Nginxサーバーブロックファイル
server {
…
 location /xmlrpc.php {
      deny all;
    }
}

終了したら、このファイルを保存して閉じます。

Webサーバーを再起動して、変更を有効にします。

  1. sudo service nginx restart

警告:このメソッドは、JetpackやWordPressモバイルアプリなど、XML-RPCを利用するすべての機能を停止します。

攻撃軽減手順の確認

攻撃を防ぐためにどの方法を選択した場合でも、それが機能していることを確認する必要があります。

Jetpack Protect機能を有効にすると、XML-RPC要求がWebサーバーのログに継続して表示されます。 頻度を低くする必要があり、Jetpackは、攻撃がデータベースサーバープロセスに与える可能性のある負荷を軽減します。 Jetpackは、攻撃しているIPアドレスも徐々にブロックします。

すべてのXML-RPCトラフィックを手動でブロックした場合でも、ログには試行が表示されますが、結果のエラーコードは200以外になります。 たとえば、Apacheaccess.logファイルのエントリは次のようになります。

access.log
111.222.333.444:80 555.666.777.888 - - [01/Jan/2016:16:33:50 -0500] "POST /xmlrpc.php HTTP/1.0" 500 674 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

結論

悪意のあるXML-RPCトラフィックを軽減するための措置を講じることにより、WordPressサイトはより少ないシステムリソースを消費します。 WordPressサイトがVPSでオフラインになる最も一般的な理由は、システムリソースの枯渇です。 この記事で説明されているXML-RPC攻撃を防ぐ方法は、WordPressサイトをオンラインに保つことを保証します。

WordPress XML-RPCに対するブルートフォース攻撃の詳細については、 Sucuri.net — WordPressXMLRPCに対するブルートフォース増幅攻撃を参照してください。