[Tomoyo-dev 908] if 節で指定できる条件の追加について

Back to archive index

Tetsuo Handa from-****@I-lov*****
2008年 12月 3日 (水) 21:09:50 JST


 熊猫です。

 某案件で、「プリンタに送られたデータを全てログファイルにも保存しておく」
という要件がありました。 execute_handler を使ってパイプやソケットの通信内容を
tee してやれば良いわけですが、「どのような操作を行うか事前に把握できない」
ブラックリスト的な設定を要求されたため、 execute_handler として動作する
「通信内容傍受プログラム」と非 execute_handler として動作する「 cat や grep の
ような普通のプログラム」とを keep_domain された同一ドメイン上で動作させる必要が
生じてしまいました。

 そこで、 if 節を拡張して「 if task.type=execute_handler 」および
「 if task.type!=execute_handler 」という条件指定をサポートすることにより、
同一ドメインで動作するプログラムであっても、「通信内容傍受プログラム」だけが
ログファイルなどへの書き込みができるような状態を実現できるようにしたいと
思います。

 また、「 setuid や setgid されたプログラムの実行を禁止する」という要望が
出た場合への備えとして、ファイルの種別や DAC のパーミッションを考慮した
アクセス制御を行うために「 if path1.type=file 」や「 if path1.mode=0644 」
などの指定もサポートしたいと思います。
パーミッションの比較の際にはビット単位での指定もサポートしないと指定が非常に
面倒なことになります。例えば DAC で group に対する read が与えられている場合
だけ /etc/fstab を読み込みモードでオープンすることを許可したい場合、
  allow_read /etc/fstab if path1.mode=00040-00077
  allow_read /etc/fstab if path1.mode=00140-00177
  allow_read /etc/fstab if path1.mode=00240-00277
  allow_read /etc/fstab if path1.mode=00340-00377
  allow_read /etc/fstab if path1.mode=00440-00477
  allow_read /etc/fstab if path1.mode=00540-00577
  allow_read /etc/fstab if path1.mode=00640-00677
  allow_read /etc/fstab if path1.mode=00740-00777
  allow_read /etc/fstab if path1.mode=01040-01077
  allow_read /etc/fstab if path1.mode=01140-01177
  allow_read /etc/fstab if path1.mode=01240-01277
  allow_read /etc/fstab if path1.mode=01340-01377
  allow_read /etc/fstab if path1.mode=01440-01477
  allow_read /etc/fstab if path1.mode=01540-01577
  allow_read /etc/fstab if path1.mode=01640-01677
  allow_read /etc/fstab if path1.mode=01740-01777
  allow_read /etc/fstab if path1.mode=02040-02077
  allow_read /etc/fstab if path1.mode=02140-02177
  allow_read /etc/fstab if path1.mode=02240-02277
  allow_read /etc/fstab if path1.mode=02340-02377
  allow_read /etc/fstab if path1.mode=02440-02477
  allow_read /etc/fstab if path1.mode=02540-02577
  allow_read /etc/fstab if path1.mode=02640-02677
  allow_read /etc/fstab if path1.mode=02740-02777
  (・・・中略・・・)
  allow_read /etc/fstab if path1.mode=07040-07077
  allow_read /etc/fstab if path1.mode=07140-07177
  allow_read /etc/fstab if path1.mode=07240-07277
  allow_read /etc/fstab if path1.mode=07340-07377
  allow_read /etc/fstab if path1.mode=07440-07477
  allow_read /etc/fstab if path1.mode=07540-07577
  allow_read /etc/fstab if path1.mode=07640-07677
  allow_read /etc/fstab if path1.mode=07740-07777
という並列指定を行うか、あるいは
  allow_read /etc/fstab if path1.mode!=00000-00037 path1.mode!=00100-00137 path1.mode!=00200-00237 path1.mode!=00300-00337 path1.mode!=00400-00437 path1.mode!=00500-00537 path1.mode!=00600-00637 path1.mode!=00700-00737 path1.mode!=01000-01037 path1.mode!=01100-01137 path1.mode!=01200-01237 path1.mode!=01300-01337 path1.mode!=01400-01437 path1.mode!=01500-01537 path1.mode!=01600-01637 path1.mode!=01700-01737 (・・・中略・・・) path1.mode!=07000-07037 path1.mode!=07100-07137 path1.mode!=07200-07237 path1.mode!=07300-07337 path1.mode!=07400-07437 path1.mode!=07500-07537 path1.mode!=07600-07637 path1.mode!=07700-07737
という直列指定が必要になり、とても使いこなせるものではありません。

現時点( revision 1918 )では以下のような仕様になっています。

プロセス種別の指定
 task.type=execute_handler   プロセスは execute_handler として動作している
 task.type!=execute_handler  プロセスは普通のプロセスとして動作している

ファイル種別の指定
  path1.type=file             path1 は通常のファイルである
 path1.type=directory        path1 はディレクトリである
  path1.type=fifo             path1 は FIFO である
  path1.type=socket           path1 はソケットである
  path1.type=symlink          path1 はシンボリックリンクである
  path1.type=block            path1 はブロックデバイスファイルである
  path1.type=char             path1 はキャラクタデバイスファイルである
  path1.type!=file            path1 は通常のファイルではない
 path1.type!=directory       path1 はディレクトリではない
  path1.type!=fifo            path1 は FIFO ではない
  path1.type!=socket          path1 はソケットではない
  path1.type!=symlink         path1 はシンボリックリンクではない
  path1.type!=block           path1 はブロックデバイスファイルではない
  path1.type!=char            path1 はキャラクタデバイスファイルではない

デバイスファイル属性指定( path1.type=block または path1.type=char に対してのみ有効)
  path1.major=数値1-数値2     path1 のメジャー番号部分が「数値1〜数値2」である
  path1.minor=数値1-数値2     path1 のマイナー番号部分が「数値1〜数値2」である
  path1.major!=数値1-数値2    path1 のメジャー番号部分が「数値1〜数値2」ではない
  path1.minor!=数値1-数値2    path1 のマイナー番号部分が「数値1〜数値2」ではない

パーミッション指定
 path1.mode=数値1-数値2      path1 のパーミッションが「数値1〜数値2」である
 path1.mode!=数値1-数値2     path1 のパーミッションが「数値1〜数値2」ではない
  path1.mode=setuid           path1 に関して setuid ビットが on である
  path1.mode!=setuid          path1 に関して setuid ビットが off である
  path1.mode=setgid           path1 に関して setgid ビットが on である
  path1.mode!=setgid          path1 に関して setgid ビットが off である
  path1.mode=sticky           path1 に関して sticky ビットが on である
  path1.mode!=sticky          path1 に関して sticky ビットが off である
  path1.mode=user_read        path1 に関して owner に対する read ビットが on である
  path1.mode!=user_read       path1 に関して owner に対する read ビットが off である
  path1.mode=user_write       path1 に関して owner に対する write ビットが on である
  path1.mode!=user_write      path1 に関して owner に対する write ビットが off である
  path1.mode=user_execute     path1 に関して owner に対する execute ビットが on である
  path1.mode!=user_execute    path1 に関して owner に対する execute ビットが off である
  path1.mode=group_read       path1 に関して group に対する read ビットが on である
  path1.mode!=group_read      path1 に関して group に対する read ビットが off である
  path1.mode=group_write      path1 に関して group に対する write ビットが on である
  path1.mode!=group_write     path1 に関して group に対する write ビットが off である
  path1.mode=group_execute    path1 に関して group に対する execute ビットが on である
  path1.mode!=group_execute   path1 に関して group に対する execute ビットが off である
  path1.mode=others_read      path1 に関して others に対する read ビットが on である
  path1.mode!=others_read     path1 に関して others に対する read ビットが off である
  path1.mode=others_write     path1 に関して others に対する write ビットが on である
  path1.mode!=others_write    path1 に関して others に対する write ビットが off である
  path1.mode=others_execute   path1 に関して others に対する execute ビットが on である
  path1.mode!=others_execute  path1 に関して others に対する execute ビットが off である

「-数値2」の部分は省略可能です。
パーミッション指定では path1 だけでなく path1.parent や path2.parent も指定可能です。
path1.parent や path2.parent は常にディレクトリであるため、 path1.parent.type や path2.parent.type という指定は無意味なのでサポートしません。

ここで、表記方法についてご意見募集です。

(1) パーミッションを表すには path1.mode と path1.perm のどちらが良いか?

(2) owner/group/others の指定はそれぞれ(chmod での ugo を連想させる) user/group/others で良いか?それとも、 owner だから user よりも owner の方が良いか?

(3) user_read/group_read/others_execute などは長すぎるか? ur/gr/or のような短縮形が良いか?

(4) path1.mode=setuid などはビット演算を行っているのに = や != で結びつけるのは気になるか?気になる場合、どのような表記(例えば path1.mode=+setuid path1.mode=-setgid)が良いか?

(5) デバイスファイルの属性( stat コマンドで Device type: 欄に表示される内容)だけでなく、ファイルの格納されているデバイスファイルの属性( stat コマンドで Device: 欄に表示される内容)も指定できる方が嬉しいか?

(6) その他にも気になる点や要望

などなどです。




tomoyo-dev メーリングリストの案内
Back to archive index