WordPressは世界中で使われているCMSであるがゆえに、自動化された攻撃の標的になりやすいプラットフォームです。適切な設定をしないまま放置すると、不正ログイン・マルウェア設置・サイト改ざんのリスクがあります。ここでは優先度の高いセキュリティ対策をまとめます。

チェックリスト一覧

項目優先度方法
WordPressバージョンを非表示にするfunctions.php / プラグイン
管理画面URL(/wp-admin)を変更するプラグイン(WPS Hide Login等)
XML-RPCを無効化する.htaccess
ログイン失敗回数を制限するプラグイン(Limit Login Attempts等)
管理者ユーザー名を admin 以外にする管理画面で変更
ファイルエディタを無効化するwp-config.php
REST APIのユーザー列挙を制限するfunctions.php
セキュリティヘッダーを設定する.htaccess
WP本体・プラグイン・テーマを最新に保つ管理画面で更新
不要なプラグインを削除する管理画面で削除

バージョン情報の非表示

WordPressのバージョンが外部から確認できると、既知の脆弱性を突いた攻撃の糸口になります。functions.php に以下を追加します。

// WordPressバージョン非表示
remove_action('wp_head', 'wp_generator');
RSSフィードや readme.html からも確認できる場合があります。readme.html はサーバーから削除するか、.htaccess でアクセスを拒否します。

<Files readme.html>
  Order allow,deny
  Deny from all
</Files>
## XML-RPCの無効化

XML-RPCは本来リモート投稿用の機能ですが、現在はJetpackや一部プラグイン以外ではほとんど使われません。ブルートフォース攻撃の踏み台にされやすいため、不要なら無効化します。

<Files xmlrpc.php>
  Order allow,deny
  Deny from all
</Files>
## ファイルエディタの無効化

管理画面からテーマ・プラグインのファイルを直接編集できる機能は、万が一管理画面に侵入された場合に悪用されます。wp-config.php に以下を追加して無効化します。

define('DISALLOW_FILE_EDIT', true);
## REST APIのユーザー列挙防止

/wp-json/wp/v2/users にアクセスすると管理者のユーザー名が取得できる場合があります。functions.php で制限できます。

add_filter('rest_endpoints', function($endpoints) {
    if (isset($endpoints['/wp/v2/users'])) {
        unset($endpoints['/wp/v2/users']);
    }
    if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
        unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
    }
    return $endpoints;
});
## よくある見落とし

WordPressセキュリティチェックツールでは、外部からアクセスできるバージョン情報・XML-RPC・REST APIユーザー列挙など11項目を自動チェックできます。