2026年5月20日
2026年5月20日
WordPressのwp-adminを.htaccessで保護する方法
はじめに
WordPressの管理画面(/wp-admin/)はサイトで最も重要なセクションです。.htaccessでアクセス制限を設けることで、攻撃者が管理画面にたどり着く前にブロックできます。設定ミスで自分もロックアウトされることがあるため、慎重に実施してください。
症状・原因
- wp-adminへの不正アクセス試行がログに多数記録されている
- 管理画面をIP制限で保護したい
- ブルートフォース攻撃でサーバー負荷が上がっている
- 特定のIPアドレスまたはネットワークからのみ管理画面にアクセスしたい
解決手順
ステップ1:現在のIPアドレスを確認する
# 自分のグローバルIPアドレスを確認
curl -s https://ipinfo.io/ip
# または
curl -s https://api.ipify.org
# 社内ネットワークの場合はCIDR表記を確認
ip route | grep "scope link"
# または
hostname -I
ステップ2:wp-adminディレクトリを保護する
# /var/www/html/wp-admin/.htaccess(新規作成)
# wp-admin ディレクトリに直接 .htaccess を配置
Order Deny,Allow
Deny from all
# 許可するIPアドレス(自分のIPに変更)
Allow from 203.0.113.1
Allow from 198.51.100.0/24
# 複数の拠点がある場合
Allow from 192.0.2.0/24
# /var/www/html/.htaccess(ルートの .htaccess に追加)
# ルートから wp-admin を制限する方法
<IfModule mod_rewrite.c>
RewriteEngine On
# wp-admin への直接アクセスを制限(admin-ajax.php は除外)
RewriteCond %{REQUEST_URI} ^/wp-admin/
RewriteCond %{REQUEST_URI} !^/wp-admin/admin-ajax\.php$
RewriteCond %{REMOTE_ADDR} !^203\.0\.113\.1$
RewriteCond %{REMOTE_ADDR} !^198\.51\.100\.
RewriteRule ^ - [F,L]
</IfModule>
ステップ3:admin-ajax.phpを正しく許可する
# /var/www/html/wp-admin/.htaccess
# admin-ajax.php は WooCommerce や多くのプラグインが使用するため許可が必要
Order Deny,Allow
Deny from all
# 自分のIPを許可
Allow from 203.0.113.1
# admin-ajax.php はすべてのユーザーに許可(フロントエンドのAJAXに必要)
<Files admin-ajax.php>
Order Allow,Deny
Allow from all
</Files>
# admin-post.php も一部プラグインが使用
<Files admin-post.php>
Order Allow,Deny
Allow from all
</Files>
ステップ4:設定をテストする
# 許可されていないIPからのアクセスが403になるか確認
curl -I https://example.com/wp-admin/
# HTTP/1.1 403 Forbidden が返ること
# admin-ajax.php は許可されているか確認
curl -I https://example.com/wp-admin/admin-ajax.php
# HTTP/1.1 400 または 200 が返ること(403ではないこと)
# wp-login.php も保護されているか確認
curl -I https://example.com/wp-login.php
# 403 が返ること(.htaccess で保護している場合)
# 自分のIPからは正常にアクセスできるか確認(ブラウザで)
# https://example.com/wp-admin/ → ログイン画面が表示されること
ステップ5:動的IPの場合の対処法
// functions.php: 動的IPの場合はWordPress側でアクセス制御
// ※ .htaccess のIP制限の代替手段
add_action('admin_init', function(): void {
// AJAXリクエストは除外
if (wp_doing_ajax()) return;
if (wp_doing_cron()) return;
// 許可するIPのリスト(定期的に更新が必要)
$allowed_ips = get_option('admin_allowed_ips', []);
if (empty($allowed_ips)) return; // 設定がない場合はスキップ
$current_ip = $_SERVER['REMOTE_ADDR'] ?? '';
// Cloudflare 使用時は CF-Connecting-IP を使用
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$current_ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
}
foreach ($allowed_ips as $allowed) {
if ($current_ip === trim($allowed)) return; // アクセス許可
}
wp_die(
'このIPアドレスからは管理画面にアクセスできません。',
'アクセス拒否',
['response' => 403]
);
});
# VPN を使用する方法(最も柔軟)
# ・WireGuard や OpenVPN でVPNを構築
# ・VPNのIPアドレスのみを .htaccess で許可
# ・場所を問わず固定IPでアクセス可能
# Cloudflare Access を使用する方法
# ・Cloudflare Zero Trust でアクセス制御
# ・メールOTPやSSO認証を追加できる
# ・完全無料(最大50ユーザー)
注意事項
- 設定前に必ずFTPやSSHでサーバーにアクセスできることを確認してください。
.htaccessの設定ミスで自分もロックアウトされた場合、FTP/SSH経由で.htaccessを修正する必要があります admin-ajax.phpをブロックすると、WooCommerceのカート更新・コンタクトフォームの送信・プラグインの多くの機能が動作しなくなります。必ずすべてのユーザーに許可してください- 動的IPアドレスを使用している場合、
.htaccessのIP制限は使いづらい場合があります。その場合はVPNの使用を検討してください
まとめ
wp-adminの.htaccess保護は①curl https://ipinfo.io/ipで自分のIPを確認、②/wp-admin/.htaccessにOrder Deny,AllowとAllow from {自分のIP}を設定、③でAJAXを許可、④curl -I https://example.com/wp-admin/で403を確認・admin-ajax.phpは許可されていることを確認、⑤動的IPの場合はVPNまたはCloudflare Accessの利用を検討します。