$Id: index.html,v 1.5 2002/10/25 13:45:14 misty Exp $
[はじめに] [Apacheの認証機構]
[認証方法追加法]
[mod_perlを利用した認証方法追加法] [mod_perlでの認証モジュール作成法]
[CGI作成例] [運用実績と考察] [まとめ]
特に大学のような学校では、 分散した様様なWebサーバを学生などの一定の集合に属する メンバーの一部が利用することが多い。 学籍番号で区別し特定の学習者に利用を限りたい、 また、その利用状況を知りたいということが頻繁に起こる。 WWWサーバの認証機構を利用すると便利であるが、 ページやCGIの認証をいちいちサーバごとに行うのは面倒である。
このため、ここでは特にApache WWW Serverについて、 WWWサーバの認証機構で認証方法を変更し、 特定の認証サーバで一括して認証を行うようにするための手段を示す。 この方法を使用するにはApacheの管理者であり、かつSSLなどを使用できる必要があるので、一般の方が趣味で行うようなCGI作成では使用できない。 上述のようなシステム作成者向きである。
REMOTE_USER環境変数を詐称可能か?ただし、代替案であるhidden, cookie, REFERER環境変数なども そう強度は高くない
Basic認証はパスワードが素で流れるので。 これも代替案でも使用する必要があるので同じ。
Apacheに認証方法を追加する手段は2つある。
例えば、mod_pgsqlなどがある。 作成および組み込みが大変である。
CPANにAuthenPasswd, AuthenNIS, AuthenRadiusなどがある。 CPANのサイトの中にあるPerlモジュールリストの、15) World Wide Web, HTML, HTTP, CGI, MIME etc (see Text Processing) の中の、Apache PerlAuthenHandler modules, Apache PerlAuthzHandler modulesあたりをみればよいだろう。
mod_perlが組み込まれてなければならないが、最近のフリーUNIXだと大抵組み込み済み。
.htaccessなりhttp.confなりに認証のためのおまじないを書く必要がある。
mod_perlでの認証モジュール追加が簡単。
ここでは私の作成したAuthPg.pmおよびAuthzPg.pmを例に認証方法を追加する方法と、実際に認証を行う方法を示す。また、ログファイルにユーザの利用記録が残る様子を示す。
ユーザ認証用モジュール→[AuthPg.pm]
グループ認証用モジュール→[AuthzPg.pm]
mod_perlの組み込みなどの細かい話はここでは書かない。 すでにmod_perlは組み込まれているものとして、/var/www/perlディレクトリを/perlと別名をつけ、そのディレクトリ以下でmod_perlを使用する場合のhttp.confの設定例を 以下に示す。
<ifmodule mod_perl.c> ←mod_perlモジュールが有効になってる場合
Alias /perl /var/www/perl ←Perlスクリプトの保管場所を/perlという位置で参照できるようにする
<directory /var/www/perl> ←このディレクトリの設定を開始
SetHandler perl-script ←Perlのハンドラを使う
PerlHandler Apache::Registry ←Perl実行に必要なモジュールをハンドラとして定義
Options +ExecCGI ←CGIの実行を許可
</directory>
</ifmodule>
AllowOverrideを有効にしている場合には、http.confでdirectoryタグを使用しないで、テストを行うディレクトリに直接以下の.htaccessファイルを置くことでもmod_perlを使用できるようになる。
mod_perlの動作確認には以下のスクリプトを利用する。
mod_perlが動作していれば、以下のような出力が得られる。
It's running mod_perl!
1. QUERY_STRING :
...
動作していない場合は、以下のような出力になる。
It's running CGI!
1. QUERY_STRING
...
組み込む予定のモジュールをhttp.confに追加するには、先ほどの記述にPerlModuleで始まる行で追加記述する。 ここでは、Apache::AuthPgを追加したいので、PerlModule Apache::AuthPgというを追加する。なお、/perlディレクトリを使用しない場合は、directoryタグとその中身(つまり、<directory ...>〜</directory>)は不要である。
<ifmodule mod_perl.c>
Alias /perl /var/www/perl
<directory /var/www/perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</directory>
PerlModule Apache::AuthPg ←追加行
</ifmodule>
多すぎる場合には別途ファイルを作成し、それを組み込むようにする。
(まだ)
制限を行うディレクトリに以下のような.htaccessを記述する。
記述した後は、うまく動いているか動作試験を行う。テストユーザをデータベースに追加し、認証してみる。
(まだ)
認証ができればページが見える。
(まだ)
AuthzPg.pmをロードするように、httpd.confに追加する。Module Apache::AuthzPgを追加。
(まだ)
.htaccessに以下を追加する。
(まだ)
テストグループを作成し、テストユーザを追加し、グループ認証してみる。
(まだ)
認証ができればページが見える。
ユーザ認証を行った場合
(まだ)
グループ認証を行った場合
(まだ)
ここでは私の作成したAuthPg.pmおよびAuthenPg.pmを例に認証モジュールの作 成について解説する。
(まだ)
認証を自力でチェックする必要はない。
環境変数REMOTE_USER, REMOTE_GROUP(?)を随時利用することができる。
例として、私の作成した受講登録CGIを上げる(しょぼいが)。
環境変数REMOTE_USERを利用して自動的に学籍番号を埋めている。
(まだ)
2年間運用。登録ユーザ数、2〜3万。総アクセス数?かなり… ときおりデータベースサーバのエラーあり。
(まだ)
ログは残ってるのだが、ちゃんと考察してない…。
暗号化が必要。 今回はSSLの秘密鍵を自サイトで発行、運用した。 大学で全体的な認証を行うなら、ちゃんと認証発行機構を運用する必要がある だろう。
cryptを使用したが、これは弱い。通信の暗号化の方法が必要。 Radiusが運用されているなら、そちらを使用するのが良いかも。
以上のような手法により、Apacheの認証方法の変更は比較的簡単に行うことが できる。また、データベースを使用したところ2〜3万程度のユーザ認証は特に 問題なく運用された。 今後は他の認証方法の利用を検討すること、 せっかく取得できたログファイルの解析方法を考えること、 などが考えられる。
でも、自分でやるのは面倒くさいので実働部隊募集中。
Copyrighted by Mika Ohtsuki (mika@mikamama.com)