2026年7月24日
2026年7月24日
WordPressのwp-adminを保護する方法|IPアドレス制限(.htaccess・Nginx)と注意点
WordPress の管理画面(/wp-admin/)とログイン画面(/wp-login.php)は、どのサイトでも同じ場所にあるため、総当たりのログイン攻撃を受けやすい場所です。管理作業をする場所が決まっているなら、この2か所に入れる IP アドレスを限定すると、それ以外からのアクセスを Web サーバーの段階で拒否できます。
この記事では、Apache の .htaccess と Nginx で、管理画面とログイン画面への IP アドレス制限をかける手順を説明します。特定の IP アドレスだけを拒否したい場合は「WordPressで特定のIPアドレスをブロックする方法」を参照してください。
この方法が向いている場合・向かない場合
| 向いている | 向かない |
|---|---|
| 管理作業をするのが会社や自宅など、決まった場所だけ | 外出先やスマートフォンなど、いろいろな場所から管理画面に入る |
| 固定 IP アドレスや VPN の出口 IP アドレスがある | 接続のたびに IP アドレスが変わる回線しかない |
| ログインするのが運営者だけ | 会員登録やログインを訪問者にも使ってもらうサイト |
IP アドレスが変わる環境では、IP 制限の代わりに Basic 認証で管理画面にもう一段パスワードをかける方法があります。「WordPressの管理画面にBasic認証をかける方法」を参照してください。
作業の前に
- 自分の IP アドレスを確認する: ブラウザーで「IP アドレス 確認」と検索するなどして、管理作業に使う回線の IP アドレスを調べます。この記事では例として
203.0.113.10を使います。 - 元に戻す手段を用意する: 設定を間違えて自分が締め出されたときは、FTP・SFTP、SSH、またはレンタルサーバーのファイルマネージャーで設定を戻します。そのどれかで、WordPress のファイルを編集できることを先に確かめておきます。
- 元のファイルをコピーしておく: 編集する
.htaccessや設定ファイルは、編集前の状態を保存しておきます。
Apache の場合
Apache 2.4 では、アクセスを許可する条件を Require ディレクティブで書きます。古い Order / Allow / Deny は Apache 2.2 の書き方で、Apache 2.4 では互換モジュール(mod_access_compat)がある場合だけ動きます。新しく書くときは Require を使ってください。
手順1: ログイン画面(wp-login.php)を制限する
WordPress のルート(wp-config.php があるディレクトリ)の .htaccess を開き、先頭(# BEGIN WordPress の行より上)に次を追加します。
<Files "wp-login.php">
Require ip 203.0.113.10
</Files>
許可する IP アドレスが複数ある場合は、Require ip の行を増やします(どれか1つに一致すれば許可されます)。198.51.100.0/24 のように範囲で書くこともできます。
# BEGIN WordPress から # END WordPress の間は WordPress が書き換えることがあるため、その間には書かないでください。
手順2: 管理画面(wp-admin)を制限する
wp-admin ディレクトリの中に .htaccess を新しく作り、次の内容を書きます。
Require ip 203.0.113.10
# サイトの表側の機能が使う admin-ajax.php は全員に許可する
<Files "admin-ajax.php">
Require all granted
</Files>
wp-admin/admin-ajax.php は、管理画面だけでなく、サイトの表側のフォーム送信や「もっと見る」ボタンなど、プラグインやテーマの機能からも呼び出されます。ここまで制限すると、訪問者が使う機能が動かなくなることがあるため、このファイルだけは許可しておきます。
フォームの送信先に wp-admin/admin-post.php を使うプラグインがある場合は、同じように許可が必要です。その場合は <Files> の部分を次のように書き換えます。
<FilesMatch "^(admin-ajax|admin-post)\.php$">
Require all granted
</FilesMatch>
.htaccess の Require が効かない場合
.htaccess で Require を使うには、サーバー側の設定で AllowOverride に AuthConfig(または All)が含まれている必要があります。含まれていないと、500 エラーになるか、書いた内容が無視されます。VPS などで Apache を自分で管理している場合は、バーチャルホストの設定に <Directory> で同じ内容を書く方法もあります。<Directory> はサーバーの設定ファイル用で、.htaccess の中には書けません。
Nginx の場合
Nginx には .htaccess がないため、サイトの設定ファイル(server ブロック)に書きます。次は Ubuntu の標準的な PHP-FPM 構成の例です。fastcgi_pass の値と include するファイルは、すでにある location ~ \.php$ の設定に合わせてください。
# ログイン画面は許可した IP アドレスだけ
location = /wp-login.php {
allow 203.0.113.10;
deny all;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# admin-ajax.php は全員に許可する
location = /wp-admin/admin-ajax.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# それ以外の wp-admin は許可した IP アドレスだけ
location ^~ /wp-admin/ {
allow 203.0.113.10;
deny all;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
location = …は完全一致で、ほかのlocationより優先されます。/wp-admin/に^~を付けているのは、serverブロックにあるlocation ~ \.php$が先に一致して制限をすり抜けるのを防ぐためです。そのため、中に PHP の処理を入れ直しています。- Nginx の
allow/denyは上から順に評価され、最初に一致したものが使われます。
設定したら、構文を確認してから再読み込みします。
sudo nginx -t
sudo systemctl reload nginx
手順3: 動作を確認する
許可した回線と、許可していない回線(スマートフォンのモバイル回線など)の両方で確認します。
- 許可した回線から、ログイン画面と管理画面に入れることを確かめる
- 許可していない回線から
https://example.com/wp-login.phpとhttps://example.com/wp-admin/を開き、403 Forbiddenになることを確かめる - 許可していない回線からサイトの表側を開き、お問い合わせフォームなどの機能がふだんどおり動くことを確かめる
コマンドで確かめる場合の例です(許可していない回線から実行します)。
curl -sI https://example.com/wp-login.php | head -1
curl -sI https://example.com/wp-admin/ | head -1
どちらも 403 が返れば、制限が働いています。
注意点
パスワード保護したページへの影響
WordPress の「パスワード保護」した投稿やページでは、訪問者が入力したパスワードが wp-login.php?action=postpass に送られます。ログイン画面を IP アドレスで制限すると、許可していない訪問者はパスワード保護したページを開けなくなります。パスワード保護のページを公開している場合は、ログイン画面の制限をやめて管理画面だけを制限するか、Basic 認証など別の方法を検討してください。
同じ理由で、訪問者にユーザー登録やパスワードの再設定をしてもらうサイト(会員サイトなど)も、ログイン画面の IP 制限は向きません。
CDN やプロキシを使っている場合
Cloudflare などの CDN やロードバランサーを経由していると、Web サーバーから見えるアクセス元は CDN やプロキシの IP アドレスになります。この状態では、自分の IP アドレスを許可しても締め出されたり、制限が意図どおりに働かなかったりします。Apache の mod_remoteip、Nginx の real_ip_header などで本当のアクセス元を扱う設定が必要です。
締め出されたときの戻し方
許可した IP アドレスが変わるなどして管理画面に入れなくなった場合は、FTP・SFTP やファイルマネージャーで次のように戻します。
- Apache:
wp-admin/.htaccessの名前を変えるか削除し、ルートの.htaccessから手順1で追加した<Files "wp-login.php">の部分を消す - Nginx: 追加した
locationを削除して設定を再読み込みする(SSH で作業します)
403 エラーの原因の調べ方は「WordPressの管理画面で403エラーが出る場合の対処法」も参照してください。
IP 制限だけに頼らない
IP 制限は、許可していない場所からの攻撃を減らす方法の1つです。管理者アカウントのパスワードを強いものにする、2段階認証を使う、WordPress とプラグインを更新する、といった対策と組み合わせて使います。
まとめ
- 管理作業の場所と IP アドレスが決まっているなら、
wp-login.phpと/wp-admin/に入れる IP アドレスを限定できます。 - Apache 2.4 では
Require ipを使います。ログイン画面はルートの.htaccessの<Files>、管理画面はwp-admin/.htaccessに書きます。 admin-ajax.php(必要ならadmin-post.phpも)は、サイトの表側の機能が使うため全員に許可します。- Nginx では
location = /wp-login.phpとlocation ^~ /wp-admin/にallow/denyを書き、PHP の処理も入れます。 - パスワード保護ページや会員機能がある場合、CDN を使っている場合は、影響を確認してから設定します。