Kenji Arisawa
E-mail: arisawa@aichi-u.ac.jp
Aichi University
Kurozasa 370, Miyoshi-cho
Aichi, Japan

コンセプト

■ 名前空間の綴じ込め

通常の Web のサーバにおいてはサーバルートと言う概念は本質的な意味を持っていません。
例えば Apache の httpd.conf は ServerRoot を指定しますが、単にアクセス記録などを置く場所がこれによって指定されるだけです。

通常の Web サーバではサーバルートはアクセス制限に対して何の意味も持っていません。この事は CGI を使用した場合に直ちに問題になります。即ち Web のサーバは一見するとクライアントからのアクセス可能なファイルを制限しているように見えても、CGI プログラムからはシステムの全てのファイルが見えてしまいます。この事は重大なセキュリティ上の問題をもたらしかねません。そのためにエンドユーザによる CGI の使用は禁止されるかあるいは厳重な統制下に置かれるのが普通です。

サーバルートの概念に本質的な意味を最初に与えたのは Plan9 第2版の標準 httpd です。 このサーバでは、Plan9 がプロセス毎に名前空間を編成できる事を利用して httpd がサービスする名前空間を、サーバルートの下に綴じ込めることができました。従ってこのサーバの下では CGI プログラムから見える名前空間は、指定されたサーバルートが名前空間のルート "/" となります。つまり CGI プログラムは本質的に指定された名前空間の中に綴じ込められるのです。

しかしながら Plan9 第2版の標準 httpd は CGI 環境が不自由でした。CGI プログラムの配置が固定されていたのと、POST メソッドがサポートされていなかったためです。この問題は Charles Forsyth によって解決されました。(筆者はそのためにずっと彼の httpd を使用してきました。)

Pegasus はこれまでの Plan9 上のサーバのこの素晴らしいアイデアを引き継ぐ事にしました。


■ ドキュメントごとの名前空間の分離

一般に1つのサーバ(some.dome.com)は次のように
http://some.dom.com/pathname	# サーバの正式なページ
http://some.dom.com/~alice/pathname	# ユーザのページ
http://other.dome.com/pathname	# 仮想ホスト(IP が異なる)
http://vertual.dom.com/pathname # 仮想ホスト(IP が同じ)
いろいろな方法でクライアントからアクセスされます。

現状の Web サーバの大きな問題点は、名前空間がこれらの間で共有される事にあります。(コンピュータの仕組みに例えると、全てのプロセスがアドレス空間を共有している初期のパソコンとよく似ている。論理アドレスに相当する機能を提供していない。)
この事は CGI プログラムが他人のファイルにアクセス可能である事を意味します。この事はユーザ間の相互干渉の可能性をもたらします。

Pegasus はこの問題を次のように解決しました。

Pegasus ではどのホームページも単一のドキュメントルート(/doc) を持ちます。Web のブラウザからそのように見えているだけではなくて、サービスを実行しているサーバの名前空間のレベルで実際に単一です。
この事はどの CGI プログラムも他人のファイルを見る事ができない(従ってアクセスできない事)を意味します。これは現在の所 Pegasus だけが持つ特徴です。

Pegasus ではドキュメントルートはサービス空間の中では "/doc" に固定されています。既に述べた様にサーバルートはサービス空間の中では "/" に固定されていますが、実際の名前空間の下ではユーザごとに異なるサーバルートが存在するのです。

例えば(特に指定しなければ)

/usr/alice/web
はユーザ alice のサーバルートです。alice は
/usr/alice/web/doc
の下にドキュメントを作成します。
サーバルートの位置は個別に指定する事もできます。


■ 自由度の高い CGI

Pegasus の現在の目標は高度な安全性と高度な自由度を備えた CGI のサービスをユーザに提供することにあります。

Pegasus は以下の条件を満たすファイルを CGI として使用します。

  1. ユーザ others に対して実行フラグが立っている事。
  2. ファイルの拡張子が、http、cgi、html のいずれかである事。
  3. ドキュメント空間に置かれている事。
  4. 名前がピリオドで始まっていない事。