.htaccessでベーシック認証。
サーバーに設置した「.htaccess」ファイルでベーシック認証する方法。
以下の2つのファイルをサーバーの認証を掛けたいディレクトリに設置しておく。
- 「.htaccess」ファイル : ベーシック認証の設定を記述。
- 「.htpasswd」ファイル : 「有効なID」と「ハッシュ化したパスワード」の組み合わせを記述。
※ 認証に関するApacheの公式ドキュメント。
※ ベーシック認証はApacheの拡張機能なので、サーバーがNginxなどの場合は設定を変更しなければ利用できない。
- ベーシック認証を掛けるトップページファイルがあるディレクトリのサーバー内でのパスを調べる。
- ベーシック認証(Basic認証)の設定を記述した「.htaccess」ファイルを作成。
- 認証用の「パスワード」をハッシュ化。
- 認証用の「ID」と「ハッシュ化したパスワード」を記述した「.htpasswd」ファイルを作成。
- 作成した2つのファイルをベーシック認証のアクセス制限を掛けたいディレクトリに設置する。
ベーシック認証の仕組み
ベーシック認証(Basic認証)は、HTTP(Hyper Text Transfer Protocol)で定義されている最も基本的な認証方式。
ほぼ全てのWebサーバーとブラウザが対応している。
- クライアントがサーバーへHTTPリクエスト。(このとき、サーバー側の認証設定の状態は不明なので、HTTPリクエストに認証用の「Authorizationヘッダー」は含めずに送られる。)
- サーバーにBasic認証が設定されている場合、サーバーが「WWW-Authenticateヘッダー」(WWW-Authenticate: <認証タイプ> realm=<保護領域の名前>)を含めた「401」ステータスのレスポンスをクライアントへ返す。
- クライアントがプロンプトを表示して、ユーザーに「ID」と「パスワード」を要求する。
- クライアントが、ユーザーによって入力された「ID」と「パスワード」をコロンで結合(「ID:パスワード」)し、Base64でエンコードしてから「Authorizationヘッダー」(Authorization: <認証タイプ> <Base64エンコードされた認証情報>)としてHTTPリクエストに含めて再度サーバーへ返す。
- サーバーが認証情報を確認し、正しければステータスコード「200」でリクエスト内容を返す。認証情報が間違っていたら、2.へ戻る。
[ プロンプトでの認証作業を省略したい場合 ]
ベーシック認証が掛けられているページにアクセスする度にプロンプトでの認証作業が面倒な場合は、URL自体にIDとパスワードを含めてアクセスすれば省略できる。
- 「URLスキーム//認証ID:パスワード@アクセス先」でリクエストすると、自動的に認証される。
※ 下記は、認証IDが「test」、パスワードも「test」でベーシック認証が掛けられている「https://memo.ag2works.tokyo」にアクセスする場合の例。
https://test:test@memo.ag2works.tokyo
「.htaccess」ファイルの記述
ベーシック認証の記述にはサーバー内でのフルパスが必要。(ブラウザ上でのURLではない。)
サーバーのフルパスが分からない場合はPHPファイルをアップしてマジック定数で調べる。
<?php echo __FILE__; ?>
__FILE__ : ファイルのフルパスとファイル名が出力される。(例: 「/Applications/MAMP/htdocs/index.php」)
「.htaccess」ファイルに設定を記述
AuthType Basic
AuthName "Input 'ID' and 'Password'"
AuthUserfile /サーバー内のフルパス/.htpasswd
AuthGroupfile /dev/null
Require valid-user
<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
AuthType : 認証タイプを設定。Basic、Digestなど。
AuthName : 認証領域を区別するための名前。(クライアント側でプロンプトに表示されるので、ユーザーへのアラートメッセージに使われる。)
AuthUserfile : 認証のためのIDとパスワードを記述した「.htpasswd」ファイルの場所を、サーバーのルートディレクトリからのフルパスで指定。
AuthGroupfile : 「Require」で「group」を指定した場合の認証するグループのIDとパスワードを書いたファイルのフルパス。(今回の場合は「valid-user」を設定しているので省略可能だが、Linux/Unix系で「dev」ディレクトリにある何も実行しないファイル「null」を指定している。)
Require : 認証後にアクセス許可するユーザーを指定。「valid-user」の指定で認証された全てのユーザー。「Require user ユーザー名01 ユーザー名02 …」でユーザーごとに認証を許可。「Require group グループ名01 …」でグループごと。
Files : Filesディレクティブ。指定したファイルが命令対象になる。ここでは、指定ファイルへの直接アクセスを拒否するようにdenyを記述。(ファイルの指定には正規表現を使って、「.」で始まって次に「htpasswd」か「htaccess」が続いて終わるファイル名を指定している。)
※ Apache は通常「.ht*」のファイルへのアクセスを禁止するように初期設定されているが、念の為denyの記述とファイルのパーミッションは604にする。
特定のディレクトリ配下だけベーシック認証を外したい場合
除外したいディレクトリに、Satisfyディレクティブを記述した「.htaccess」ファイルを設置。
Satisfy Any
「.htpasswd」ファイルの記述
「ID」と「ハッシュ化したパスワード」の組み合わせをコロン「:」で繋いだだけの文字列を記述した「.htpasswd」ファイルを作成する。
※ ファイル名は「.htpasswd」でなくてもよいが、パスワードのハッシュ化は必須。(ファイル名は慣例的に「.htpasswd」が使われる。)
crypt、MD5、bcrypt(Blowfish)など、ハッシュ化アルゴリズムの対応環境はWebサーバー(Apacheなど)のバージョンや設定に依る。
※ cryptは最大8文字、MD5は最大255文字まで有効などの制約もある。(どれも安全性が高くないので秘匿性を保証するセキュリティーとは考えずに運用する。)
[ ハッシュ化の仕組み ]
- ランダムな「ソルト」(元のパスワードに追加する文字列 )により、同じパスワードからでも異なるハッシュ値が得られる。
- 得られたハッシュ値にはアルゴリズム、ソルトの情報が含まれているので、正しいパスワードならハッシュ化されたパスワードとの認証ができる。
- ソルトは、レインボーテーブルを使って認証確認する復号攻撃に対処するための手法で、得られるハッシュ値を一定にさせず、かつ長い文字列にするための仕組みなので、ソルト自体に秘匿の必要は無い。
パスワードをハッシュ化
有効な認証用のパスワードをハッシュ化する。
複数のアルゴリズムに対応した無償のオンラインツールが多数あるので、ツールを検索してハッシュ化した方が簡単。
下記は、PHPのcrypt()関数でハッシュ化する場合。
$str = 'パスワード';
echo crypt($str, substr(crypt($str), -2));
crypt(ハッシュ化したい文字列, ソルト文字列) : ソルトを連結したハッシュを返す。
substr($string, $length) : 指定された位置から$lengthバイト分の$stringの文字列を返す。
「.htpasswd」ファイルの記述内容
IDとハッシュ化したパスワードだけを「:」で結合して1行で記述。
複数のID・パスワードがある場合は1行1組で改行して記述。
任意のID:ハッシュ化したパスワード
IDが「test」、パスワードが「test」の場合の記述例。
test:pmlgNlFILlqkg
- HTTP 認証
- 「HTTP」の仕組みをおさらいしよう(その4) (1/2)
- BASIC認証(Password)
- ベーシック認証を設定する(AuthType)
- Apache の Basic認証 に関するWebサイト :技術クリップ
- PHP で Basic認証のパスワードハッシュ を生成する :Tips & FAQ
- .htaccess の使い方・設定方法
https://memo.ag2works.tokyo/post-388/
.htaccessでベーシック認証。 | memo メモ [AG2WORKS]
<a href="https://memo.ag2works.tokyo/post-388/" target="_blank" rel="noopener">.htaccessでベーシック認証。 | memo メモ [AG2WORKS]</a>
この記事へのコメント
コメントの書き込みはまだありません。