BASIC認証の設定方法
完成物:
.htaccessと.htpasswdによるディレクトリ単位のBASIC認証
環境: Apache(Xサーバーなどのレンタルサーバー含む)、Linux
はじめに
特定のディレクトリへのアクセスを制限したい場合、Apacheの .htaccess を使ったBASIC認証が手軽に導入できます。この記事では、.htaccess と .htpasswd を組み合わせてBASIC認証を設定する手順を解説します。
完成イメージ
設定完了後、対象ディレクトリにブラウザでアクセスすると、以下のような認証ダイアログが表示されます。
-
ユーザー名とパスワードを入力しないとコンテンツにアクセスできない
-
認証に失敗すると
401 Unauthorizedが返る -
認証が通れば通常通りコンテンツが表示される
環境構築
Apache が導入済みであれば追加インストールは不要です。SSH接続できる環境であれば、htpasswd コマンドが使えるか確認しておきます。
htpasswd --version
実装
全体構成
/home/ユーザーID/ドメイン名/
├── public_html/ # 公開ディレクトリ
│ └── secret/
│ └── .htaccess # BASIC認証の設定ファイル
└── .htpasswd # 認証情報ファイル(公開ディレクトリ外に置く)
Step 1:.htaccess ファイルを設定する
BASIC認証をかけたいディレクトリに .htaccess ファイルを作成し、以下の内容を記述します。
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/ユーザーID/ドメイン名/.htpasswd
Require valid-user
| ディレクティブ | 説明 |
|---|---|
| AuthType | 認証方式。BASIC認証の場合は Basic を指定 |
| AuthName | 認証ダイアログに表示されるメッセージ |
| AuthUserFile | .htpasswd ファイルの絶対パス |
| Require valid-user | .htpasswd に登録されたユーザーのみ許可 |
💡 なぜこう書くか:
AuthUserFileには必ず絶対パスを指定します。相対パスでは動作しません。また、.htpasswdはウェブ公開ディレクトリ(public_html配下)の外に置くことで、ファイル自体への直接アクセスを防げます。
Step 2:.htpasswd ファイルを作成する
認証に使うユーザー名とパスワードのハッシュを .htpasswd に記述します。
方法A:コマンドで生成する(SSH接続できる場合)
# 新規作成(-c オプションでファイルを新規作成)
htpasswd -c /home/ユーザーID/ドメイン名/.htpasswd ユーザー名
# 2人目以降の追加(-c を付けると上書きされるので注意)
htpasswd /home/ユーザーID/ドメイン名/.htpasswd ユーザー名2
方法B:オンラインツールで生成する(SSH接続できない場合)
-
htpasswd Generator などのツールでユーザー名とパスワードを入力して生成する
-
出力された内容を
.htpasswdとしてサーバーにアップロードする
生成される .htpasswd の中身は以下のような形式です。
username:$apr1$xxxx$xxxxxxxxxxxxxxxxxxxxxxxx
Step 3:設定を確認する
ブラウザで対象ディレクトリのURLにアクセスし、認証ダイアログが表示されることを確認します。
# curlで動作確認する場合
curl -u ユーザー名:パスワード https://example.com/secret/
# 認証なしでアクセスして 401 が返ることを確認
curl -I https://example.com/secret/
ハマりポイント
| 症状 | 原因 | 対処 |
|---|---|---|
| 500 Internal Server Error | .htaccess の記述ミス、またはサーバーが AllowOverride を許可していない | 記述を見直す。サーバー設定で AllowOverride AuthConfig を許可する |
| 401が出続けて認証できない | AuthUserFile のパスが間違っている、またはファイルが存在しない | 絶対パスを再確認。ls -la でファイルの存在を確認する |
| .htpasswd にアクセスできてしまう | .htpasswd を公開ディレクトリ内に置いている | 公開ディレクトリ外に移動し、AuthUserFile のパスを更新する |
| パスワードが通らない | ハッシュ方式が異なる、または .htpasswd の改行コードがCRLF | MD5またはBcryptで再生成する。改行コードをLFに変換する |
改善の余地
-
特定のIPアドレスは認証をスキップするよう
Requireディレクティブを組み合わせる -
HTTPS未導入の場合、BASIC認証の資格情報が平文で流れるためSSL/TLSを導入する
-
より強固なアクセス制御が必要な場合はDigest認証やOAuthへの移行を検討する
まとめ
-
.htaccessにAuthType Basicなどの設定を記述することでディレクトリ単位のBASIC認証が実現できる -
.htpasswdは公開ディレクトリの外に配置し、AuthUserFileには絶対パスを指定する -
SSH接続できる環境では
htpasswdコマンドで安全にパスワードを生成できる -
BASIC認証は簡易的なアクセス制限手段であり、HTTPS環境での利用が前提