Plan9のセキュリティアーキテクチャ(その1)

前回Plan9にはrootはないけど,ホストオーナ(hostowner)ってのがあると書いた.ホストオーナはその名の通り,そのホスト,正確にはローカルマシンの所有者という意味で,誰がホストオーナかは/dev/hostownerをcatすればわかる.ターミナルを使っている場合は,OSを起動したユーザがホストオーナになる.

term% cat /dev/hostowner
oraccha

rootユーザがいないって,セキュリティは大丈夫なのとか,initプロセスは誰の権限で動いているのとかいった疑問に対して,調べていこうと思う.

この/dev/hostownerというファイルは,コンソールをつかさどるcons(3)デバイスによって提供されている.consデバイスが提供するファイルを見てみよう./dev/hostowner以外にもたくさんのファイルを提供していることがわかる.

term% ls -l '#c'
--rw-rw-r-- c 0 oraccha oraccha 24 Apr 16   2006 '#c/bintime'
--rw-rw---- c 0 oraccha oraccha  0 Apr 16   2006 '#c/cons'
---w--w---- c 0 oraccha oraccha  0 Apr 16   2006 '#c/consctl'
--r--r--r-- c 0 oraccha oraccha 72 Apr 16   2006 '#c/cputime'
--r--r--r-- c 0 oraccha oraccha  0 Apr 16   2006 '#c/drivers'
--rw-rw-r-- c 0 oraccha oraccha 48 Apr 16   2006 '#c/hostdomain'
--rw-rw-r-- c 0 oraccha oraccha  0 Apr 16   2006 '#c/hostowner'
   :

consは何を元に/dev/hostownerの値を設定するのだろうか.それは,(ローカル)マシンのブート時に

user[none]: 

と聞かれて,ログインしたと思うが,このユーザがホストオーナになる.ということで,boot(8)から情報が渡されているはず.
ホストオーナのログインにはパスワードも聞かれなかったはずだが,これはホストオーナの認証は自動的に行われるから.逆に言うと,物理的にマシンにアクセスされたらおしまいよということ.まぁ,UNIXでもシングルユーザモードでブートされたら同じことだし,この辺のセキュリティに関しては割り切られている.

initプロセスなどはホストオーナの権限で動いている.

term% ps | sed 4q
oraccha           1    0:00   0:00        88K Await    init
oraccha           2    0:53   0:00         0K Wakeme   genrandom
oraccha           3    0:00   0:00         0K Wakeme   alarm
oraccha           4    0:00   0:00         0K Wakeme   rxmitproc

/dev/hostownerのパーミッションが0664だから,glendaって書き込んじゃえ!ってechoすると,ホストオーナが変わってしまう.

term% echo -n glenda > /dev/hostowner

ホストオーナを変更すれば,ちゃんとinitのユーザにも反映されているのが確認できる.

term% ps | sed 4q
glenda            1    0:00   0:00        88K Await    init
glenda            2    0:53   0:00         0K Wakeme   genrandom
glenda            3    0:00   0:00         0K Wakeme   alarm
glenda            4    0:00   0:00         0K Wakeme   rxmitproc

この状態で,新しいウィンドウを作成しようとすると,"mount failed: permisson denied"と怒られる.これってどう解釈すればよいのかな.ちなみに,QEMU上のスタンドアローン環境で試している.