akarititle.png

Chapter 15: 名前空間の管理はどのように行いますか?

15.1. ポリシー名前空間について

この導入ガイドでは今まで、ドメインの名前は <kernel> で始まると説明してきました。しかし、それが正しいのは <kernel> 名前空間においてのみです。 TOMOYO 1.8.2 で導入されたポリシー名前空間を利用すると、 <kernel> 以外の名前空間を利用することができる(つまり、ドメインの名前が <kernel> 以外で始まることができる)ようになります。

それぞれのポリシー名前空間は、独立したドメインポリシー、例外ポリシー、プロファイルのセットを持っています。ある名前空間が持つセットは他の名前空間が持つセットとは独立しています。この独立性により、あなた(および特定のアプリケーション向けのポリシーを作成して配布したい人)は、(他の名前空間へとジャンプするためのディレクティブを他の名前空間用のポリシーファイルに追加する必要があるという点を除いて)他の名前空間との干渉を心配することなくポリシーファイルを作成することが可能になります。

15.2. 名前空間はどのように指定しますか?

この導入ガイドでは、これ以降、名前空間であることを示すために <$namespace> という表記を用います。 $namespace は TOMOYO の文字列表現規則に沿った任意の単語(例: /usr/sbin/sshd 、 /usr/bin/httpd 、 Apache )です。 <kernel> 名前空間は最初から定義されている名前空間です。 <kernel> 名前空間だけを利用する限り、ポリシーファイルは TOMOYO 1.8.1 と互換性があります。

ドメインの名前は <$namespace> で始まります。例えば、 <kernel> ドメインや <kernel> /sbin/init ドメインは <kernel> 名前空間に属しているのに対して、 </usr/sbin/sshd> ドメインや </usr/sbin/sshd> /bin/bash ドメインは </usr/sbin/sshd> 名前空間に属しています。

kernel_namespace.png sshd_namespace.png

それぞれの名前空間は独立したドメインポリシー、例外ポリシー、プロファイルのセットを持っていますが、 /proc/ccs/ ディレクトリと /etc/ccs/policy/ ディレクトリは(簡単さと互換性のために)全ての名前空間で共有するようになっています。言い換えると、 /proc/ccs/domain_policy /proc/ccs/exception_policy /proc/ccs/profile および /etc/ccs/domain_policy.conf /etc/ccs/exception_policy.conf /etc/ccs/profile.conf は全ての名前空間用のポリシーを保持しています。

/proc/ccs/exception_policy および /proc/ccs/profile に対して名前空間を指定するには、 <$namespace> というプレフィックスを各行の先頭に追加してください。以下に、 <kernel> と </usr/sbin/httpd> という名前空間を持つ /proc/ccs/profile の例を示します:

<kernel> PROFILE_VERSION=20100903
<kernel> 0-COMMENT=-----Disabled Mode-----
<kernel> 0-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 enforcing_penalty=0 }
<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 enforcing_penalty=0 }
<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 enforcing_penalty=0 }
<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 enforcing_penalty=0 }
<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 enforcing_penalty=0 }
</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 enforcing_penalty=0 }
</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 enforcing_penalty=0 }
</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 enforcing_penalty=0 }
</usr/sbin/httpd> 3-CONFIG={ mode=enforcing grant_log=no reject_log=yes }

互換性のために、 <kernel> 名前空間を指定する場合には <kernel> というプレフィックスを省略することができるようになっています。

/proc/ccs/domain_policy に対して名前空間を指定するには、何の配慮も不要です。これは、ドメインポリシーがドメイン名を宣言する行から始まるブロックの集まりとして構成されており、ドメイン名の中にそのドメインが属している名前空間の情報が含まれているからです。以下に、 <kernel> と </usr/sbin/httpd> という名前空間を持つ /proc/ccs/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

15.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 ディレクティブと同じです。

また、条件付きアクセス許可の auto_domain_transition= という指定を用いて、ポリシーで許可されるのと同時に任意の名前空間へと遷移させることができます。(ただし、ポリシーで許可されたからといって、ドメイン遷移の後にそのアクセス要求が成功するという保証は存在しないため、利用する場合には注意してください。)

file pivot_root /usr/lxc/lxc1/ /usr/lxc/lxc1/oldroot/ auto_domain_transition="<lxc1>"
file pivot_root /usr/lxc/lxc2/ /usr/lxc/lxc2/oldroot/ auto_domain_transition="<lxc2>"

reset_domain ディレクティブは指定されたプログラムのパス名と同じ名前のドメインへしか遷移できないのに対して、条件付きアクセス許可の auto_domain_transition= という指定では任意の単語のドメインへと遷移することができます。言い換えると、前者は </usr/sbin/httpd> のようなドメインへしか遷移できないのに対して、後者は </usr/sbin/httpd> や <Apache> のようなドメインへ遷移できます。

task auto_domain_transition ディレクティブおよび 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 ディレクティブおよび条件付きアクセス許可の auto_domain_transition= という指定は名前空間と同じ名前のドメインへしか遷移できないのに対して、 task auto_domain_transition ディレクティブおよび task manual_domain_transition ディレクティブは任意のドメインへと遷移することができます。言い換えると、前者は </usr/sbin/httpd> のようなドメインへしか遷移できないのに対して、後者は </usr/sbin/httpd> や </usr/sbin/httpd> /var/www/cgi-bin/counter.cgi のようなドメインへ遷移できます。

15.4. ポリシーエディタから名前空間をどのように指定しますか?

ccs-editpolicy は最初に編集する名前空間を <$namespace> に設定するための新しいコマンドラインオプションとして <$namespace> がサポートされています。デフォルトの名前空間は <kernel> です。名前空間の指定間違いに注意してください。 ccs-editpolicy は現在編集中の名前空間に基づいて表示内容をフィルタリングするため、指定を間違えた場合、期待したとおりにエントリが表示されなくなります。

<<< Exception Policy Editor >>> 画面および <<< Profile Editor >>> 画面に関しては、 <<< Domain Transition Editor >>> 画面の3行目に現在選択されているドメイン名が表示されるのと同様に、現在編集中の名前空間の名前が3行目に表示されます。 w キーの後に n キーを押すと <<< Namespace Selector >>> 画面に切り替わって、編集したい名前空間を選択することができます。

ccs-editpolicy を用いて新しい名前空間を作成して、その名前空間用のプロファイルを作成して、エントリを追加することも可能ですが、より簡単に行うために ccs-loadpolicy を利用することを推奨します。例えば、 </usr/sbin/httpd> 名前空間で利用するためのプロファイルを作成するために <kernel> 名前空間で利用しているプロファイルを複製するには、以下のような awk スクリプトを利用することができます:

# awk ' { print "</usr/sbin/httpd> " $0 } ' /etc/ccs/profile.conf | ccs-loadpolicy -p

もし、 <kernel> というプレフィックスが既に /etc/ccs/profile.conf の中で指定されている場合、以下のようなスクリプトになるでしょう:

# grep '^<kernel> ' /etc/ccs/profile.conf | awk ' { $1 = "</usr/sbin/httpd> "; print $0 } ' | ccs-loadpolicy -p

名前空間の目的は、独立したドメインポリシー、例外ポリシー、プロファイルのセットを利用可能にすることであることを忘れないでください。既存のセットから複製しても構いませんが、既存のセットから複製しなければいけないわけではありません。

15.5. 名前空間を利用する上での注意点

名前空間は便利ですが、注意すべき点が幾つかあります。