#011
posted on 2021.01.02

.htaccessでベーシック認証。

サーバーに設置した「.htaccess」ファイルでベーシック認証する方法。

 

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

 

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

 

 

ベーシック認証の仕組み

ベーシック認証(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エンコードされた認証情報>)としてHTTPリクエストに含めて再度サーバーへ返す。
  5. 認証情報が正しければ、サーバーがステータスコード200でリクエスト内容を返す。認証情報が間違っていたら、2.へ戻る。
401 (Unauthorized)は、有効な認証資格が不足していることによりリクエストが適用されないことを示すクライアントエラーのレスポンスコード。403 (Forbidden)と違い再認証が可能。

 

 

「.htaccess」ファイルの記述

ベーシック認証の記述にはサーバーのフルパスが必要。

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

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

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

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

 

 

特定のディレクトリ配下だけベーシック認証を外したい場合

除外したいディレクトリに、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の文字列を返す。

 

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

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

 

 

この記事をシェア

この記事へのコメント

コメントの書き込みはまだありません。

  • コメント内のタグはエスケープ処理され、文字列として出力されます。
  • セキュリティーのため、投稿者のIPアドレスは取得されます。
  • 管理者が内容を不適切と判断したコメントは削除されます。
  • このフォームにはスパム対策として、Googleの提供するreCAPTCHAシステムが導入されています。
    (Google Privacy Policy and Terms of Service.)