2026年8月10日

2026年8月10日

NginxでBasic認証を設定する方法|htpasswdの作成・ディレクトリ保護・WordPressのログイン画面

Basic認証は、ページを開く前にブラウザーのダイアログでユーザー名とパスワードを求める仕組みです。Nginx では標準の ngx_http_auth_basic_module で設定でき、開発中のサイトや管理画面への入口を手軽に絞り込めます。

この記事の設定とコマンドは、nginx.org の公式ドキュメント(ngx_http_auth_basic_module)で2026年10月時点の内容を確認し、nginx 1.30 の検証環境で動作を確かめています。

Basic認証の仕組みと注意点

  • ブラウザーは、ユーザー名とパスワードを Base64 で符号化して Authorization ヘッダーで送ります。Base64 は暗号化ではないため、HTTPS と組み合わせて使ってください。HTTP のままだと通信経路で読み取られます。
  • ログアウトの機能はありません。ブラウザーを閉じるまで認証情報が保持されるのが一般的です。
  • 不特定多数のユーザー管理には向きません。少人数で入口を絞る用途に使います。

手順1: htpasswd コマンドを用意する

パスワードファイルは Apache の htpasswd コマンドで作るのが一般的です。Nginx だけの環境ではコマンドが入っていないことがあるので、パッケージを追加します。

# Debian / Ubuntu
sudo apt update
sudo apt install apache2-utils

# RHEL / AlmaLinux / Rocky Linux
sudo dnf install httpd-tools

htpasswd を入れたくない場合は、openssl passwd でも Nginx が読める形式(apr1)のハッシュを作れます(手順2の後半)。

手順2: パスワードファイルを作る

# 新しくファイルを作り、ユーザー alice を登録する(パスワードは対話で入力)
sudo htpasswd -c /etc/nginx/.htpasswd alice

# 2人目以降は -c を付けない(-c はファイルを作り直すので既存の登録が消える)
sudo htpasswd /etc/nginx/.htpasswd bob

# ユーザーを削除する
sudo htpasswd -D /etc/nginx/.htpasswd bob

htpasswd のほかのオプションはhtpasswdでApacheのBasic認証パスワードを作成する方法でも説明しています。ファイルは ユーザー名:パスワードのハッシュ が1行ずつ並ぶ形式です。htpasswd の既定のハッシュは Apache 版の MD5 方式(apr1)で、Nginx はこの形式と crypt() 形式などを読めます。

openssl で作る場合は次のようにします。

# パスワードを対話で入力し、apr1 形式で1行追記する
printf 'alice:%s\n' "$(openssl passwd -apr1)" | sudo tee -a /etc/nginx/.htpasswd

ファイルは Nginx のワーカープロセス(Debian / Ubuntu では www-data、公式パッケージや RHEL 系では nginx)が読める必要があります。ほかのユーザーからは読めないようにしておきます。

# Debian / Ubuntu の場合
sudo chown root:www-data /etc/nginx/.htpasswd
sudo chmod 640 /etc/nginx/.htpasswd

パスワードファイルは公開ディレクトリ(root で指定した場所)の外に置いてください。

手順3: Nginx の設定に auth_basic を追加する

保護したい範囲の location に、2つのディレクティブを書きます。

server {
    listen 443 ssl;
    server_name example.com;
    root /var/www/example.com;

    # /admin-area/ 以下にBasic認証をかける
    location /admin-area/ {
        auth_basic           "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}
ディレクティブ 内容
auth_basic 認証を有効にし、文字列を realm(認証領域の名前)として送る。off で上位の設定から引き継いだ認証を解除する
auth_basic_user_file パスワードファイルのパス

どちらも http・server・location・limit_except に書けます。server に書くとサイト全体が対象になります。

一部のパスだけ認証を外す

サイト全体に認証をかけ、特定の場所だけ外したいときは auth_basic off; を使います。

server {
    # サイト全体に認証をかける
    auth_basic           "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    # /public/ 以下は認証なしで開ける
    location /public/ {
        auth_basic off;
    }
}

手順4: 設定を確認して反映する

# 構文を確認する
sudo nginx -t

# 問題がなければ再読み込みする
sudo systemctl reload nginx

nginx -t でエラーが出た場合は、表示されたファイル名と行番号を直してから再読み込みします。

手順5: 動作を確かめる

ブラウザーで保護したURLを開き、ダイアログが表示されることを確認します。curl を使うと応答コードで確かめられます。

# 認証情報なし → 401 が返る
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/admin-area/

# 正しいユーザー名とパスワード → 200 が返る
curl -s -o /dev/null -w '%{http_code}\n' -u alice https://example.com/admin-area/

-u alice とするとパスワードを対話で聞かれます。ログインできないときはエラーログを見ます。

sudo tail -n 50 /var/log/nginx/error.log
エラーログの内容 主な原因
user "…" was not found in "…" パスワードファイルにそのユーザーが無い
user "…": password mismatch パスワードが違う
open() "…" failed (13: Permission denied) Nginx のワーカーがパスワードファイルを読めない
open() "…" failed (2: No such file or directory) auth_basic_user_file のパスが違う

IPアドレス制限と組み合わせる

社内のIPアドレスからは認証なしで開け、それ以外からはパスワードを求める、という設定は satisfy any で書けます。

location /admin-area/ {
    satisfy any;

    allow 192.0.2.10;   # このIPアドレスからは認証なしで許可
    deny  all;

    auth_basic           "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

satisfy any はどちらかの条件を満たせば許可、satisfy all(既定値)は両方を満たす必要があります。詳しくはNginxでBasic認証とIPアドレス制限を組み合わせる方法で説明しています。

WordPress のログイン画面を保護するときの注意

WordPress の wp-login.php に Basic認証をかける場合、location = /wp-login.php のように個別の location を作ると、その中に PHP を実行する設定も書く必要があります。認証の設定だけを書くと、PHP が実行されずにファイルがそのままダウンロードされたり、404 になったりします。

location = /wp-login.php {
    auth_basic           "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    # PHP-FPM に渡す設定(Debian / Ubuntu の nginx パッケージと PHP 8.3 の例)
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

fastcgi_pass のソケットのパスは、サーバーで使っている PHP-FPM の設定に合わせてください。/wp-admin/ 全体を保護すると、/wp-admin/admin-ajax.php を使うプラグインやテーマが訪問者側で動かなくなることがあります。/wp-admin/ を対象にする場合は、admin-ajax.php を認証の対象から外すか、ログイン画面だけを保護するかを検討してください。

まとめ

  • htpasswd -c でパスワードファイルを作り、2人目以降は -c を付けずに追加する。
  • 保護したい範囲に auth_basic と auth_basic_user_file を書き、nginx -t で確認してから再読み込みする。
  • 一部だけ外すときは auth_basic off;、IPアドレス制限と組み合わせるときは satisfy any を使う。
  • Basic認証のパスワードは暗号化されずに送られるため、HTTPS と組み合わせる。

お気軽にご相談ください

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