#011
posted on 2021.01.02 (Sat) 2023.11.07 (Tue)

.htaccessでベーシック認証。

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

 

以下の2つのファイルをサーバーの認証を掛けたいディレクトリに設置しておく。

  • 「.htaccess」ファイル : ベーシック認証の設定を記述。
  • 「.htpasswd」ファイル : 「有効なID」と「ハッシュ化したパスワード」の組み合わせを記述。

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

※ ベーシック認証はApacheの拡張機能なので、サーバーがNginxなどの場合は設定を変更しなければ利用できない。

 

  1. ベーシック認証を掛けるトップページファイルがあるディレクトリのサーバー内でのパスを調べる。
  2. ベーシック認証(Basic認証)の設定を記述した「.htaccess」ファイルを作成。
  3. 認証用の「パスワード」をハッシュ化。
  4. 認証用の「ID」と「ハッシュ化したパスワード」を記述した「.htpasswd」ファイルを作成。
  5. 作成した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)と違い再認証が可能。

 

[ プロンプトでの認証作業を省略したい場合 ]

ベーシック認証が掛けられているページにアクセスする度にプロンプトでの認証作業が面倒な場合は、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

 

 

この記事のURL

https://memo.ag2works.tokyo/post-388/

Copyコピー
この記事のタイトル

.htaccessでベーシック認証。 | memo メモ [AG2WORKS]

Copyコピー
この記事のリンクタグ

<a href="https://memo.ag2works.tokyo/post-388/" target="_blank" rel="noopener">.htaccessでベーシック認証。 | memo メモ [AG2WORKS]</a>

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

この記事へのコメント

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

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