Tetsuo Handa
from-****@I-lov*****
2006年 12月 23日 (土) 20:45:31 JST
熊猫です。 まだ暫定仕様ですが、 1.3.1 以降の開発状況についてお知らせします。 現時点までに実装されている機能は以下の4点です。 ・パス名をグループ化するマクロの導入 ・パス名の構造体化による高速化 ・ポリシーマネージャーの指定方法にドメイン名を追加 ・ドメイン遷移を制御するディレクティブの追加 パス名をグループ化するマクロについて 従来はサブディレクトリを指定するためには 4 /var/www/html/\* 4 /var/www/html/\*/\* 4 /var/www/html/\*/\*/\* 4 /var/www/html/\*/\*/\*/\* のように末尾に /\* を追加したものを何度も繰り返す必要がありました。 1ドメインだけならばこれでもあまり苦労しませんが、 /usr/share/ ディレクトリ以下の fonts や icons にアクセスする GUIアプリケーション向けにこの作業を行うのはかなりの手間がかかります。 そこで、 path_group という構文を導入しました。 path_group マクロ名 パス名1 path_group マクロ名 パス名2 path_group マクロ名 パス名3 のように1個のマクロに対して複数のパス名を対応させておき、アクセス許可を与える場合に 4 @マクロ名 とすることで、複数のドメインに対して同じアクセス許可を与える手間を軽減します。 アクセス許可のチェックは、マクロ名ではなく マクロに含まれる個々のパス名を用いて行われます。 パス名の構造体化について 従来は SaveName() は単純にパス名だけを扱っていましたが、 PathMatchesToPattern() での処理速度向上のために、 ハッシュ値などを含めた構造体として扱うように修正されました。 適当なベンチマークプログラムが見当たらないので 自作プログラム(このメールの末尾)で測定してみた結果、 起動時のポリシーの読み込み時間が約1/2に、 アクセス許可のチェックの内ポリシーとの照合に要する時間が約1/2になりました。 TOMOYO による遅延時間はアクセス許可の数に比例するので、 多くのアクセス許可が与えられているドメインでは体感速度が向上するはずです。 ポリシーマネージャーの指定について 従来は /proc/ccs/ ディレクトリ経由でのポリシーの変更を許可する editpolicy 等のプログラムをパス名で指定していましたが、 そのようなプログラムの実行を許可したくないドメインに対して うっかり実行許可を与えてしまうことが無い様に注意する必要がありました。 そこで、パス名だけでなくドメイン名でも指定できるように変更しました。 editpolicy 等を実行するドメインを用意してそのドメイン名を指定することにより、 前述のようなミスを予防できます。 また、 keep_domain 構文と組み合わせることで、既存のポリシーエディタ以外にも cat 等を使って自由にポリシーの編集を行えるようになりました。 GUIのエディタが登場した時に重宝することになると思います。 ポリシーマネージャーの登録取り消しにも対応しました。 起動時だけ /proc/ccs/ 経由でのポリシーの変更を許可し、 起動後は /proc/ccs/ 経由でのポリシーの変更を禁止することも可能になりました。 ドメイン遷移を制御するディレクティブの追加について 1.3.1 ではドメイン遷移の例外として initializer 構文と keep_domain 構文が 用意されていましたが、遷移元ドメインとは無関係に無条件に適用されてしまうため 特定のドメインでは適用したくないという要望に対処できませんでした。 そこで、 initialize_domain 構文を追加し、 keep_domain 構文を拡張しました。 同時に、 initialize_domain 構文と keep_domain 構文を打ち消す no_initialize_domain 構文と no_keep_domain 構文も追加しました。 今回追加されたこれらの構文を知らなくても TOMOYO Linux を使うのには 差し支えありません。より厳密にドメイン遷移を設計したい人向けです。 バージョン 1.3.1 での評価順序は (1) initializer が指定されていたら <kernel> 直下へ遷移する (2) keep_domain が指定されていたら現在のドメインに留まる (3)現在のドメインの子ドメインへ遷移する となっています。これを (1) no_initialize_domain が指定されていたら(3)へ進む (2) initializer または initialize_domain が指定されていたら <kernel> 直下へ遷移する (3) no_keep_domain が指定されていたら(5)へ進む (4) keep_domain が指定されていたら現在のドメインに留まる (5)現在のドメインの子ドメインへ遷移する となるように拡張します。 構文については以下のようになります。 プログラム名の部分にはワイルドカードは使用できません。 「initialize_domain プログラム名」は従来の 「initializer プログラム名」と同一機能です。 「initialize_domain プログラム名 from ドメイン名」は 「ドメイン名」から「プログラム名」が実行された場合に限り、 「<kernel> プログラム名」ドメインへ遷移します。 「no_initialize_domain プログラム名 from ドメイン名」は 「ドメイン名」から「プログラム名」が実行された場合には 「<kernel> プログラム名」ドメインへ遷移しません。 この指定は initialize_domain および initializer に優先します。 「keep_domain ドメイン名」は従来どおりです。 「keep_domain プログラム名 from ドメイン名」は 「ドメイン名」から「プログラム名」が実行される場合には 「ドメイン名 プログラム名」ドメインへ遷移しません。 「no_keep_domain プログラム名 from ドメイン名」は 「ドメイン名」から「プログラム名」が実行される場合に限り 「ドメイン名 プログラム名」ドメインへ遷移します。 この指定は keep_domain に優先します。 from よりも(メールアドレス風に) @ にしたほうがイメージしやすいかな? −−−ベンチマーク用プログラム−−− /* gcc -Wall -O3 this_file.c */ #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mount.h> #include <errno.h> int main(int argc, char *argv[]) { static char buffer[1024]; int i, fd; mount("none", "/var/tmp/", "tmpfs", MS_NOATIME | MS_NODIRATIME, NULL); if (chdir("/var/tmp/")) return 1; for (i = 0; i < 50000; i++) { snprintf(buffer, sizeof(buffer) - 1, "file-%u", i); if ((fd = open(buffer, O_WRONLY | O_CREAT, 0)) == EOF) { fprintf(stderr, "open(): %s\n", strerror(errno)); break; } close(fd); } chdir("/"); umount("/var/tmp/"); return 0; } −−−ベンチマーク用プログラム−−− 質問や要望等がありましたら遠慮なく投稿してください。