2026年5月20日

2026年5月20日

WordPressのXML-RPCを無効化してセキュリティを高める方法

はじめに

XML-RPC(xmlrpc.php)はWordPressの古いリモートアクセスAPIです。現在はREST APIに置き換えられていますが、攻撃者にブルートフォース攻撃やDDoS増幅攻撃に悪用されます。使用していない場合は無効化するのが最善策です。

症状・原因

  • サーバーログにxmlrpc.phpへの大量アクセスが記録されている
  • Wordfenceから「XML-RPC経由のブルートフォース攻撃」の通知が届く
  • xmlrpc.phpへのリクエストによるサーバー負荷が高い
  • セキュリティスキャンで「XML-RPC有効」と指摘された

解決手順

ステップ1:XML-RPCを使用しているか確認する

# XML-RPC が有効か確認
curl -s -X POST https://example.com/xmlrpc.php \
    -H "Content-Type: text/xml" \
    -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName></methodCall>' | \
    grep -o "methodName>[^<]*"

# 応答があれば XML-RPC は有効
# 403 または空応答なら無効化済み

# 使用しているプラグインの確認(XML-RPCを使うもの)
# Jetpack, WooCommerce, Wordfence, UpdraftPlus など
wp plugin list --format=table | grep -i "jetpack\|mobile"

ステップ2:functions.phpで無効化する

// functions.php: XML-RPC を完全に無効化
// ① xmlrpc.php へのアクセスを503で返す
add_filter('xmlrpc_enabled', '__return_false');

// ② XML-RPC のメソッドを全て削除
add_filter('xmlrpc_methods', function(array $methods): array {
    return [];
});

// ③ system.multicall による一括攻撃をブロック
// (xmlrpc_enabled だけでは防げない場合に追加)
add_action('xmlrpc_call', function(string $method): void {
    if ($method === 'system.multicall') {
        wp_die(
            'XML-RPC system.multicall は無効化されています。',
            'XML-RPC Error',
            ['response' => 403]
        );
    }
});

ステップ3:.htaccessで完全ブロックする(推奨)

# .htaccess: xmlrpc.php への全アクセスをブロック
# PHP 処理自体をさせないのでサーバー負荷が最小

<Files xmlrpc.php>
    Order Deny,Allow
    Deny from all
</Files>

# または RewriteRule でブロック(Apache 2.4+)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^xmlrpc\.php$ - [F,L]
</IfModule>
# 設定後に確認
curl -I https://example.com/xmlrpc.php
# HTTP/1.1 403 Forbidden が返ること

# ブロックされているか詳細確認
curl -v https://example.com/xmlrpc.php 2>&1 | grep -E "< HTTP|< Server"

ステップ4:Nginxで無効化する

# /etc/nginx/sites-available/example.com
server {
    # xmlrpc.php へのアクセスを拒否
    location = /xmlrpc.php {
        deny all;
        access_log off;
        log_not_found off;
    }
}

ステップ5:Jetpackなど必要な場合の対応

// functions.php: Jetpack など特定のIPからのみXML-RPCを許可
add_filter('xmlrpc_enabled', function(bool $enabled): bool {
    // Jetpack のサーバー IP(変更される可能性があるため要確認)
    $jetpack_ips = [
        '76.74.255.0/28',
        '76.74.255.16/28',
        '208.80.154.0/22',
        '198.181.116.0/22',
    ];

    $remote_ip = $_SERVER['REMOTE_ADDR'] ?? '';

    foreach ($jetpack_ips as $range) {
        [$subnet, $bits] = explode('/', $range);
        if ((ip2long($remote_ip) & ~((1 << (32 - (int)$bits)) - 1))
            === ip2long($subnet)) {
            return true; // Jetpack IP は許可
        }
    }

    return false; // その他は拒否
});
# Jetpack を使用している場合の代替案:
# 1. Jetpack の REST API 接続に切り替える(推奨)
#    → Jetpack の設定でREST API接続を有効にする
# 2. Jetpack なしの代替プラグインを使用する
#    → WP Crontrol, UpdraftPlus(バックアップ)などは XML-RPC 不要

# XML-RPC を無効化しても影響しないプラグイン
wp plugin list --format=csv --fields=name,version | while IFS=, read name version; do
    # XML-RPC 依存を確認(プラグインのソースコードを grep)
    grep -r "xmlrpc\|XMLRPC" /var/www/html/wp-content/plugins/$name/ \
        --include="*.php" -l 2>/dev/null
done
// functions.php: XML-RPC ログを記録して使用状況を把握する(無効化前の調査用)
add_action('xmlrpc_call', function(string $method): void {
    error_log(sprintf(
        '[XMLRPC] method=%s ip=%s ua=%s',
        $method,
        $_SERVER['REMOTE_ADDR'] ?? 'unknown',
        $_SERVER['HTTP_USER_AGENT'] ?? 'unknown'
    ));
});
// → /var/log/php_errors.log または error_log の設定先を確認
// 1週間記録してから xmlrpc_call が呼ばれているか確認
// 呼ばれていなければ安全に無効化できる

注意事項

  • Jetpackを使用している場合、XML-RPCを完全にブロックするとJetpackの一部機能(統計・セキュリティスキャン等)が動作しなくなる可能性があります。JetpackはREST API接続も対応していますので、そちらへの移行を検討してください
  • WordPressのモバイルアプリ(WordPress.com App)もXML-RPCを使用しています。アプリから投稿している場合は影響があります
  • xmlrpc_enabledフィルターでfalseを返しても、xmlrpc.phpへのHTTPリクエスト自体はサーバーに届きます。サーバー負荷を本当に減らすには.htaccessでファイルレベルでブロックするのが最善です

まとめ

XML-RPC無効化は①curl -X POSTで有効状態を確認、②add_filter('xmlrpc_enabled', '__return_false')でWordPressレベルで無効化、③.htaccessでサーバーレベルでブロック(これが最も効果的)、④Jetpack使用時はJetpack IPからのみ許可するか REST API 接続に移行、⑤無効化前に1週間ログを記録して依存関係を確認します。

お気軽にご相談ください

お見積りへ お問い合わせへ