ミケネコ研究所 ミケネコ研究所 > htaccess リファレンス > ユーザー認証

ユーザー認証

パスワードを用いて、リソースへのアクセスを制限します。


解説


ユーザー認証について

パスワードを使い、ディレクトリ全体にアクセス制限を敷くことができます。

認証の実験として、ディレクトリ http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/passwd/ 以下にパスワード認証を施しました。ユーザ名 guest 、パスワード guest を入力すると、中を閲覧することができます。(*)

非常に少ない手間で、簡単にパスワード認証を行うことができますし、暗号の強度は個人レベルで破ることの出来ないものです。しかし、ネットワーク上を暗号化しないで送られるために、.htaccess を用いた認証は、実質的にオンラインショッピングやインターネットバンキングに耐え得る強度はありません。高度な商業的セキュアを実現したいときは、CGI や SSL 等による別のアプローチを検討しましょう。

* : このパスワード領域には、あなたの興味を引くようなものは何もありません。guest/guest で入室できると書いてあるのに、どういうわけかパスワードクラックを試みようとする人が後を絶ちません。パスワードクラックツールを用いて毎秒 10〜50回の辞書アタックを試みるケースが多いです。私の root のパスワードが隠されているなどと考えているのでしたら、その努力は報われないでしょう。宝箱はからっぽです。

パスワードによるユーザー認証のかけ方

パスワードによるユーザー認証は、

この 2 ファイルだけで実現できます。

まず、パスワード認証をかけたいディレクトリに、次の内容の .htaccess ファイルを作成します。

# パスワード認証
AuthUserFile /home/user/ ... /.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter username and password"
AuthType Basic

require valid-user

次に、telnet 等の端末から、AuthUserFile で指定したパスまで実際に移動した後、htpasswd コマンドを使ってパスワードファイル .htpasswd を作成します。コマンドラインから次のように叩いてください。ここでは、ユーザ名:guest、パスワード名:guestにする例を示します。

% htpasswd -c .htpasswd guest
Adding user guest
New password: guest           (←実際には表示されません)
Re-type new password: guest   (←実際には表示されません)

これで、ユーザ/パスワード対が .htpasswd ファイルに登録されました。htpasswd コマンドの -c オプションは、.htpasswd ファイルを新規作成するためのものです。2 回めからは不要です。htpasswd コマンドを繰り返すことによって、ユーザを追加できます。

できた .htpasswd ファイルの中身は、「ユーザ名:暗号化されたパスワード」のように保存されています。次の例は、一般的な Unix 標準 の DES 暗号化手法を用いたパスワードファイルです。

guest:68E3RJk2UWcR6
mikeneko:9if0d57366sER

また、OS に FreeBSD を用いている場合は、次のように MD5 で暗号化されているでしょう。

guest:$1$Ym$QjALgqM4cYu3YtAHM.BXw1
mikeneko:$1$SH$ugktB.sT9YE97CVHJzkL4.

あとでユーザを削除したくなったときは、テキストエディタなどでそのユーザの行ごと削除しましょう。

パスワードファイルを隠す必要性

ここに悪人がひとりいたとしましょう。この不届き者は、mikeneko さんのパスワードをどうにかして手に入れようと考えています。

パスワードクラックツールを 24 時間動かして、ひたすら総当りの計算をさせることによって、mikeneko さんのパスワードは実は "matatabi" であったということを突き止めるには Pentium マシンで 3000 年ほどかかるところを、.htpasswd ファイルに書かれてある暗号文字

mikeneko:9if0d57366sER

を閲覧されてしまうことによって、解読にかかる時間は 1 年くらいにまで短縮されてしまいます。しかし、通常はそれでも十分な強度を持っています。あなた個人のパスワード解読のために、わざわざ電気代を消費して 1 年間もマシンを動かしっぱなしにしようと思う人は、そうそういません。

とはいえ、悪人が侵入する時間を稼ぐために、パスワードファイル自体を見えなくするのは、よい心がけでしょう。いろいろ方法がありますが・・・

  1. .htpasswd ファイルを、WWW サーバのドキュメントツリー(~/public_html/) 下に置かない。
  2. .htaccess ファイルへ、<Files> を使って .htpasswd ファイルの閲覧を拒否させる記述を書く。
  3. .htaccess ファイルに、「AddHandler cgi-script htpasswd」の一行を加える。

このどれかを実行しましょう。1 番目が王道です。3 番目が手軽でお勧めです。

特定のホストからは、パスワードを要求しない設定

さて、ここまで読んだあなたは、パスワード認証が実現できました。

しかし、普段のアクセスからは通常どおりパスワードを要求しますが、親しい友人や、関連会社からなど、特定のホストからのアクセスには、パスワードを要求させたくないケースもあります。これは、Satisfy により実現できます。次の設定は、〜.myfriend.ne.jp からのアクセスに対してはパスワード認証を要求しない例です。

AuthUserFile /home/user/ ... /.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter username and password"
AuthType Basic

require valid-user
Satisfy any

order deny,allow
allow from .myfriend.ne.jp(←myfriend.ne.jp からは認証不要)
deny from all

Satisfy any を宣言することで、「ホスト制限を通過する」あるいは「パスワード認証を通過する」のどちらかひとつを満たせば、コンテンツを閲覧できる資格を有します。

ユーザー認証のパフォーマンス問題

.htpasswd ファイルのような、テキストファイルによるユーザー管理は最も手軽ですが、パスワードファイルを上から下へと線形で読むために、実際のところ効率はよくありません。ユーザ数が数 100 単位に増えてきた時に、サーバのパフォーマンスは低下します。

多くのユーザを扱う場合は、パスワードファイルに DBM などのデータベースを使うことも検討できますが、ここまでの規模になったならば、htaccess によるユーザ管理はやめることをお勧めします。

ユーザー名とパスワードを URL に含める方法

さて、これは .htaccess とは関係のないトピックですが、知っておいて損はありません。パスワード認証において、ブラウザに認証作業を任せることができます。次に示すのは、前述したパスワード認証のかかった URL です。ここにアクセスすると認証画面になります。

http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/passwd/

ところが、次のようなURLをタイプしてアクセスすると、ブラウザに認証作業を任せることができます。赤い部分に注目してください。

http://mikeneko:matatabi@www.mikeneko.ne.jp/~lab/web/htaccess/passwd/

この URL には、本当にユーザー制限がかかっていて、本当にユーザ名 mikeneko、パスワード matatabi という認証が必要なのですが、URL に混ぜてしまったことで、認証をブラウザーに任せてしまいました。あなたは認証画面を見ることはなかったでしょう。

これを利用して、たとえばこのような URL をブックマークに登録することで、毎回わずらわしい認証作業を省略することが可能になります。(大幅なセキュリティ低下の見返りに、)あなたのPCは便利になるでしょう。


リファレンス


AuthAuthoritative

AuthAuthoritative [ on | off ]
AuthAuthoritative on

認証が失敗した際に、他の Authorization モジュールへ権限を移行するかを指定します。優先順位は、コンフィグレーションと、modules.c ファイルに記述されています。

デフォルトは on です。on にした場合、認証に失敗したらそこで終わります。off にした場合、認証に失敗したらより下位の Authorizationモジュールへ、権限を移行します。

AuthGroupFile

AuthGroupFile filename
AuthGroupFile /home/user/seq/.grouplist
AuthGroupFile /dev/null

ユーザー認証のための、グループファイルを設定します。require group を宣言したときのみ必要です。filename は絶対パスです。

グループファイルの各行は、グループ名: ユーザ ユーザ... と指定します。 例:

group1: guest mike buchi
group2: sironeko

AuthName

AuthName auth-domain
AuthName "Please enter username and password"

ユーザ認証の際に、ここで記述した文字列をクライアントに渡し、認証を促します。文字列がスペースを含むようであれば、ダブルクウォートで囲いましょう。

AuthType

AuthType type
AuthType Basic

ユーザー認証機構の種別を指定します。type には、Basic(ベーシック認証)と Digest(MD5 ダイジェスト認証)が選べますが、ダイジェスト認証はブラウザの対応が無いので、事実上 Basic を選択します。

AuthUserFile

AuthUserFile filename
AuthUserFile /home/user/seq/.htpasswd

ユーザー認証のための、ユーザ一覧ファイルを設定します。filename は絶対パスです。

require

require user user-id user-id ...
require group group-name group-name ...
require valid-user
require user guest mike buchi

ユーザー認証の際に、認証させるユーザを指定します。第一引数により、パスワード認証の機会を与えるメンバーを指定します。

require user
ユーザ単位で、認証の機会を与えます。パスワードファイルに登録されているユーザのうち、user-id だけに認証の機会を与え、ほかは拒否します。
require group
グループ単位で、認証の機会を与えます。パスワードファイルに登録されているユーザのうち、group-name グループに属している場合だけに認証の機会を与え、ほかは拒否します。AuthGroupFile であらかじめグループ定義を行う必要があります。
valid-user
全てのユーザに、認証の機会を与えます。通常、これを選択します。

require<Limit> セクション内でグループ化されている場合は、<Limit> で指示されているメソッドでのアクセスを制限し認証にかけます。他のメソッドは制限しません。require<Limit> セクション内になければ、すべてのメソッドを制限します。

Satisfy

Satisfy [ any | all ]
Satisfy any

ユーザ認証とホスト制限に関するアクセスポリシーを定義します。

Satisfy all
クライアントがホスト制限を通過し、そしてユーザ認証を通過することの、両方を要求します。これはデフォルトです。
Satisfy any
ホスト制限を通過するか、またはユーザ認証を通過するかの、どちらかがクライアントに要求されます。

ミケネコの htaccess リファレンス http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/