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.confでwp-login.phpと/wp-admin/にBASIC認証を追加、③admin-ajax.phpは必ず除外(Satisfy Anyまたはauth_basic off)、④curl --userでBASIC認証の動作確認、⑤パスワードはopenssl rand -base64 24で生成した強力なものを使用します。