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 などで元に戻せる状態を確保してから設定します。