SUID なしにソースプログラムの公開とセキュリティの確保を両立させたところが巧いのですね。ここさえクリアすれば以下に述べる全ての事がらは、既存の技術の集大成に過ぎない。
UNIXはデバイスもファイルとみなした。Plan9はUNIXのファイル志向を一層徹底させた。Plan9にとってプロセスはファイルである。サービスもまたファイルである。
Linuxや4.4BSDでもプロセス情報はファイルとして扱われているがPlan9はプロセス情報だけではなく、プロセスを制御する口をファイルとして持っている(/proc/*/note
)。そして、
echo kill > /proc/4/note
を実行する事で pid=4 のプロセスを殺せる。(Plan9には "signal" が存在しない。UNIX の signal はもうすっかり枯渇してしまっている。Plan9では数字の signal ではなく文字列を signal の代わりに使う。)
デバイスファイルも同様に制御の口を持っている。/dev/consctl
はコンソールを制御するファイルである。Plan9でraw モードを実現するにはプログラムの中でこのファイルを開き単に "rawon" の文字列を書き込むだけでよい。
ファイルが閉じるまで raw モードを保ち続ける。プログラムが終了すればこのファイルは自動的に閉じるから raw モードで動作するプログラムは例え異常終了する事があっても端末は raw モードになることはない。
echo rawon > /dev/consctl
を実行しても端末は raw モードにならないことに注意する。なぜなら echo の実行後直ちに
/dev/consctl
は閉じるからである。
Plan9にとってサービスもまたファイルである。例としてPlan9のコマンド 、ndb/csquery
を取りあげよう。
ndb/csquery
はPlan9のネットワークデータベース(通常は/lib/ndb/local
)を参照し、入力(例えば)
tcp!ar!telnet
からIPアドレスとtcpポート情報を含む出力 202.250.160.40!23 を得る。ここに ar
は筆者のワークステーションのマシン名である。csquery
のソースコードは極めて簡単で
単にファイル /net/cs
を開き、文字列 "tcp!ar!telnet"
を書き込み、その後、/net/cs
から文字列を読み取っているに過ぎない。
Plan9ではIPアドレスを知る必要のあるプログラムやライブラリ関数がこのファイルを利用している。
サービスをファイルとして実装するメリットは何と言ってもその分かりやすさである。そして全てのアプリケーションがこれを等しく参照でき、リモートファイルのマウントが可能であれば、分散環境で容易にサービスを共有できる。
ファイルの多重化のアイデアはUNIXに萌芽的に見られた。
例えば /dev/tty
はそのプロセスが現在使用中のttyデバイスを表しており、その実体は tty コマンドで知ることができる。
Plan9では多重化の方向がさらに徹底された。多重化にはOSが自動的に行うものもあればユーザ権限で行うものもある。/dev
のファイルは前者の代表格であるが、その他に/env
のファイル(Plan9では環境変数もファイルであり、このディレクトリに置かれている)など多数のファイルがOSによって多重化されている。
ユーザ権限で行う多重化は次に述べる bind コマンドで達成される。
Plan9 の bind コマンドは UNIX の ln コマンドとよく似ている。 しかしながら ln と異なり、bind コマンドの影響はそれを実行したプロセスとプロセスグループに留まる。つまり bind は仮想的なリンクを形成する。従ってこのコマンドは ln と異なりユーザ権限でどこにでもリンクできる。既存のファイルやディレクトリに bind を適用すると、そのファイルやディレクトリは多重化される。bindコマンドによって、どのユーザも /bin や /lib のファイルを自分のファイルと置き換える事が可能になる。
UNIX の chroot() 関数はもはや不要である。chroot()関数はrootのプロセスだけが使用可能であり、ディレクトリの木構造の部分木だけにアクセス空間を限定する。それに対して Plan9 では、どのユーザのプロセスも自己の名前空間を編成でき、その自由度は正に別世界である。
Plan9の mount コマンドはサービス(/srv
のファイル)をプロセスに多重化する。サービスにはファイルシステムの利用サービス、データベースの利用サービスなどが含まれる。マウントポイントは(習慣的に)サービスの種類によって異なる。例えば、
/n
にはファイルシステムがマウントされる。
/net
にはネットワークの接続に関係したファイルがマウントされる。
などである。
後書き
もうftpd の為に特別のディレクトリを作成する必要はないのですね。
ftpdを複数のユーザが運営している場合、Plan9では各ユーザのホームディレクトリの中にあるサブディレクトリを bind コマンドで集めて ftpd 用のディレクトリを作成できます。
/bin/mail
に SUIDが立っている)も実に簡単な方法をとりました。マンションの郵便箱と同じ考えをとったのです。
つまり、だれがここに手紙を放り込んでも構わないけど、大切な事は取られないことだ、と。Plan9ではユーザのメール箱には誰でも書き込めます。しかし append only 属性が立てられているので、誰も消せない。手紙の真偽の確認は他の方法をとればよいと考えているのですね。
/n/dump/
を見るだけで良い。ディレクトリ/n/dump/1995/0315/
WORMベースのファイルシステムは非常に魅力的です。
多分、実際に記憶されているのは単に差分情報だけでしょうね。 これをPlan9が過去のある日の完全なファイルシステムとして見せてくれているだけなのでしょう。
分散環境ではサーバ専用マシンを使用します。その場合のファイルシステム( 9fs )では、
注釈: Kerberos に関しては 1. W.R.Stevens,「UNIXネットワークプログラミング」(トッパン) 2. 山本和彦,「Kerberos(1)」(UNIXマガジン, 1995.4) に簡単な解説がある。(筆者は実はMITのKerberosの発表会の場にいたのである。) なお山本和彦氏の解説の中で Kerberos の問題点として、クライアントがサーバと 同一の共有鍵を保有し、この管理に困ると言う説明があるが、これは Kerberos を UNIXのネットワークに適用したMIT方式の運用から発生する問題点であろう。 Plan9 ではこうした問題は発生しない。 暗号や認証に関する参考書は 3. B.Schneier,"Applied Cryptgraphy (2nd ed.)",John Wiley & Sons, Inc 4. D.R.Stinson,"CRYPTOGRAPHY",CRC Press が良著である。B.Scheierはプログラマ向けの詳しい解説、D.R.Stinsonは暗号を 基礎からじっくりと解説している。 5. 岡本龍明、太田和夫「暗号、ゼロ知識証明、数論」(共立出版) もあるが、これはよほど数学に堪能でないと読み切れないだろう。 最近は日本語の解説本が続出で、以上の他にも本屋へ行けば多数見つかる。 一般向けの簡単な解説は 6. 「小特集 - ゼロ知識証明とその応用」(情報処理 Vol.32,No.6,1991) 7. 「特集 - 暗号安全性の最近の動向」(情報処理 Vol.37,No.6,1996)