#011
posted on 2021.01.02

.htaccessでベーシック認証。

ベーシック認証(Basic認証)の設定を記述した「.htaccess」と、認証用のIDハッシュ化したパスワードを記述した「.htpasswd」の2つのファイルを、ベーシック認証を掛けたいディレクトリに設置する。

認証に関するApacheの公式ドキュメント

 

「.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とパスワードを書いたファイルのフルパス。(この場合はユーザーごとの認証設定なので省略可能だが、Linux/Unix系で「dev」ディレクトリにある何も実行しないファイル「null」を指定している。)

Require : アクセス許可するユーザーを指定。「valid-user」で認証された全てのユーザー。「Require user ユーザー名01 ユーザー名02 …」でユーザーごとに認証を許可。「Require group グループ名01 …」でグループごと。

Files : Filesディレクティブで指定ファイルに直接アクセスできないようdenyを記述。「<Files ~ “^.\ht$”>」とすれば「.ht」で始まる全てのファイルが対象。

※ Apache は通常「.ht*」のファイルへのアクセスを禁止するように設定されているが、念の為denyの記述とファイルのパーミッションは604にする。

 

サーバーのフルパスが分からない場合はPHPファイルをアップしてマジック定数で調べる。

<?php echo __FILE__; ?>

__FILE__ : ファイルのフルパスとファイル名が出力さる。(例: 「/Applications/MAMP/htdocs/index.php」)

 

特定のディレクトリ配下だけベーシック認証を外したい場合は、Satisfyディレクティブを記述した「.htaccess」ファイルを外したいディレクトリに設置。

Satisfy Any

 

 

「.htpasswd」ファイルの記述

IDとハッシュ化したパスワードの組み合わせだけを記述した「.htpasswd」ファイルを作成する。

ファイル名は「.htpasswd」でなくてもよいが、パスワードのハッシュ化は必須。

 

crypt、MD5、bcrypt(Blowfish)など、ハッシュ化アルゴリズムの対応環境はWebサーバー(Apacheなど)のバージョンや設定に依る。cryptは最大8文字、MD5は最大255文字まで有効などの制約もある。(どれも安全性が高くないのでセキュリティとは考えずに運用する。)

 

「.htpasswd」ファイルの記述内容
任意のID:ハッシュ化したパスワード

IDとハッシュ化したパスワードだけを「:」で結合して1行で記述。

複数のID・パスワードがある場合は1行1組で改行して記述。

 

IDが「test」、パスワードが「test」の場合の記述例。

test:pmlgNlFILlqkg

 

パスワードのハッシュ化

複数のアルゴリズムに対応した無償のオンラインツールが多数あるのでそちらを利用する。

下記は、PHPのcrypt()関数でハッシュ化する場合。

$str = 'パスワード';
echo crypt($str, substr(crypt($str), -2));

crypt( ハッシュ化したい文字列, ソルト文字列 ) : ソルトを連結したハッシュを返す。

substr( $string, $length ) : 指定された位置から$lengthバイト分の$stringの文字列を返す。

 

ランダムなソルト(元のパスワードに追加する文字列 )により、同じパスワードでも異なるハッシュ値が得られる。得られたハッシュ値にはアルゴリズム、ソルトの情報が含まれているので、正しいパスワードからは認証ができる。

ソルトは、レインボーテーブルを使ってチェックする復号攻撃に対処するための手法で、ハッシュ値と連結させてハッシュ値を一定にさせず、かつ長い文字列にするための仕組みなので、ソルト自体に秘匿性は必要無い。

 

 

 

 

ベーシック認証の仕組み

ベーシック認証(Basic認証)は、HTTP(Hyper Text Transfer Protocol)で定義されている最も基本的な認証方式。

ほぼ全てのWebサーバーとブラウザが対応している。

  1. クライアントがサーバーへHTTPリクエスト。サーバーの認証設定の状態は不明なので、HTTPリクエストに認証用のAuthorizationヘッダーは含めずに送られる。
  2. Basic認証が設定されている場合、サーバーがWWW-Authenticate (WWW-Authenticate: <認証タイプ> realm=<保護領域の名前>)ヘッダーを含めた401ステータスのレスポンスをクライアントへ返す。
  3. クライアントがプロンプトを表示して、ユーザーにIDとパスワードを要求する。
  4. クライアントが、入力されたIDとパスワードをコロンで結合「ID:パスワード」、Base64でエンコードしてからAuthorization (Authorization: <認証タイプ> <Base64エンコードされた認証情報>)ヘッダーとしてリクエストに含めて再度サーバーへ返す。
  5. 認証情報が正しければ、サーバーがステータスコード200でリクエスト内容を返す。認証情報が間違っていたら、2.へ戻る。
401 (Unauthorized)は、有効な認証資格が不足していることによりリクエストが適用されないことを示すクライアントエラーのレスポンスコード。403 (Forbidden)と違い再認証が可能。

 

 

この記事をシェア