Kenji Arisawa
E-mail: arisawa@aichi-u.ac.jp
Aichi University
Kurozasa 370, Miyoshi-cho
Aichi, Japan
2000/10/09 改訂
kfscmd allow
Plan9 は正式なファイルサーバの他に簡易ファイルサーバを持つ事ができる。
簡易ファイルサーバはPlan9端末あるいはCPUサーバで動作し kfs と呼ばれている。
第2版までの kfs はいろいろな問題点を抱えていたが、今回の kfs は幾つかの点で
大きく改善された。数量的な比較はしていないがアクセス速度が大きく向上した
ように思える。さらにセキュリティに必要な機能を備え、CPUサーバ上でのファイル
サービスにも耐えるようになった。
そこでここでは kfs を telnet や ftp などのサービスに使用する事を想定し
そこで発生するセキュリティ上の問題に焦点をあてて解説する。
Plan9 には UNIX の root のようなスーパーユーザは存在しない。即ち特定の
ユーザの要求を無条件に信じて実行する仕組みを持っていない。
Plan9 の分散システムでは各々のホストが自立性を持って全体として1つの
システムとして動作しているのである。
各ホストにはホストオーナーが存在する。ホストオーナーとはホストを立ち上げた
ユーザである。即ち、物理的にコンピュータを支配できるユーザがホストオーナー
である。ホストオーナーはそのホストの全てのデバイスの制御権を持っている。
従ってまたそのホストに備わっているファイルシステムの制御権を持っている
のである。
vega をホスト名、alice をホストオーナーとしよう。
alice は kfs に対する絶対的な制御権を持っているが通常はファイルのアクセス
制御に基づくチェックを受ける。(これは UNIX の root と異なる所である。)
alice は kfs のアクセス制御を次のコマンドで無効にできる。
disk/kfscmd allow
この効果は
disk/kfscmd disallow
で取り消せる。
disk/kfscmd はホストオーナーだけに許される特権コマンドである[注1]。
注1: Plan9第2版ではこのコマンドは誰にでも許された。従って kfs に他人から
アクセスさせる訳にはいかなかったのである。第2版の kfs はネットワーク
サービスを行わないPlan9端末の中で私的に使うディクスとしての位置付け
だったのであろう。第3版ではこの問題が改善され
disk/kfs コマンドで kfs のサービスを開始する時に p オプションで
kfscmd への初期パーミッションを指定できるようになった。p オプションを
省略した場合のパーミッションは次のとおりである。
--rw-rw-rw- s 0 arisawa arisawa 0 Sep 8 15:12 /srv/kfs
--rw-rw---- s 0 arisawa arisawa 0 Sep 8 15:12 /srv/kfs.cmd
allow の効果は alice 以外の全てのユーザに及ぶ。即ち kfs をセキュリティの
ないシステムとする。allow はインストレーションを容易にするためのコマンド
であり、本来はシステムの稼働中に使用するコマンドではないのである。
しかしながら実際問題としてはファイルのアクセスモードを無視できる特権が
必要になる事がある。それをどのように安全に行ったら良いのであろうか?
#
# -f コマンドを作る
#
#!/bin/rc
disk/kfscmd allow
$*
disk/kfscmd disallow
用例
-f mk install
解説
disk/kfscmd allow を直接使うのは allow の状態が長い場合に危険である。
更に問題なのは allow 状態にしたまま戻すのを忘れてしまう事である。
そこで強制オプションのように見える -f コマンドを作成し、仕事が終り
次第自動的に disallow 状態に戻そうと言う訳である。
#
# あらたに allow と disallow コマンドを作る
#
disk/kfscmd allow が実行されない解決法を示す。
特権を行使するニーズの殆どの場合はシステムファイルの更新である。
そこでホストオーナーがシステムファイルのグループメンバに入り込めば
よい。例えば alice がホストオーナーとせよ。
その場合には /adm/users が次のようになっていればシステムファイルが更新
できる。
-1:adm:adm:alice
0:none:adm:
1:tor:tor:
2:glenda:glenda:
9999:noworld::
10000:sys::alice
10001:upas:upas:alice
10002:bootes:bootes:
3:alice:alice:
即ち、ホストオーナーをシステムファイルのグループメンバに加える。
しかしながら常にこのように設定して置くと操作ミスによって重要なシステム
ファイルを失う事になりかねない。UNIX で言えば常に root として行動するのと
大差ないのである。
この問題を解決する為には普段はシステムファイルのメンバから外す必要がある。
以下にそのために4つのファイルの内容を示す。
(/adm/users.disallow の中の adm から alice を外せないのは /adm/users への
コピーが発生するからである。もっとも adm 所有のファイルは /adm の下のファイル
だけなので問題はないであろう。)
allow コマンドの内容
#!/bin/rc
cd /adm
cp users.allow users
disk/kfscmd user
disallow コマンドの内容
#!/bin/rc
cd /adm
cp users.disallow users
disk/kfscmd user
/adm/users.allow の内容
-1:adm:adm:alice
0:none:adm:alice
1:tor:tor:
2:glenda:glenda:
9999:noworld::
10000:sys::alice
10001:upas:upas:alice
10002:bootes:bootes:
3:alice:alice:
/adm/users.disallow の内容
-1:adm:adm:alice
0:none:adm:
1:tor:tor:
2:glenda:glenda:
9999:noworld::
10000:sys::
10001:upas:upas:
10002:bootes:bootes:
3:alice:alice:
注意1: /adm/users.allow の中で誰のグループメンバとなるべきかは具体的なシステム
運用の中で定まる。ここに挙げたのは一例に過ぎない。
注意2: allow と disallow はホストオーナーにの特権命令である。
なぜなら disk/kfscmd が使用されているからである。