Tetsuo Handa
from-****@I-lov*****
2007年 9月 21日 (金) 21:21:25 JST
TOMOYO Linux 1.5.0 がリリースされました。 今回は 1.4.2 で見つかったバグの修正に加えて、仕様の大幅な見直しを行いました。 当初は 1.4.x である間はバグフィックスのみを行いながら長期サポートしようと考えていたのですが、 開発会議や TOMOYO-dev ml を通じてさまざまなアドバイスをいただくことができましたので、 仕様の見直しを行って 1.5.0 としました。 よって、今後は 1.5.x を長期サポートすることを目標とします。 導入手順書などは http://tomoyo.sourceforge.jp/ja/1.5.x/ から参照できます。 バイナリパッケージは近日中に作成してダウンロードできるようにします。 1.5.0 では以下のように仕様が変更されました。 (1) カーネルコマンドラインに init= でポリシーローダを指定しないで済むようになりました。 1.4.x までは init=/.init という形式でポリシーローダを明示的に実行させるように する必要がありました。しかし、 1.5.0 では /sbin/init の実行が要求された時に 自動的にポリシーローダを呼び出し、その終了を待って /sbin/init の実行を始めるように 変更されました。この変更により、 grub の設定ファイルで init= を追加する必要が なくなりました。 (2) ポリシーローダのパス名が /.init から /sbin/ccs-init に変更されました。 / ディレクトリ直下にプログラムを置きたくないという要望に応えるため、 ポリシーローダを / ディレクトリ直下ではなく /sbin/ ディレクトリ直下に 置くようにしました。 (3) /proc/ccs/ 以下の配置が見直されました。 1.4.x までは /proc/ccs/ の下に用途毎にディレクトリを作成していましたが、 1.5.0 ではフラットな配置になりました。 1.0.x との互換性のために残されていた /proc/ccs/info/mapping を廃止しました。 /proc/ccs/status は /proc/ccs/profile に名称変更されました。 (4) initializer ディレクティブが廃止されました。 今後は initialize_domain ディレクティブを使ってください。 (5) マウント操作のアクセス許可チェック方法が変更されました。 1.4.x までは「マウントするデバイス」「マウントポイント」「ファイルシステム」 「強制的に有効化/無効化するマウントオプション」という4要素を用いて 先頭の3要素が一致したら4要素目を反映してから許可するという形の指定をしていましたが、 1.5.0 では「マウントするデバイス」「マウントポイント」「ファイルシステム」 「マウントオプション」の4要素を用いて全要素が一致した場合のみ許可するという 形の指定に変更されました。 そのため、例えば「 /tmp/ に tmpfs をマウントする場合には自動的に noexec オプションを 有効にした上で許可する」という指定は、「 /tmp/ に tmpfs を noexec オプションを指定して マウントする場合だけ許可する」という指定に置き換わります。 (6) ツールのパス名が /root/ccstools/ から /usr/lib/ccs/ に変更されました。 / パーティションに置くファイルの数を最小限にしたいという要望に応えるため、 ポリシーローダである /sbin/ccs-init 以外のツールは /root/ccstools/ ではなく /usr/lib/ccs/ ディレクトリに置くようにしました。 (7) /etc/ccs/ 以下の配置が見直されました。 1.4.x まではポリシーファイルの拡張子は .txt でしたが、 1.5.0 では .conf に変更されました。 /etc/ccs/status.txt は /etc/ccs/profile.conf に名称変更されました。 (8) ポリシーエディタでカラー表示ができるようになりました。 環境変数 EDITPOLICY_COLORS を用いて色の指定が行えます。 この機能はクスノさんが作成されたパッチにより実現されています。 ・指定方法 環境変数名=指定箇所=前景色背景色:指定箇所=前景色背景色:〜 EDITPOLICY_COLORS=DOMAIN_HEAD=02:DOMAIN_CURSOR=02:〜 ・指定箇所 Domain Transition Editorのヘッダ部 DOMAIN_HEAD Domain Transition Editorのカーソル行 DOMAIN_CURSOR System Policy Editorのヘッダ部 SYSTEM_HEAD System Policy Editorのカーソル行 SYSTEM_CURSOR Exception Policy Editorのヘッダ部 EXCEPTION_HEAD Exception Policy Editorのカーソル行 EXCEPTION_CURSOR Domain Policy Editorのヘッダ部 ACL_HEAD Domain Policy Editorのカーソル行 ACL_CURSOR ・指定する色番号 BLACK 0 RED 1 GREEN 2 YELLOW 3 BLUE 4 MAGENTA 5 CYAN 6 WHITE 7 ・設定例(デフォルト設定) EDITPOLICY_COLORS=DOMAIN_HEAD=02:DOMAIN_CURSOR=02:SYSTEM_HEAD=74:SYSTEM_CURSOR=74:EXCEPTION_HEAD=06:EXCEPTION_CURSOR=06:ACL_HEAD=03:ACL_CURSOR=03 (9) ポリシーエディタで冗長なアクセス許可を検出できるようになりました。 まだ試験的な機能ですが、Domain Policy Editor の画面で O キーを押すと カーソル行で指定されたアクセス許可に包含されるアクセス許可に & マークが表示されるようになりました。この機能を使うと、 冗長なアクセス許可を効率よく削除していくことができます。 例えば /tmp/php15fE6f /tmp/phph6grhj /tmp/phpdfg469 というアクセス許可が 学習されている場合、 /tmp/php\?\?\?\?\?\? というアクセス許可を追加して その行で O キーを押すと、 /tmp/php15fE6f /tmp/phph6grhj /tmp/phpdfg469 に & マークが表示されるようになるので、そのまま D キーで削除できます。 (10) loadpolicy が標準入力からの読み込みをサポートするようになりました。 主に TOMOYO GUI で使うことを前提とした仕様変更ですが、 ポリシーを /etc/ccs/ ディレクトリからだけではなく標準入力からも 読み込めるようになりました。今後は # echo allow_read /proc/meminfo | loadpolicy -e のように、軽微な修正であれば editpolicy を起動せずに 行うことができます。 1.4.2 で見つかった以下の不具合が修正されました。(難しいので興味の無い方は読み飛ばしてください。) (1) CheckMountPermission() が -EPERM ではなく正しいエラーコードを返すようになりました。 /sbin/init は SELinux がサポートされているカーネルかどうかを調べるために selinuxfs のマウントを要求しますが、 1.4.2 までは SELinux がサポートされていないカーネルの場合 -EPERM を返してしまっていました。 /etc/selinux/config で SELINUX=enforcing と指定されていた場合、 /sbin/init は selinuxfs のマウント要求が -EPERM を返すとそこでパニックを起こしてしまうため、システムの起動に失敗してしまうという問題がありました。 この問題は CheckMountPermission() が -EPERM ではなく -ENODEV を返すことにより解消されました。 (2) allow_argv0 ... if if ... という指定を正しく処理できるようになりました。 allow_argv0 の2番目のパラメータとして if という単語を指定し、 さらに if 節も指定した場合、ポリシーパーサが正しく処理できませんでした。 この問題は、 FindConditionPart() が最後の if 以降を返せるようにすることで解消されました。 (3) read() などでパケットを受信した場合にもパケットフィルタリングが機能するようになりました。 1.4.2 までは UDP パケットおよび RAW パケットを受信するために read() システムコールや address フィールドに NULL を指定した recvmsg() システムコールで 受信した場合、送信元アドレスによるパケットフィルタリングが機能しませんでした。 また、 MSG_PEEK フラグを指定して recv() システムコールを呼び出した場合、 パケットフィルタリングを行っても受信キューからは削除されないため、 MSG_PEEK フラグを指定せずに recv() システムコールを呼び出すまで 次のパケットを受信キューから取り出せなくなるという問題もあることが判明しました。 これらの問題は、パケットフィルタリングを行う箇所をもっと低いレイヤーに移動させ、 パケットフィルタリングにより( MSG_PEEK フラグが指定されている場合でも) 受信キューから削除されるように修正することで解消されました。