2026年5月20日

2026年5月20日

WordPressのBASIC認証で管理画面を二重保護する方法

はじめに

BASIC認証はWordPressのログイン画面の前に、Webサーバーレベルでユーザー名とパスワードを要求する追加の防御層です。攻撃者がWordPressのログインフォームに到達する前にブロックでき、ブルートフォース攻撃を大幅に減らせます。

症状・原因

  • wp-login.phpへのブルートフォース攻撃がひどい
  • IP制限はできないが、別の防御層を追加したい
  • 管理画面へのアクセスに二段階の認証を設けたい
  • サーバーへの不正アクセス試行でPHP処理のCPU負荷が高い

解決手順

ステップ1:htpasswdファイルを作成する

# htpasswd ユーティリティをインストール(未インストールの場合)
sudo apt install -y apache2-utils

# パスワードファイルを作成(Webサーバーのドキュメントルート外に保存)
sudo htpasswd -c /etc/apache2/.htpasswd wp_guard
# パスワードを入力(例: 強力なランダムパスワードを使用)

# 追加ユーザーを作成(-c は不要、つけると上書き)
sudo htpasswd /etc/apache2/.htpasswd second_user

# ユーザーを削除
sudo htpasswd -D /etc/apache2/.htpasswd old_user

# 作成したファイルを確認
cat /etc/apache2/.htpasswd
# 出力例: wp_guard:$apr1$xxxxxxxx$hash...

# ファイルのパーミッションを設定(Webサーバーが読めるが外部からアクセス不可)
sudo chmod 640 /etc/apache2/.htpasswd
sudo chown www-data:www-data /etc/apache2/.htpasswd

ステップ2:Apacheでwp-login.phpにBASIC認証を設定する

# /var/www/html/.htaccess に追加

# wp-login.php に BASIC 認証を追加
<Files wp-login.php>
    AuthType Basic
    AuthName "WordPress Management"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Files>

# wp-admin ディレクトリにも適用
<IfModule mod_authn_file.c>
<Directory /var/www/html/wp-admin>
    AuthType Basic
    AuthName "WordPress Management"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user

    # admin-ajax.php は BASIC 認証なしで許可
    <Files admin-ajax.php>
        Satisfy Any
        Allow from all
    </Files>
</Directory>
</IfModule>
# Apache の設定テスト
sudo apachectl configtest
sudo systemctl reload apache2

# BASIC 認証が機能しているか確認
curl -I https://example.com/wp-login.php
# HTTP/1.1 401 Authorization Required

# BASIC 認証を通過してアクセス確認
curl -I --user "wp_guard:パスワード" https://example.com/wp-login.php
# HTTP/1.1 200 OK

ステップ3:NginxでBASIC認証を設定する

# /etc/nginx/sites-available/example.com

server {
    listen 443 ssl http2;
    server_name example.com;

    # wp-login.php に BASIC 認証
    location = /wp-login.php {
        auth_basic "WordPress Management";
        auth_basic_user_file /etc/nginx/.htpasswd;

        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # wp-admin ディレクトリに BASIC 認証
    location ^~ /wp-admin/ {
        auth_basic "WordPress Management";
        auth_basic_user_file /etc/nginx/.htpasswd;

        # admin-ajax.php は認証なしで許可
        location = /wp-admin/admin-ajax.php {
            auth_basic off;
            fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        try_files $uri $uri/ /index.php?$args;
    }
}
# Nginx 用の htpasswd ファイルを作成
sudo htpasswd -c /etc/nginx/.htpasswd wp_guard
sudo nginx -t && sudo systemctl reload nginx

ステップ4:WordPressのREST APIやXMLRPCも保護する

# .htaccess: REST API と XMLRPC にも BASIC 認証
<Files xmlrpc.php>
    AuthType Basic
    AuthName "Restricted"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Files>

# REST API への外部アクセスを制限(ログインユーザーのみ許可)
# ※ フロントエンドに REST API が必要な場合は除外設定が必要
// functions.php: 非ログインユーザーの REST API アクセスを制限
add_filter('rest_authentication_errors', function($result) {
    if (!empty($result)) return $result;

    if (!is_user_logged_in()) {
        return new WP_Error(
            'rest_not_logged_in',
            'REST APIへのアクセスにはログインが必要です。',
            ['status' => 401]
        );
    }

    return $result;
});

ステップ5:BASIC認証の認証情報を安全に管理する

# パスワードジェネレーターで強力なパスワードを生成
openssl rand -base64 24
# 出力例: Xk9mP2nL4qR7sT1uV8wZ3yA6bC5dE0fG

# 定期的にパスワードを変更
sudo htpasswd /etc/apache2/.htpasswd wp_guard

# htpasswd ファイルをバックアップ
sudo cp /etc/apache2/.htpasswd /etc/apache2/.htpasswd.bak.$(date +%Y%m%d)
// functions.php: WordPress がパスワードリセットリンクを送る際の
// BASIC 認証情報を自動付与(メールリンクが使えない場合の対策)
// ※ BASIC認証を設定すると wp-login.php?action=rp のリンクも認証が必要になる
// この点を把握した上で設定すること

// ログアウト後のリダイレクト先を変更(BASIC認証対応)
add_filter('logout_redirect', function(string $redirect_to): string {
    // ログアウト後はフロントページに遷移(wp-login.phpはBASIC認証が必要)
    return home_url('/');
});

注意事項

  • BASIC認証は通信が暗号化されていない場合(HTTP)、認証情報が平文で送信されます。必ずHTTPS環境で使用してください
  • admin-ajax.phpをBASIC認証でブロックすると、WooCommerceのカート操作や多くのプラグインの機能が停止します。必ず除外設定を行ってください
  • パスワードリセットメールのリンク(wp-login.php?action=rp)もBASIC認証が必要になります。ユーザーにBASIC認証の認証情報を共有するか、パスワードリセットはWP-CLI経由で行うようにしてください

まとめ

BASIC認証による管理画面保護は①htpasswd -c /etc/apache2/.htpasswd wp_guardでパスワードファイルを作成、②.htaccessまたはnginx.confwp-login.php/wp-admin/にBASIC認証を追加、③admin-ajax.phpは必ず除外(Satisfy Anyまたはauth_basic off)、④curl --userでBASIC認証の動作確認、⑤パスワードはopenssl rand -base64 24で生成した強力なものを使用します。

お気軽にご相談ください

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