Perl Script Laboratory

基本認証の方法

当サイトのコンテンツをhtmlソースごとそのままコピーして自分のサイトのコンテンツにしてしまう人がいます。そのような行為は当サイトの著作権を侵害する行為ですので絶対にしないでください。発見し次第断固とした措置を取ります。

基本認証は、HTTP/1.0の規格で、特定のユーザーのみにアクセスを許可したり、また特定のユーザーのアクセスを拒否したりするのに用いられる、現状では唯一の方法です。ここでは、具体的なケースごとの設定方法と注意事項、自動パスワード発行システムについて触れたいと思います。

基本認証のしくみ

誰かがブラウザから制限をかけた領域(URL)にリクエストを出すと、サーバは認証のための処理を行います。具体的にはユーザー名とパスワードを入力するためのダイアログボックスが現れ、そこに入力をしてサーバにデータを送ります。サーバは入力されたIDとパスワードが許可されているユーザのものかどうかをあるファイルを参照して調べ、許可されているものであればリクエストされたページを出力し、許可されていない場合にはHTTPレスポンスステータスコード"401"のエラー(Authorization Required)を表示します。

基本認証では、パスワードファイルで指定したユーザを初めに認証し、その上で特定のユーザまたはグループに許可を与えるという2重の構造になっています。そのため、「private」というディレクトリにはパスワード登録者全員を通過させ、その上で、privateディレクトリの下にある「a」ディレクトリには誰と誰だけ、「b」ディレクトリにはどのグループだけアクセス許可を与える、といったことが可能になります。

▲TOP


アクセス制御ファイル(Access Controll File)

上の説明で"あるファイル"といったのが、ここで説明するアクセス制御ファイル(ACF)です。アクセス制御ファイルには2種類あります。

ファイル名 有効範囲 設定者レベル
httpd.conf サーバ全体に対して有効 サーバ管理者(root)
.htaccess ディレクトリ(下の階層をすべて含む)単位で有効 ディレクトリに対して書き込み権限を有する者

ここでは私たちが指定し得る".htaccess"について説明します。

ファイルの内容のひな型はだいたい次の通りです。サーバによってフォーマットが異なる場合があるので、詳しくはサーバ管理者または詳しい方にお尋ねください。

<directory /home/iwanami/privat>
AuthUserFile /home/iwanami/private/.private
AuthGroupFile /dev/null
AuthName ByPassword
AuthType Basic

<limit post get>
order deny,allow
deny from all
allow .or.jp
require user ichiro jiro saburo
</limit>
</directory>
  • <directory [pathname]>…</directory>

    このファイルで設定したアクセス制御が適用されるディレクトリを指定します。このタグを省略するとこのファイルがあるディレクトリが適用されます。

  • AuthUserFile [パスワードファイル名(フルパス)]

    アクセス許可を与えるユーザ名とパスワードのデータの入ったファイル名をフルパスで指定します。

  • AuthGroupFile [グループファイル名(フルパス)]

    グループファイル名をフルパスで指定します。

    グループファイルとは?
    グループファイルの中身は、

    group_name_1: user1 user2 user3…
    group_name_2: user4 user5 user6…

    というように、初めにグループ名とコロン、あとは半角スペースで区切ったユーザー名の羅列からなるファイルです。
    このファイルを指定しておけば、<limit></limit> タグの間にrequireを使ってグループ名を指定することで、このアクセス制御ファイル自体は変更せずに、グループファイルの情報だけを変更すれば済むようになります。

  • AuthName [制限されているエリア名]

    なんでもいいと思います(違ったらごめんなさい)。

  • AuthType [認証方式]

    現在のHTTPの規格では"Basic"(基本認証)しかありません。

  • AuthType [認証方式]

    現在のHTTPの規格では"Basic"(基本認証)しかありません。

  • <limit (get) (post)>

    両方とも書いておけば間違いないでしょう。

  • order [allow,deny|deny,allow]

    allowとdenyの優先順位を定義します。

    • allow,deny…denyで指定したもの以外を許可する
    • deny,allow…allowで指定したもの以外を禁止する


  • allow [ホスト名|ドメイン名|IPアドレス|all]
  • deny [ホスト名|ドメイン名|IPアドレス|all]

    許可または禁止の設定をします。

  • require [user|group|valid-user]

    上記のいずれかのパラメータを指定します。

    • user…許可するユーザ名を列挙します。数が多い場合は、複数行のrequire文に分割して列記します。
    • group…許可するグループ名を指定します。この場合にはAuthGroupFileでグループファイルを指定していなければなりません。
    • valid-user…パスワードファイルで認証されたすべてのユーザーを許可します。

▲TOP


セキュリティと制限について

基本認証のセキュリティについては、次の2つのことを念頭に置いてください。

  • 1.パスワードはBASE64エンコーディングをされるが、もともとオープンなネットワークを前提としていないために悪意の第三者がこれを盗んだり、破壊したりすることは可能です
  • 2.パスワードファイルは第三者がアクセスできないように、例えばpublic_htmlの上のディレクトリ(ユーザのホームディレクトリ)などに置くことをお勧めします。

基本認証のしくみは便利である半面、現状では限界があるということです。

▲TOP


ケース別設定方法

特定のドメインからのアクセスを拒否する

.htaccessの中身を次のようにします。

<Limit GET>
order allow,deny
deny from .bbtec.net
allow from all
</Limit> 

この場合、「ヤフー! BB」からのアクセスができないということになります。

▲TOP


特定のドメインからのアクセスのみ許可する

.htaccessの中身を次のようにします。

<Limit GET>
order deny,allow
deny from all
allow from .bbtec.net
</Limit>

この場合、「ヤフー! BB」のAPからのアクセスのみ許可されるということになります。

▲TOP


特定のユーザからのアクセスのみ許可する

ユーザ単位で指定する場合は、まずパスワードデータファイルを作成しなければなりません。

データファイルの名前を".secret"(なぜファイル名の1文字目に「.」を付けるかについては、いずれ解説します)とし、自分のホームディレクトリ(public_htmlの上のディレクトリ)に作成します。
作成の方法ですが、一番基本となる方法は、"htpasswd"というパスワード生成用プログラムを利用することです。このファイルはプロバイダで提供していると思いますのでパスを調べてください(/usr/binもしくは/usr/local/binにあるかもしれません)。もしない場合は自分の環境にこのファイルを置く必要がありますが、今回は割愛します。

シェル上で、htpasswdを実行します。

% htpasswd -c /home/iwanami/.secret iwanami(Enter)

基本型は、
htpasswd [-c] パスワードファイル名 ユーザー名
で、"-c"オプションは新規にファイルを作成する場合だけ指定します(追加したい場合にこのオプションを付けてしまうと、新しい内容が上書きされてしまいますので注意)。
パスワードファイルはカレントディレクトリにない場合はフルパスで指定してください。

Adding password for iwanami.
New password: abcdefgh(Enter)
Re-type new password: abcdefgh(Enter)
%

この例のように、"iwanami"のパスワードを追加します、とメッセージが出て、新しいパスワードを聞いてきますので、この場合は"abcdefgh"という文字にしてみます。実際には画面には文字は表示されず、カーソルも動きません。次に再入力を促してきますので、全く同じパスワードを入力します。これで追加完了です。2人目からは"-c"オプションを外して同様の操作で追加できます。

さて、.secretにデータが入っているか見てみましょう。

% cat .secret(Enter)
iwanami:VbEmZKL3VBGOs
%

ユーザ名"iwanami:"に続いて暗号みたいな文字が出てきました。これが"abcdefgh"が暗号化されたデータです。

これでパスワードファイルの準備ができたので、次に".htaccess"の中身を次のようにします。

AuthUserFile /home/iwanami/.secret
AuthGroupFile /dev/null
AuthName secret
AuthType Basic
<Limit GET>
require valid-user
</Limit>

このファイルをアクセス制限をしたいディレクトリに置きます。これで、.secretに登録されているユーザのみがアクセスを許可されることになります。

▲TOP


ディレクトリ別に許可するグループを指定する

上記の方法の応用です。

htpasswdによるパスワードファイルの作成方法については上記と同じですので省略します。
ここでは、新たにグループファイルというものを作成します。

アクセス許可状況を以下のようにするとします。

・/home/iwanami/public_html/…パスワード登録したユーザのみアクセス可
上記の許可したユーザのうち、
・/home/iwanami/public_html/boys/…男性のみアクセス可
・/home/iwanami/public_html/boys/…女性のみアクセス可

グループファイル名を".secret_group"とし、以下の通りとします。

boys: iwanami koji tadao shinji keisuke
girls: masami yoko yoshiko shiori
上記のユーザ名はすべてパスワード登録してあることが前提です。

public_htmlへ置く.htaccessを以下の通りとします。

AuthUserFile /home/iwanami/.secret
AuthGroupFile /home/iwanami/.secret_group
AuthName secret
AuthType Basic
<Limit GET>
require group boys
require group girls
</Limit>

public_html/boysへ置く.htaccessを以下の通りとします。

AuthUserFile /home/iwanami/.secret
AuthGroupFile /home/iwanami/.secret_group
AuthName secret
AuthType Basic
<Limit GET>
require group boys
</Limit>

public_html/girlsへ置く.htaccessを以下の通りとします。

AuthUserFile /home/iwanami/.secret
AuthGroupFile /home/iwanami/.secret_group
AuthName secret
AuthType Basic
<Limit GET>
require group girls
</Limit>

▲TOP


自動パスワード発行システムについて

さて、上記の方法でアクセス制限をかけることが可能になったわけですが、これはシェルでそのつど追加していかなければならず、そのたびにパスワードファイルをフルパスでタイプして…なんて面倒です。そこで、世の中にはパスワードの発行を自動化してしまおう、と考える人が出てくるので、これはPerlなどで書くことができます。

▲TOP