ユーザー認証
パスワードを用いて、リソースへのアクセスを制限します。
■ 解説
パスワードを使い、ディレクトリ全体にアクセス制限を敷くことができます。
認証の実験として、ディレクトリ https://mikenekolab.org/~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 番目が王道です。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 によるユーザ管理はやめることをお勧めします。
さて、これは .htaccess とは関係のないトピックですが、知っておいて損はありません。パスワード認証において、ブラウザに認証作業を任せることができます。次に示すのは、前述したパスワード認証のかかった URL です。ここにアクセスすると認証画面になります。
https://mikenekolab.org/~lab/web/htaccess/passwd/
ところが、次のようなURLをタイプしてアクセスすると、ブラウザに認証作業を任せることができます。赤い部分に注目してください。
http://mikeneko:matatabi@www.mikeneko.ne.jp/~lab/web/htaccess/passwd/
この URL には、本当にユーザー制限がかかっていて、本当にユーザ名 mikeneko、パスワード matatabi という認証が必要なのですが、URL に混ぜてしまったことで、認証をブラウザーに任せてしまいました。あなたは認証画面を見ることはなかったでしょう。
これを利用して、たとえばこのような URL をブックマークに登録することで、毎回わずらわしい認証作業を省略することが可能になります。(大幅なセキュリティ低下の見返りに、)あなたのPCは便利になるでしょう。
■ リファレンス
AuthAuthoritative [ on | off ]
AuthAuthoritative on
認証が失敗した際に、他の Authorization モジュールへ権限を移行するかを指定します。優先順位は、コンフィグレーションと、modules.c ファイルに記述されています。
デフォルトは on です。on にした場合、認証に失敗したらそこで終わります。off にした場合、認証に失敗したらより下位の Authorizationモジュールへ、権限を移行します。
AuthGroupFile filename
AuthGroupFile /home/user/seq/.grouplist AuthGroupFile /dev/null
ユーザー認証のための、グループファイルを設定します。require group を宣言したときのみ必要です。filename は絶対パスです。
グループファイルの各行は、グループ名: ユーザ ユーザ... と指定します。 例:
group1: guest mike buchi group2: sironeko
AuthName auth-domain
AuthName "Please enter username and password"
ユーザ認証の際に、ここで記述した文字列をクライアントに渡し、認証を促します。文字列がスペースを含むようであれば、ダブルクウォートで囲いましょう。
AuthType type
AuthType Basic
ユーザー認証機構の種別を指定します。type には、Basic(ベーシック認証)と Digest(MD5 ダイジェスト認証)が選べますが、ダイジェスト認証はブラウザの対応が無いので、事実上 Basic を選択します。
AuthUserFile filename
AuthUserFile /home/user/seq/.htpasswd
ユーザー認証のための、ユーザ一覧ファイルを設定します。filename は絶対パスです。
require user user-id user-id ... require group group-name group-name ... require valid-user
require user guest mike buchi
ユーザー認証の際に、認証させるユーザを指定します。第一引数により、パスワード認証の機会を与えるメンバーを指定します。
require が <Limit> セクション内でグループ化されている場合は、<Limit> で指示されているメソッドでのアクセスを制限し認証にかけます。他のメソッドは制限しません。require が <Limit> セクション内になければ、すべてのメソッドを制限します。
Satisfy [ any | all ]
Satisfy any
ユーザ認証とホスト制限に関するアクセスポリシーを定義します。