2026年10月5日

2026年10月5日

WordPressのwp-login.phpへのアクセスを制限する方法|IP制限・Basic認証と締め出されない手順

wp-login.php へのアクセスを制限するなら、管理者の接続元 IP が決まっている場合はサーバー設定での IP 制限、決まっていない場合は Basic 認証を重ねる方法が効果的です。どちらも WordPress に届く前に不正なログイン試行を止められるため、サーバーの負荷も下げられます。この記事では、制限をかける前の確認事項、Apache と Nginx の設定例、CDN やプロキシ経由のときの注意点、XML-RPC など別の入口の塞ぎ方、そして自分が締め出されたときの戻し方までを説明します。

制限をかける前に確認すること

wp-login.php は管理者のログインだけに使われているわけではありません。何も考えずに遮断すると、訪問者向けの機能が壊れることがあります。次の点を先に確かめてください。

  • 管理者以外がログインするか:会員サイト、購読者登録、コメント投稿のためのログインがあるなら、IP 制限は使えません。その場合は試行回数の制限と二要素認証で守ります。
  • パスワード保護の投稿があるか:投稿や固定ページの「パスワード保護」は、閲覧者が入力したパスワードを wp-login.php?action=postpass に送って処理します。単純に遮断すると、閲覧者が保護ページを開けなくなります。
  • パスワードの再設定:パスワードを忘れたときの再設定画面も wp-login.php です。許可した IP からしか使えなくなる点を理解しておきます。
  • 元に戻す手段:FTP、SFTP、ホスティングのファイルマネージャーのいずれかで .htaccess やサーバー設定を編集できることを確認します。設定を誤って自分が入れなくなったとき、これが唯一の戻り道になります。

また、許可する IP を決めるために、自分の回線のグローバル IP アドレスを確認しておきます。家庭用の回線やモバイル回線は IP が変わることが多いので、固定 IP でない場合は後述の Basic 認証のほうが向いています。

Apache(.htaccess)で IP 制限する

Apache 2.4 では Require ip を使います。WordPress のルートにある .htaccess のバックアップを取ってから、# BEGIN WordPress の行より上に書きます。# BEGIN WordPress と # END WordPress の間は WordPress がパーマリンク設定の保存時に書き換えるため、その中には入れません。

<Files "wp-login.php">
    Require ip 203.0.113.10
    Require ip 198.51.100.0/24
</Files>

Require ip を複数行並べると、どれか一つに当てはまれば許可されます。ネット上には Order deny,allow と Deny from all を使う例も多くありますが、これは Apache 2.2 の書式で、Apache 2.4 では互換モジュールが無効だと 500 エラーになります。新しく書くなら 2.4 の書式にそろえてください。また、共用サーバーによっては .htaccess での Require が許可されていない場合があるので、反映されないときはホスティング会社の案内を確認します。

パスワード保護の投稿を使っている場合

パスワード保護の投稿があるサイトでは、action=postpass だけを誰でも使えるようにします。mod_rewrite を使って、許可 IP 以外かつ postpass 以外のアクセスだけを拒否する書き方です。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} wp-login\.php$
RewriteCond %{QUERY_STRING} !(^|&)action=postpass(&|$)
RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.10$
RewriteRule ^ - [F]
</IfModule>

許可する IP を増やす場合は、RewriteCond %{REMOTE_ADDR} の行を IP ごとに追加します。この行はすべて「かつ」で結ばれるので、どの許可 IP にも当てはまらないときだけ拒否されます。

Nginx で IP 制限する

Nginx では、location = /wp-login.php を作り、その中で allow と deny を書きます。

location = /wp-login.php {
    allow 203.0.113.10;
    allow 198.51.100.0/24;
    deny all;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/run/php/php-fpm.sock;  # 環境に合わせて変更
}

ここでつまずきやすいのが PHP の受け渡しです。完全一致の location = は、通常 PHP を処理している location ~ \.php$ より優先されるため、このブロックの中にも PHP-FPM への受け渡しを書かないと、wp-login.php のソースがそのままダウンロードされたり、正しく動かなかったりします。ソケットのパスや include するファイルは、既存の .php 用の location に合わせてください。設定後は nginx -t で文法を確かめてから再読み込みします。

CDN やプロキシを経由している場合

Cloudflare などの CDN やロードバランサーを経由していると、サーバーから見た接続元は訪問者ではなく CDN の IP になります。このままでは IP 制限が意図どおりに働きません。

Apache なら mod_remoteip、Nginx なら real_ip モジュールで、信頼するプロキシの IP 範囲を指定したうえで、本来の接続元をヘッダーから復元する設定が必要です。信頼するプロキシを限定せずに X-Forwarded-For をそのまま信じると、攻撃者がヘッダーを偽って制限をすり抜けられるので注意してください。CDN 自体にアクセス制限のルール機能がある場合は、そちらで制限する方法もあります。機能の名称や無料で使える範囲は CDN ごとに異なり、変わることもあります(2026年10月現在)。

IP が固定でないなら Basic 認証を重ねる

IP を固定できない場合は、wp-login.php の前に Basic 認証をかけます。WordPress のログイン画面の前にもう一段パスワードを求めるので、自動化された総当たり攻撃の多くはここで止まります。

# パスワードファイルは公開ディレクトリの外に作る
htpasswd -c /home/user/.htpasswd loginuser
<Files "wp-login.php">
    AuthType Basic
    AuthName "Restricted"
    AuthUserFile /home/user/.htpasswd
    Require valid-user
</Files>

AuthUserFile にはサーバー上のフルパスを書きます。Basic 認証のパスワードは暗号化されずに送られるので、サイトが HTTPS で動いていることが前提です。また、パスワード保護の投稿を使っている場合は IP 制限と同じく閲覧者に影響が出るため、前述の確認を済ませてから導入してください。

別の入口もあわせて塞ぐ

wp-login.php を制限しても、ログインを試せる入口はほかにもあります。

  • xmlrpc.php:XML-RPC はユーザー名とパスワードでの認証を受け付けるため、wp-login.php を制限しても総当たりに使われることがあります。使っていなければ遮断を検討します。
  • アプリケーションパスワード:WordPress 5.6 以降の機能で、REST API などの認証に使われます。使っていなければ、wp_is_application_passwords_available フィルターで無効にできます。
// mu-plugin などに記述(使っていない場合のみ)
add_filter( 'wp_is_application_passwords_available', '__return_false' );

なお、/wp-admin/ 全体に IP 制限をかける場合は、admin-ajax.php を除外してください。テーマやプラグインがサイトの表側から admin-ajax.php を呼んでいることがあり、遮断すると訪問者向けの機能が動かなくなります。

プラグインでの対策との組み合わせ

サーバー設定を触れない場合や、会員がログインするサイトでは、プラグインで守ります。代表的なものとして、ログイン試行回数を制限する Limit Login Attempts Reloaded、ファイアウォールと二要素認証を備えた Wordfence Security、ログイン URL を変更する WPS Hide Login などがあります。機能の範囲や無料版と有料版の分け方はバージョンによって変わるので、導入時に公式の説明を確認してください。

ログイン URL の変更は、自動化された攻撃のアクセスを減らす効果はありますが、URL が知られれば意味がなくなるため、IP 制限や二要素認証の代わりにはなりません。また、これらのプラグインはログイン試行の IP アドレスを記録します。IP アドレスは個人に関する情報として扱われることがあるので、記録していることをプライバシーポリシーに記載しておくと安心です。

動作確認と、締め出されたときの戻し方

設定後は、許可した回線と許可していない回線(スマートフォンのモバイル回線など)の両方から wp-login.php を開き、前者はログイン画面、後者は 403 になることを確かめます。パスワード保護の投稿を使っているなら、許可していない回線から保護ページのパスワード入力が通ることも確認します。

自分が締め出された場合は、FTP やファイルマネージャーで .htaccess を開き、追加した部分を削除するか、行頭に # を付けて無効化します。バックアップを取っていれば、そのファイルに戻すのが早い方法です。プラグインで締め出された場合は、wp-content/plugins/ 内の該当フォルダ名を一時的に変更すると無効化でき、ログイン後に名前を戻して設定を見直せます。

まとめ

  • 管理者の IP が固定なら、サーバー設定で wp-login.php に IP 制限をかけるのが効果的です。固定でなければ Basic 認証を重ねます。
  • 制限の前に、会員ログインやパスワード保護の投稿など、wp-login.php を使う機能が無いかを確認します。
  • Apache 2.4 では Require ip を使い、# BEGIN WordPress より上に書きます。Nginx では location の中に PHP の受け渡しも書きます。
  • CDN 経由なら本来の接続元 IP を復元する設定が必要です。xmlrpc.php とアプリケーションパスワードという別の入口も確認します。
  • 作業前にバックアップを取り、FTP などで元に戻せる状態を確保してから設定します。

お気軽にご相談ください

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