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/.htaccessOrder Deny,AllowAllow from {自分のIP}を設定、③ Allow from all でAJAXを許可、④curl -I https://example.com/wp-admin/で403を確認・admin-ajax.phpは許可されていることを確認、⑤動的IPの場合はVPNまたはCloudflare Accessの利用を検討します。

お気軽にご相談ください

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