ApacheやNginxでHTTP Basic認証を設定するには.htpasswdファイルが必要です。このファイルは、ユーザー名とハッシュ化されたパスワードをペアで記録するテキストファイルです。正しいハッシュを生成することが最初のステップになります。このガイドでは、htpasswdとは何か、どのアルゴリズムを選ぶべきか、ApacheとNginxへの設定方法、そしてhtpasswdジェネレーターがなぜブラウザ内で完結すべきなのかを説明します。

.htpasswdファイルとは

.htpasswdファイルはHTTP Basic認証のユーザー名とパスワードのペアを保存します。各行のフォーマットは次の通りです:

ユーザー名:$ハッシュパスワード

Apacheはリクエストを検証する際にこのファイルを参照します。Nginxもauth_basic_user_fileディレクティブで同じフォーマットを使用します。複数ユーザーを記録でき、1行に1ユーザーです。

.htpasswdファイルの例:

alice:$2y$10$abcdefghijklmnopqrstuuVwXyZabcdefghijklmnopqrstuuVwXyZ
bob:$apr1$xyz12345$abcdefghijklmnopqrstuvwx
carol:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

アルゴリズム比較

セキュリティにとってアルゴリズムの選択は重要です:

アルゴリズムプレフィックスセキュリティ説明
bcrypt$2y$推奨ワークファクターを調整可能、低速設計
APR1 MD5$apr1$許容範囲Apache独自のMD5変種、ストレッチング付き
SHA1{SHA}弱いソルトなし、レインボーテーブルに脆弱
プレーンテキスト(なし)皆無本番環境では絶対に使用不可

bcryptを使ってください。 調整可能なワークファクターを持つ唯一のアルゴリズムです。ハードウェアの性能向上に合わせてコストを上げられます。SHA1はソルトがなく、事前計算されたハッシュテーブルで簡単に破られます。プレーンテキストはパスワードをそのまま保存するため、ファイルが漏洩した時点で全アカウントが危険にさらされます。

bcryptハッシュの構造

$2y$10$Rlm8Mzv3bKNv1Pz5h3W1Ou6G7SjkUzW9C5h4RpYNi6TmVjD8sLYi

各フィールドの意味:

  • $2y$ — bcrypt、Apache互換バリアント
  • 10 — コストファクター(2^10 = 1024ラウンド)
  • 残りの53文字はソルト+ハッシュをエンコード

Apache Basic認証の設定

ステップ1 — htpasswdファイルを生成します。htpasswdジェネレーターまたはコマンドラインを使います:

# 最初のユーザーで新規ファイルを作成
htpasswd -cB /etc/apache2/.htpasswd alice

# ユーザーを追加(-cフラグなし — 付けると上書きされます)
htpasswd -B /etc/apache2/.htpasswd bob

-Bフラグはbcryptを強制します。このフラグなしでは多くのシステムでMD5がデフォルトになります。

ステップ2 — バーチャルホストまたはディレクトリの設定:

<Directory "/var/www/html/private">
    AuthType Basic
    AuthName "制限エリア"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Directory>

または保護対象ディレクトリに.htaccessファイルを作成します(サーバー設定でAllowOverride AuthConfigが必要):

AuthType Basic
AuthName "制限エリア"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user

ステップ3 — Apacheをリロード:

sudo systemctl reload apache2

Nginx Basic認証の設定

Nginxにはhtpasswdコマンドが付属していませんが、同じファイルフォーマットを読み込みます。

ステップ1 — パスワードファイルを作成。 ブラウザ内ジェネレーターまたはhtpasswdコマンドを使います:

htpasswd -cB /etc/nginx/.htpasswd alice

ステップ2 — Nginxのlocationブロックを設定:

server {
    listen 80;
    server_name example.com;

    location /private/ {
        auth_basic "制限エリア";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

サーバー全体を保護するには、ディレクティブをlocationブロックの外、serverブロック内に移動します。

ステップ3 — テストとリロード:

sudo nginx -t
sudo systemctl reload nginx

セキュリティ上の注意点

HTTPSを必ず使ってください。 HTTP Basic認証はBase64エンコードされたヘッダーで認証情報を送信するだけです。Base64は暗号化ではなく、単なるエンコード。TLSなしではパスワードが平文で流れているのと同じです。

ファイルのパーミッションを制限する。 .htpasswdファイルはWebサーバープロセスにのみ読み取り可能にします:

sudo chown root:www-data /etc/apache2/.htpasswd
sudo chmod 640 /etc/apache2/.htpasswd

Webルート外に配置する。 公開ディレクトリに置くと誰でもダウンロードできてしまいます。

定期的にパスワードをローテーションする。 他のエントリに影響を与えずに特定ユーザーのパスワードを更新:

htpasswd -B /etc/apache2/.htpasswd alice

重要なシステムにBasic認証だけを使わない。 レート制限なし、セッション管理なし、多要素認証非対応です。実際のユーザーデータを扱うシステムには適切な認証フレームワークを使ってください。

なぜブラウザ内ジェネレーターを使うのか

標準的な方法はapache2-utilsパッケージのhtpasswdコマンドラインツールです。しかしこれはパッケージのインストールとターミナルアクセスが必要です。Apacheユーティリティがインストールされていないマシン上で作業したり、リモートサーバーを設定している場合などに不便です。

オンラインジェネレーターはこの問題を解決しますが、ほとんどのツールはハッシュ化のためにパスワードをサーバーに送信します。これはパスワードの扱いとして根本的に間違っています。

zerotool.devのhtpasswdジェネレーターは完全にブラウザ内で動作します。 bcryptハッシュ(および他のすべてのアルゴリズム)はJavaScriptであなたのマシン上でローカルに実行されます。パスワードはブラウザから外に出ません。サーバーへのリクエストもなく、入力フィールドのログ記録もありません。ブラウザの開発者ツールのNetworkタブを開きながらハッシュを生成してみてください — パスワードフィールドに関連するアウトバウンドリクエストは一切表示されません。

本番環境の認証情報に使っても安全で、サードパーティのWebサービスへのパスワード貼り付けを禁止するセキュリティポリシーにも準拠できます。

htpasswdジェネレーターで生成する

ZeroToolのhtpasswdジェネレーターは以下をサポート:

  • bcrypt(推奨、$2y$プレフィックス)
  • APR1 MD5($apr1$プレフィックス、Apache互換)
  • SHA1({SHA}プレフィックス)
  • プレーンテキスト(テスト専用)

ユーザー名とパスワードを入力し、アルゴリズムを選択して、生成された行をそのまま.htpasswdファイルにコピーするだけです。すべての計算はローカルで実行され、データはブラウザから外に出ません。

htpasswdジェネレーターを開く →