#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」ファイルの記述

ベーシック認証の記述にはサーバーのフルパスが必要。(ブラウザ上での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」でなくてもよいが、パスワードのハッシュ化は必須。

 

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

 

「.htpasswd」ファイルの記述内容

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

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

任意のID:ハッシュ化したパスワード

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

test:pmlgNlFILlqkg

 

パスワードのハッシュ化

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

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

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

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

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

 

[ ハッシュ化の仕組み ]

  • ランダムなソルト(元のパスワードに追加する文字列 )により、同じパスワードでも異なるハッシュ値が得られる。
  • 得られたハッシュ値にはアルゴリズム、ソルトの情報が含まれているので、正しいパスワードならば認証ができる。
  • ソルトは、レインボーテーブルを使ってチェックする復号攻撃に対処するための手法で、得られるハッシュ値を一定にさせず、かつ長い文字列にするための仕組みなので、ソルト自体に秘匿性の必要は無い。

 

 

この記事をシェア
この記事のURL

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>

コピー
※ フィールドをクリックでコピーするテキストの編集ができます。

この記事へのコメント

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

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