tomoyotitle.png

Chapter 4: TOMOYO Linux はどのように動きますか?

4.1. ドメインを理解する

TOMOYO Linux では、強制アクセス制御の適用はドメインという単位で行われます。これは重要な概念です。システム上に存在する全てのプロセスはそれぞれ1個のドメインに属しています。ドメインはプロセスの実行履歴により決定されます。大まかに言うと、プログラムが実行されるたびに新しいドメインが作成されます。あるドメインの名前はそのドメインに到達するまでに実行された全てのプログラムのパス名を連結したものとして定義されます。このドメインを作成することはドメイン遷移と呼ばれています。以下の図を見てください:

domain_transition.png

カーネルは常に最初のドメインであり、 TOMOYO Linux においては <kernel> というドメイン名で定義されます。この例では、カーネルが /sbin/init を実行します。プログラムが実行されたことにより、新しいドメイン、この場合は <kernel> /sbin/init という名前を持つドメインが作成されます。起動スクリプトが実行されると、より多くのドメインが作成されていきます。

このプロセス実行履歴は重要です。以下のドメインを考えてください:

<kernel> /sbin/init /etc/rc.d/rc
<kernel> /sbin/init /etc/rc.d/rc.sysinit /etc/rc.d/rc

どちらのドメインも /etc/rc.d/rc というプログラムが実行されることにより作成されています。しかし、プロセス実行履歴が異なるため、これらは2つの異なるドメインとして扱われます。これは、あるドメインから実行できるプログラムを制御できることを、また、そのプロセスがどのように実行されたかにより異なるレベルの制限を行う柔軟なポリシーを記述できることを示しています。また、とても正確なドメイン遷移を行いつつ、例えばプロセスがどのように実行されたかによらずに同じ制限を適用することも可能であることを示しています。この項目については後述します。

4.2. ポリシーエディタを用いてドメインを確認する

よりドメインについて理解するために、ポリシーエディタを見てみましょう。ポリシーエディタは TOMOYO Linux で使用する中心的なツールであり、使い方に慣れることが重要です。このページの説明を補足するものとして、ポリシーエディタの使い方も参照してください。

システムを TOMOYO Linux カーネルで起動させてから、( /etc/tomoyo/ ディレクトリに存在しているポリシーファイルを編集するために) /etc/tomoyo/ というオプションを指定してポリシーエディタを実行してください:

# /usr/sbin/tomoyo-editpolicy /etc/tomoyo/

ポリシーエディタにはいくつもの画面が存在し、それぞれが異なる役割を提供しています。デフォルトで最初に表示される画面は Domain Transition Editor です。以下の画面は上記のコマンドを実行することで表示されるドメインのツリーです。現時点では <kernel> ドメインだけが定義されています:

editpolicy-domain-list1.png

初期化されたばかりのポリシーであるため、 /etc/tomoyo/ ディレクトリに存在するポリシーファイルは空っぽです。TOMOYO Linux には2種類のポリシーのセットが存在しています:1つは現在カーネル内にロードされているポリシーのセットであり、もう1つは /etc/tomoyo/ ディレクトリ内に保存されているポリシーのセットです。 /etc/tomoyo/ ディレクトリには複数のポリシーのセットを保存することができ、起動時または必要な時にカーネル内へと読み込ませることができます。ポリシーをディスクに保存する方法については後述します。 q キーを押してポリシーエディタを終了してください。

今度は、(現在カーネル内にロードされているポリシーを閲覧するために) /etc/tomoyo/ というオプションを指定しないでポリシーエディタを実行してください:

# /usr/sbin/tomoyo-editpolicy

システムが動作するにつれて、 TOMOYO Linux は新しいドメインが作成されたことを記録して、ドメインのツリーへと追加していきます。上記のコマンドを実行することにより、システム起動時から現在までに作成された全てのドメインを含むドメインのツリーが表示されます:

editpolicy-domain-list2.png

1行目は現在表示されている画面の名前と、存在しているドメインの数が表示されます。
2行目はメッセージを表示するための領域です。
3行目は現在カーソルのある行のドメイン名が表示されます。
4行目以降は現在定義されているドメインのツリーが表示されます。

適当にコマンドを実行してどのようにドメインが作成されるかを確認してみてください。コマンドを別の画面などで実行する場合は、ポリシーエディタを終了させる必要はありません。

矢印キーHome/End/PageUp/PageDown キーを使って画面をスクロールすることができます。
r キーを押すと、最新の状態に更新されます。
f キーを押すと、検索ができます。
? キーを押すと、利用可能なコマンドが表示されます。再度 ? キーを押すと元の画面に戻ります。

新しいドメインは同じ名前のドメインが存在しない場合だけ作成されます。そのため、同じコマンドを何度も実行しても、繰り返した数だけドメインが作成されるわけではありません。

4.3. プロファイルを理解する

それぞれのドメインはプロファイルというものを指定することにより制限が行われるようになります。プロファイルは他のドメインに割り当てられているプロファイルとは無関係に自由にドメインに割り当てることができます。そのため、ドメインに対するアクセス制限の設定を1個ずつ順番に行っていくことも可能です。また、特定のドメインに対して専用のプロファイルを割り当てることも可能です。この応用についてはここではまだ説明しません。

ポリシーエディタの画面で、それぞれの行の2番目に表示されている数値に注目してください:

editpolicy-domain-profile-number.png

この数値はプロファイル番号と呼ばれています。プロファイル番号は0~255の整数値です。デフォルトのプロファイル番号は0であり、プロファイル0は無効モードとも呼ばれています。無効モードのプロファイルが割り当てられたドメインでは全く制限が行われません。

w キーを押してポリシーエディタで利用可能な画面の一覧を表示してみましょう:

editpolicy-window-list.png

p キーを押して Profile Editor 画面を表示すると、以下のようなプロファイルの一覧が表示されます:

editpolicy-profile-list.png

それぞれのプロファイルには3種類の行が存在しています:

名前

内容

COMMENT

プロファイルの用途を表すコメント

CONFIG

アクセス制御モードの設定

PREFERENCE

各種オプションの設定

CONFIG 行の mode パラメータには以下の何れかの値を指定できます:

意味

disabled

通常のカーネルのように動作します。

learning

アクセス要求がポリシーで許可されていなくても拒否しません。また、同じアクセス要求を次回以降は許可するためにポリシーに追加します。

permissive

アクセス要求がポリシーで許可されていなくても拒否しません。ただし、ポリシーへの追加も行いません。

enforcing

アクセス要求がポリシーで許可されていない場合には拒否します。また、ポリシーへの追加も行いません。

PREFERENCE 行には以下のオプションを指定できます:

名前

内容

max_entry

学習モードによりドメインポリシーへと自動的に追加されるアクセス許可の件数の上限

enforcing_penalty

強制モードでポリシー違反を起こしたプロセスに対して強制的にスリープさせる時間

デフォルトでは役割の異なる4つのプロファイルが定義されています:

default_profiles-ja.png

これらのプロファイルをドメインへと割り当てていきます:

kernel_namespace.png

学習モード用プロファイルというのはポリシーの作成を容易にするための TOMOYO Linux の特徴です。学習モードが割り当てられたドメインではドメインポリシーが自動的に作成されます。学習モードで作成されたポリシーを精製していくことでしっかりとしたポリシーを作成することができます。他のプロファイル(確認モード用と強制モード用)は後でドメインの動作に制限をかける際に利用します。

プロファイル管理の詳細については Chapter 9: より詳細なプロファイルの管理を参照してください。

4.4. ドメインポリシーを理解する

それぞれのドメインに対する制限の内容は Domain Policy Editor 画面で確認できます。この画面は Domain Transition Editor 画面でドメインを選択して Enter キーを押すことで表示されます。現時点ではまだポリシーが定義されていないので、空っぽです。以下の写真は Apache 用のドメインポリシーの例です:

(クリックすると全体を表示します。)
editpolicy-httpd-acl1.png

ドメインポリシーのパーミッションは allow_read や allow_write などのディレクティブと一緒にこの画面に表示されます。ドメインに対して強制モード用のプロファイルを割り当てることにより、ここで定義されているアクセス許可(および例外ポリシーで定義されているアクセス許可( 4.5: 例外ポリシーを理解する)を参照してください)だけが許可されるようになります。正常な動作をするのに必要最小限の権限を持ったポリシーを作成するために、学習モードと確認モードを使うことができます。ドメインポリシーで指定できるディレクティブについての詳細は Appendix B: ポリシー仕様の中のドメインポリシー仕様を参照してください。

4.5. 例外ポリシーを理解する

w キーを押して、次に e キーを押すと、 Exception Policy Editor という画面が表示されます:

(クリックすると全体を表示します。)
editpolicy-exception-list1.png

矢印キーや Home/End/PageUp/PageDown キーを使って画面をスクロールすることができます。

この画面で表示されるパーミッションはドメインポリシーで表示されるパーミッションと似ていますが、全てのドメインに対して適用されるという点が異なります。この画面で定義されたパーミッションはドメインポリシーには表示されません。また、例外ポリシーで与えられているアクセス許可に一致するアクセス要求は自動的に許可されます。また、例外ポリシーはグループ化ディレクティブを指定することによりドメインポリシーを削減および単純化するためにも利用されます。

例外ポリシーで指定できるディレクティブについての詳細は Appendix B: ポリシー仕様の中の例外ポリシー仕様を参照してください。