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ファイルにコピーするだけです。すべての計算はローカルで実行され、データはブラウザから外に出ません。