Chapter 14: 名前空間の管理はどのように行いますか?
14.1. ポリシー名前空間について
この導入ガイドでは今まで、ドメインの名前は <kernel> で始まると説明してきました。しかし、それが正しいのは <kernel> 名前空間においてのみです。ポリシー名前空間を利用すると、 <kernel> 以外の名前空間を利用することができる(つまり、ドメインの名前が <kernel> 以外で始まることができる)ようになります。
それぞれのポリシー名前空間は、独立したドメインポリシー、例外ポリシー、プロファイルのセットを持っています。ある名前空間が持つセットは他の名前空間が持つセットとは独立しています。この独立性により、あなた(および特定のアプリケーション向けのポリシーを作成して配布したい人)は、(他の名前空間へとジャンプするためのディレクティブを他の名前空間用のポリシーファイルに追加する必要があるという点を除いて)他の名前空間との干渉を心配することなくポリシーファイルを作成することが可能になります。
14.2. 名前空間はどのように指定しますか?
この導入ガイドでは、これ以降、名前空間であることを示すために <$namespace> という表記を用います。 $namespace は TOMOYO の文字列表現規則に沿った任意の単語(例: /usr/sbin/sshd 、 /usr/bin/httpd 、 Apache )です。 <kernel> 名前空間は最初から定義されている名前空間です。
ドメインの名前は <$namespace> で始まります。例えば、 <kernel> ドメインや <kernel> /sbin/init ドメインは <kernel> 名前空間に属しているのに対して、 </usr/sbin/sshd> ドメインや </usr/sbin/sshd> /bin/bash ドメインは </usr/sbin/sshd> 名前空間に属しています。
それぞれの名前空間は独立したドメインポリシー、例外ポリシー、プロファイルのセットを持っていますが、 /sys/kernel/security/tomoyo/ ディレクトリと /etc/tomoyo/policy/ ディレクトリは(簡単さと互換性のために)全ての名前空間で共有するようになっています。言い換えると、 /sys/kernel/security/tomoyo/domain_policy /sys/kernel/security/tomoyo/exception_policy /sys/kernel/security/tomoyo/profile および /etc/tomoyo/domain_policy.conf /etc/tomoyo/exception_policy.conf /etc/tomoyo/profile.conf は全ての名前空間用のポリシーを保持しています。
/sys/kernel/security/tomoyo/exception_policy および /sys/kernel/security/tomoyo/profile に対して名前空間を指定するには、 <$namespace> というプレフィックスを各行の先頭に追加してください。以下に、 <kernel> と </usr/sbin/httpd> という名前空間を持つ /sys/kernel/security/tomoyo/profile の例を示します:
<kernel> PROFILE_VERSION=20100903 <kernel> 0-COMMENT=-----Disabled Mode----- <kernel> 0-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 } <kernel> 0-CONFIG={ mode=disabled grant_log=no reject_log=yes } <kernel> 1-COMMENT=-----Learning Mode----- <kernel> 1-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 } <kernel> 1-CONFIG={ mode=learning grant_log=no reject_log=yes } <kernel> 2-COMMENT=-----Permissive Mode----- <kernel> 2-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 } <kernel> 2-CONFIG={ mode=permissive grant_log=no reject_log=yes } <kernel> 3-COMMENT=-----Enforcing Mode----- <kernel> 3-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 } <kernel> 3-CONFIG={ mode=enforcing grant_log=no reject_log=yes } </usr/sbin/httpd> PROFILE_VERSION=20100903 </usr/sbin/httpd> 0-COMMENT=-----Disabled Mode----- </usr/sbin/httpd> 0-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 } </usr/sbin/httpd> 0-CONFIG={ mode=disabled grant_log=no reject_log=yes } </usr/sbin/httpd> 1-COMMENT=-----Learning Mode----- </usr/sbin/httpd> 1-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 } </usr/sbin/httpd> 1-CONFIG={ mode=learning grant_log=no reject_log=yes } </usr/sbin/httpd> 2-COMMENT=-----Permissive Mode----- </usr/sbin/httpd> 2-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 } </usr/sbin/httpd> 2-CONFIG={ mode=permissive grant_log=no reject_log=yes } </usr/sbin/httpd> 3-COMMENT=-----Enforcing Mode----- </usr/sbin/httpd> 3-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 } </usr/sbin/httpd> 3-CONFIG={ mode=enforcing grant_log=no reject_log=yes }
互換性のために、 <kernel> 名前空間を指定する場合には <kernel> というプレフィックスを省略することができるようになっています。
/sys/kernel/security/tomoyo/domain_policy に対して名前空間を指定するには、何の配慮も不要です。これは、ドメインポリシーがドメイン名を宣言する行から始まるブロックの集まりとして構成されており、ドメイン名の中にそのドメインが属している名前空間の情報が含まれているからです。以下に、 <kernel> と </usr/sbin/httpd> という名前空間を持つ /sys/kernel/security/tomoyo/domain_policy の例を示します:
<kernel> use_profile 0 use_group 0 <kernel> /sbin/init use_profile 0 use_group 0 </usr/sbin/httpd> use_profile 1 use_group 0 </usr/sbin/httpd> /var/www/cgi-bin/counter.cgi use_profile 1 use_group 0
14.3. 名前空間の異なるドメインへの遷移はどのように行いますか?
上で説明したように、ある名前空間から他の名前空間へとジャンプするためのディレクティブを追加する必要があります。そのために2つのディレクティブが定義されています。
reset_domain ディレクティブは、このディレクティブで指定されたプログラムのパス名を持つ名前空間へと遷移するようにします。構文は initialize_domain ディレクティブと同じです。以下の例では /usr/sbin/sshd が実行されると </usr/sbin/sshd> ドメインへと遷移するようになります:
reset_domain /usr/sbin/sshd from any
no_reset_domain ディレクティブは、 reset_domain ディレクティブの効果を打ち消します。構文は no_initialize_domain ディレクティブと同じです。
task manual_domain_transition ディレクティブは、このディレクティブで指定するドメイン名の中に既に名前空間が含まれているため、何の変更もありません。そのため、以下のように指定することができます:
task manual_domain_transition <Apache> /www.tomoyo00.com task manual_domain_transition <Apache> /www.tomoyo01.com task manual_domain_transition <Apache> /www.tomoyo02.com task manual_domain_transition <Apache> /www.tomoyo03.com
reset_domain ディレクティブは名前空間と同じ名前のドメインへしか遷移できないのに対して、 task manual_domain_transition ディレクティブは任意のドメインへと遷移することができます。言い換えると、前者は </usr/sbin/httpd> のようなドメインへしか遷移できないのに対して、後者は </usr/sbin/httpd> や </usr/sbin/httpd> /var/www/cgi-bin/counter.cgi のようなドメインへ遷移できます。
14.4. ポリシーエディタから名前空間をどのように指定しますか?
tomoyo-editpolicy
は最初に編集する名前空間を <$namespace> に設定するための新しいコマンドラインオプションとして <$namespace> がサポートされています。デフォルトの名前空間は <kernel> です。名前空間の指定間違いに注意してください。 tomoyo-editpolicy
は現在編集中の名前空間に基づいて表示内容をフィルタリングするため、指定を間違えた場合、期待したとおりにエントリが表示されなくなります。
<<< Exception Policy Editor >>> 画面および <<< Profile Editor >>> 画面に関しては、 <<< Domain Transition Editor >>> 画面の3行目に現在選択されているドメイン名が表示されるのと同様に、現在編集中の名前空間の名前が3行目に表示されます。 w キーの後に n キーを押すと <<< Namespace Selector >>> 画面に切り替わって、編集したい名前空間を選択することができます。
tomoyo-editpolicy
を用いて新しい名前空間を作成して、その名前空間用のプロファイルを作成して、エントリを追加することも可能ですが、より簡単に行うために tomoyo-loadpolicy
を利用することを推奨します。例えば、 </usr/sbin/httpd> 名前空間で利用するためのプロファイルを作成するために <kernel> 名前空間で利用しているプロファイルを複製するには、以下のような awk
スクリプトを利用することができます:
# awk ' { print "</usr/sbin/httpd> " $0 } ' /etc/tomoyo/profile.conf | tomoyo-loadpolicy -p
もし、 <kernel> というプレフィックスが既に /etc/tomoyo/profile.conf の中で指定されている場合、以下のようなスクリプトになるでしょう:
# grep '^<kernel> ' /etc/tomoyo/profile.conf | awk ' { $1 = "</usr/sbin/httpd> "; print $0 } ' | tomoyo-loadpolicy -p
名前空間の目的は、独立したドメインポリシー、例外ポリシー、プロファイルのセットを利用可能にすることであることを忘れないでください。既存のセットから複製しても構いませんが、既存のセットから複製しなければいけないわけではありません。
14.5. 名前空間を利用する上での注意点
名前空間は便利ですが、注意すべき点が幾つかあります。
- reset_domain ディレクティブによるドメイン遷移が発生するようなプログラム実行要求は、遷移先のドメインが定義されていない場合、あるいは、遷移先のドメインに割り当てられているプロファイルが定義されていない場合には、プロファイルの設定に関係なく(以下のようなエラーメッセージがコンソールに表示されて)拒否されます。これは、 reset_domain ディレクティブは、異なるポリシーのセットを適用するという明確な意思表示であり、現在の名前空間の設定を遷移先の名前空間へと自動的に継承すべきではないと考えられるためです。そのため、プロセスが目的の名前空間へと到達しようとする時点よりも前に、その名前空間のためのドメインポリシー、例外ポリシー、プロファイルを明示的にロードしておく必要があります。
ERROR: Domain '</usr/sbin/httpd>' not ready.
- 特定の名前空間用のポリシーを、他の名前空間用のポリシーとは独立して作成することが可能ですが、明示的に指定されない限りプロセスは異なる名前空間へと遷移しません。そのため、 task manual_domain_transition ディレクティブの何れかを指定しない限り、(名前空間を使うのであれば、) reset_domain ディレクティブを含まない例外ポリシーは役に立たないでしょう。
- プロファイルを作成するために割り当てられたメモリは解放できないのと同様に、名前空間を作成するために割り当てられたメモリは解放できません。しかし、 /sys/kernel/security/tomoyo/stat インタフェースから使用してよいメモリ量の上限を制御できるため、普通の使い方であれば問題になることは無いでしょう。