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 としてリリースされていないので仕様の修正が可能です。 動作テストも兼ねて、試してくださると嬉しいです。