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認証をかける方法」を参照してください。

作業の前に

  1. 自分の IP アドレスを確認する: ブラウザーで「IP アドレス 確認」と検索するなどして、管理作業に使う回線の IP アドレスを調べます。この記事では例として 203.0.113.10 を使います。
  2. 元に戻す手段を用意する: 設定を間違えて自分が締め出されたときは、FTP・SFTP、SSH、またはレンタルサーバーのファイルマネージャーで設定を戻します。そのどれかで、WordPress のファイルを編集できることを先に確かめておきます。
  3. 元のファイルをコピーしておく: 編集する .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: 動作を確認する

許可した回線と、許可していない回線(スマートフォンのモバイル回線など)の両方で確認します。

  1. 許可した回線から、ログイン画面と管理画面に入れることを確かめる
  2. 許可していない回線から https://example.com/wp-login.php と https://example.com/wp-admin/ を開き、403 Forbidden になることを確かめる
  3. 許可していない回線からサイトの表側を開き、お問い合わせフォームなどの機能がふだんどおり動くことを確かめる

コマンドで確かめる場合の例です(許可していない回線から実行します)。

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 を使っている場合は、影響を確認してから設定します。

お気軽にご相談ください

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