[tomoyo-users 743] Re: コメント募集: rename 操作をサポートしないファイルシステム上のファイルに対するパス名表記の変更について

Zurück zum Archiv-Index

Tetsuo Handa from-****@I-lov*****
2010年 7月 15日 (木) 12:11:55 JST


 熊猫です。

# AppArmor 来ましたね。いよいよ入るのかな?

KaiGai Kohei さんは書きました:
> 例えば、あるドメインから
> /proc/sys/kernel/core_pattern が read-only で
> procfs:/sys/kernel/core_pattern が read-writable というポリシーがあった場合、
> 
> これはどういった動作をするべきでしょう? :(
> 
> procfs がどこにマウントされているかは、実行時にしか分からないので、
> 事前に弾くというのは難しいかもしれませんが…。

この提案は、 procfs 上の sys/kernel/core_pattern というファイルには
( procfs がどこにマウントされていようとも) proc:/sys/kernel/core_pattern
というパス名でアクセスできるようにしようというものです。ですから、この提案を
採用した場合、今まで /proc/sys/kernel/core_pattern というパス名に対して
与えていたアクセス許可は proc:/sys/kernel/core_pattern というパス名に対して
与えるようになります。 /proc/sys/kernel/core_pattern というパス名が与えられた
場合、( ext3 などの)rename 操作をサポートするファイルシステム上のファイルで
あると解釈されるようになります。

> > rename 操作をサポートするファイルシステム上のファイルに対するパス名の表記は
> > 従来のままです。
> > 
> rename 操作がサポートされていると何かマズイ事でもあるんでしたっけ?
> 
> 例えば『ext3で/dev/sda1(major=8, minor=3)をマウントしている区画』を
> 
>   /home/kaigai/.ssh => ext3(8,3):kaigai/.ssh
> 
> こんな感じで書けてもあまり違和感は感じませぬが…。
> (で、none区画の場合 '('...')' を省略すれば上記と同じですね)
> 
rename をサポートしているファイルシステム上にあるファイルはプログラムや
データファイルなど、( Windows の場合でも)パス名を open に渡すことにより
アクセスされる情報を含んでいると考えます。それに対し、 rename をサポートして
いないファイルシステム上にあるファイルはプロセスのメモリイメージやシステムの
情報など、( Windows の場合には)パス名を open に渡すのではなく他の関数を
使うことによりアクセスされる情報を含んでいると考えます。(例えば Windows では
バージョン情報を取得するのに open("/proc/version", O_RDONLY) という方法ではなく
GetVersionEx() という方法を使います。)

この提案は、「 open() という方法でアクセスされるデータ」と「 GetVersionEx() の
ように open() 以外の方法でアクセスされるデータ」とを区別し、後者にはマウント
ポイント( Windows の場合はドライブ名)に依存しないアクセス手段を提供します。

で、何故 rename をサポートするファイルシステムでは絶対パス名を使うかというと、

(1) rename は open で指定するパス名を変更させるものである。
  rename をサポートするファイルシステムではパス名が変わることがある。

(2) アプリケーションにとっては、 / からの絶対パス名が意味を持つ。
  あるマウントポイント以下の etc/shadow というパス名が存在しても、
  アプリケーションが必要とするのは / パーティションにある etc/shadow であり、
  例えば /var/ パーティションに存在している etc/shadow は必要としない。
  つまり、 /var/ パーティション内の etc/shadow が rename されても
  アプリケーションに影響は無いが、 / パーティション内の etc/shadow が
  rename されると影響を受ける。そのため、 ext3:etc/shadow とか
  dev(8,1):etc/shadow という指定では、どのパーティションにある etc/shadow
  なのかを特定できないため、アプリケーションにとって意味のある指定ができない。
  /etc/shadow とか /var/etc/shadow のように / からの絶対パス名で指定して初めて
  アプリケーションにとって意味のある指定が可能になる。

(3) パス名が変わるとアクセスの可否や使われ方や振る舞いが変化するので、パス名の
  変化を最小限に抑える必要がある。(ただし、ラベルであってもパス名の変化により
  使われ方や振る舞いが変化するので、パス名の変化を最小限に抑える必要があるのは
  同じである。)使われ方や振る舞いに影響を与えるか否かを考える際に
  アプリケーションにとって意味のあるパス名である / からのパス名が必要になる。

からです。

> > です。1つ心配なのは、 rename 操作をサポートしないけれどもプログラムの
> > execute 操作はサポートするというファイルシステムが存在しないかどうかです。
> > そのようなファイルシステムの場合、( TOMOYO Linux のドメイン名に含まれる
> > パス名は / で始まる必要があるので) TOMOYO Linux はドメイン遷移を行えなく
> > なってしまいます。そんなファイルシステムは存在しないとは思いますが・・・。
> > 
> プログラムの execute 時に proc:/path/to/executable をマクロ展開でもするように、
> /proc/path/to/executable に変換して、それをプログラムのドメインに変換してみては
> いかがでしょう?
> (内部データ形式上難しかったりします?)

aggregator の存在を忘れていました。(^^;
aggregator proc:/path/to/executable //procfs/path/to/executable みたいに指定
すれば allow_execute proc:/path/to/executable ではなく
allow_execute //procfs/path/to/executable となるので対処できますね。

でも、それ以前に、 procfs 上の「 プロセスID/exe 」というシンボリックリンクを
execve() に渡すという可能性がありましたね。現状でも allow_execute /proc/self/exe
とか allow_execute /proc/\$/exe とかいうアクセス許可が必要になるケースが存在
しているということですね。 allow_execute にはワイルドカードを認めていないので、
aggregator /proc/\$/exe //procfs/running/program という指定により
allow_execute //procfs/running/program というアクセス許可に変換することになる
わけですが、現在動作中の任意のプログラム( /bin/bash とか /usr/bin/python )の
実行を認めるという意味になるので、 if exec.realpath= という条件節も付けて
制限してやらないと危険ですね。




tomoyo-users メーリングリストの案内
Zurück zum Archiv-Index