[tomoyo-users 561] TOMOYO Linux の開発状況

Back to archive index

Tetsuo Handa from-****@I-lov*****
2009年 2月 17日 (火) 19:55:59 JST


  熊猫です。

  1.6.7 に向けての開発状況( revision 2179 )です。

カーネルに関して

(1) if 節で execute_handler か否かを指定できるようになります。

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

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

(2) 学習時に if task.type=execute_handler が自動的に付与されるようになります。

    学習モードでは if 節は付与されません。しかし、 execute_handler か否かを
    無視して学習すると、 execute_handler でなくてもアクセス可能なポリシーが
    生成されてしまい、 (1) の利点を活用しにくくなります。

    そこで、 execute_handler として動作するプログラムによって学習された
    ポリシーには自動的に if task.type=execute_handler が付与されるように
    しました。

(3) if 節でファイル種別やパーミッションも指定できるようになります。

    「 setuid や setgid されたプログラムの実行を禁止したい」という要望が
    出た場合への備えとして、ファイルの種別や DAC のパーミッションを考慮した
    アクセス制御を行うために「 if path1.type=file 」や「 if path1.mode=0644 」
    などの指定をサポートしました。(仕様は末尾に書きます。)

(4) アクセスログに割り当てられるメモリの上限をバイト単位でも制限できるように
    なります。

    従来、アクセスログ割り当てられるメモリの上限は MAX_GRANT_LOG および
    MAX_REJECT_LOG パラメータを使用して「件数」で制限していました。しかし、
    「バイト数」でも制限できる方が便利なので、 /proc/ccs/meminfo から上限を
    指定できるようにしました。例えば

    # echo Dynamic: 1048576 > /proc/ccs/meminfo

    のように指定すると、アクセスログに割り当てられるメモリの上限を1MBに
    制限できます。

ツールに関して

(1) ccs-editpolicy で編集可能なポリシーの種類が増えます。

    従来は「システムポリシー」「例外ポリシー」「ドメインポリシー」の3種類しか
    編集できませんでした。しかし、「プロファイル」「マネージャ」「メモリ上限
    制限」も編集できるようになります。従来の Tab キーによる切り替え順序は
    維持したまま、 w キーでウィンドウを選択できるようになります。

    ccs-editpolicy の起動時に p を指定するとプロファイル編集画面を、
    m を指定するとマネージャ編集画面を、 q を指定するとメモリ上限編集画面を
    初期画面に指定することができます。

(2) ccs-editpolicy で閲覧モードが追加されます。

    ccs-editpolicy の起動時に readonly と指定すると、読み込み専用モードで
    動作します。また、 refresh=秒数 を指定すると、指定された秒数で自動
    再読み込みが行われるようになります。

(3) ccs-init からメモリ上限を設定できるようになります。

    新しく /etc/ccs/meminfo.base および /etc/ccs/meminfo.conf が
    追加されました。

    従来、 /etc/ccs/ccs-post-init で行っていた

      #! /bin/sh
      echo Private: 10485760 > /proc/ccs/meminfo
      echo Shared: 10485760 > /proc/ccs/meminfo

    という処理を

      Private: 10485760
      Shared: 10485760
      Dynamic: 10485760

    のように /etc/ccs/meminfo.conf という設定ファイルに記述できます。

(4) ccs-loadpolicy でロード可能なポリシーの種類が増えます。

    ccs-loadpolicy q で /proc/ccs/meminfo への書き込みが可能になります。

    # echo Dynamic: 10485760 | ccs-loadpolicy -q

    のように使います。

−−−−−−−−−−
1.6.7 で指定できるようになる if 節の内容について

プロセス種別の指定

  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.parent や path2.parent は常にディレクトリなので、
  path1.parent.type や path2.parent.type という指定はサポートしません。

ファイルの保存されているデバイス番号の指定

  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.parent や path2.parent のデバイスは常に path1 と同一なので、
  path1.parent や path2.parent という指定はサポートしません。

デバイスファイル属性の指定

  path1.dev_major=数値1-数値2     path1 のデバイスメジャー番号部分が「数値1〜数値2」である
  path1.dev_minor=数値1-数値2     path1 のデバイスマイナー番号部分が「数値1〜数値2」である
  path1.dev_major!=数値1-数値2    path1 のデバイスメジャー番号部分が「数値1〜数値2」ではない
  path1.dev_minor!=数値1-数値2    path1 のデバイスマイナー番号部分が「数値1〜数値2」ではない

  path1.type=block または path1.type=char に対してのみ有効です。

パーミッション指定

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

  path1 だけでなく path1.parent や path2.parent も指定可能です。


「数値1」と「数値2」が同じ値の場合、「-数値2」の部分は省略可能です。
数値を 8 進数で指定する場合には 0 から始まるようにしてください。
(例: path1.perm=0644 )

例えば

  allow_read/write /dev/null if path1.type=char path1.major=1 path1.minor=3 path1.perm=0666

という指定をした場合、「パス名が /dev/null 」「ファイル種別がキャラクタ
デバイスファイル」「デバイスメジャー番号が 1 」「デバイスマイナー番号が 3 」
「パーミッションが 0666 」の場合のみ「読み書きモードでのオープンを許可する」
という意味になります。

まだ 1.6.7 としてリリースされていないので仕様の修正が可能です。
動作テストも兼ねて、試してくださると嬉しいです。




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