ドメイン遷移
ドメイン遷移には2種類あります。1つはプログラムの実行要求( execve() システムコール)を伴うドメイン遷移です。もう1つはプログラムの実行要求を伴わないドメイン遷移です。
この種類のドメイン遷移はアクセス制御のモードに依存します。プロセスがプログラムを実行しようとすると、以下の処理が行われます。
[source] は現在のドメイン名(例: <kernel> /usr/sbin/sshd /bin/bash )または現在のドメイン名の最後のパス名(例: /bin/bash )を表します。
[current_domain] は現在のドメイン名(例: <kernel> /usr/sbin/sshd /bin/bash )を表します。
[current_namespace] は現在のドメインの名前空間の名前(例: <kernel> /usr/sbin/sshd /bin/bash ドメインの場合は <kernel> )を表します。
[destination] はプログラムの実行要求が成功した場合に遷移するドメイン名(例: <kernel> /usr/sbin/sshd /bin/bash /bin/cat )を表します。
[candidate] はパーミッションのチェックの対象となるパス名(例: /bin/cat )を表します。
ステップ |
内容 |
(1) task auto_execute_handler ディレクティブのチェック |
ドメインポリシーに
task auto_execute_handler [pathname] keep
というエントリが存在している場合、 [current_domain] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task auto_execute_handler [pathname] child
というエントリが存在している場合、 [current_domain] [pathname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task auto_execute_handler [pathname] reset
というエントリが存在している場合、 <[pathname]> を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task auto_execute_handler [pathname] initialize
というエントリが存在している場合、 [current_namespace] [pathname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task auto_execute_handler [pathname] parent
というエントリが存在している場合、 [current_domain] の親ドメインを [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task auto_execute_handler [pathname] [domainname]
というエントリが存在している場合、 [domainname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task auto_execute_handler [pathname] [pathname]
というエントリが存在している場合、 [current_domain] [pathname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task auto_execute_handler [pathname]
というエントリが存在している場合、 [pathname] を [candidate] にしてステップ (6) へと進みます。 |
(2) プログラムのパス名を取得 |
要求されたプログラムのパス名を取得し、それを [candidate] とします。
シンボリックリンクとして提供されているプログラムに対処するために、パス名の最後のシンボリックリンクは解決しないようにします。 |
(3) aggregator ディレクティブのチェック |
もし、例外ポリシーに
aggregator [candidate] [pathname]
というエントリが存在している場合、 [pathname] を [candidate] にします。 |
(4) file execute ディレクティブのチェック |
ドメインポリシーに
file execute [candidate] keep
というエントリが存在している場合、 [current_domain] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
file execute [candidate] child
というエントリが存在している場合、 [current_domain] [candidate] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
file execute [candidate] reset
というエントリが存在している場合、 <[candidate]> を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
file execute [candidate] initialize
というエントリが存在している場合、 [current_namespace] [candidate] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
file execute [candidate] parent
というエントリが存在している場合、 [current_domain] の親ドメインを [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
file execute [candidate] [domainname]
というエントリが存在している場合、 [domainname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
file execute [candidate] [pathname]
というエントリが存在している場合、 [current_domain] [pathname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
file execute [candidate]
というエントリが存在している場合、ステップ (6) に進みます。
その他の場合、プロファイルの CONFIG または CONFIG::file または CONFIG::file::execute (後者が前者より優先されます)で mode=enforcing という設定が行われていた場合にはステップ (5) に進みます。そうではない場合には、ステップ (6) に進みます。 |
(5) task denied_execute_handlerディレクティブのチェック |
ドメインポリシーに
task denied_execute_handler [pathname] keep
というエントリが存在している場合、 [current_domain] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task denied_execute_handler [pathname] child
というエントリが存在している場合、 [current_domain] [pathname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task denied_execute_handler [pathname] reset
というエントリが存在している場合、 <[pathname]> を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task denied_execute_handler [pathname] initialize
というエントリが存在している場合、 [current_namespace] [pathname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task denied_execute_handler [pathname] parent
というエントリが存在している場合、 [current_domain] の親ドメインを [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task denied_execute_handler [pathname] [domainname]
というエントリが存在している場合、 [domainname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task denied_execute_handler [pathname] [pathname]
というエントリが存在している場合、 [current_domain] [pathname] を [destination] にしてステップ (7) へ進みます。
ドメインポリシーに
task denied_execute_handler [pathname]
というエントリが存在している場合、 [pathname] を [candidate] にしてステップ (6) へと進みます。
存在しない場合、実行要求は拒否されます。 |
(6) デフォルトのドメイン遷移の決定 |
1番最初に、例外ポリシーに
reset_domain [candidate] from [source]
reset_domain any from [source]
reset_domain any from any
の何れかのエントリが存在しており、かつ、
no_reset_domain [candidate] from [source]
no_reset_domain any from [source]
no_reset_domain any from any
の何れのエントリも存在しない場合、 <[candidate]> を [destination] にしてステップ (7) へ進みます。
2番目に、例外ポリシーに
initialize_domain [candidate] from [source]
initialize_domain any from [source]
initialize_domain any from any
の何れかのエントリが存在しており、かつ、
no_initialize_domain [candidate] from [source]
no_initialize_domain any from [source]
no_initialize_domain any from any
の何れのエントリも存在しない場合、 [current_namespace] [candidate] を [destination] にしてステップ (7) へ進みます。
3番目に、例外ポリシーに
keep_domain [candidate] from [source]
keep_domain any from [source]
keep_domain any from any
の何れかのエントリが存在しており、かつ、
no_keep_domain [candidate] from [source]
no_keep_domain any from [source]
no_keep_domain any from any
の何れのエントリも存在しない場合、 [current_domain] を [destination] にしてステップ (7) へ進みます。
4番目に、 [current_domain] [candidate] を [destination] にします。 |
(7) 遷移先ドメインの作成 |
ステップ (1) または (4) または (5) または (6) で決定した [destination] が存在しない場合には作成します。
ステップ (1) または (4) または (5) で決定された [destination] を作成できなかった場合には、プログラムの実行要求は拒否されます。
reset_domain で決定された [destination] を作成できなかった場合には、プログラムの実行要求は拒否されます。
ステップ (6) で決定された [destination] を作成できなかった場合で、かつ、プロファイルの CONFIG または CONFIG::file または CONFIG::file::execute (後者が前者より優先されます)で mode=enforcing という設定が行われていた場合にはプログラムの実行要求は拒否されます。
そうではない場合、 transition_failed ディレクティブを設定して、ドメイン遷移を行わないまま実行要求の処理を継続します。 |
(8) 環境変数のチェック |
もし、1個以上の環境変数の許可が [destination] ドメインに与えられておらず、かつ [destination] ドメインに割り当てられているプロファイル( CONFIG または CONFIG::misc または CONFIG::misc::env (後者が前者より優先されます))のモードが mode=enforcing の場合、実行要求は拒否されます。 |
(9) バイナリローダのチェック |
(バイナリローダを必要とするプログラムの場合、)バイナリローダに対する読み込み許可が [destination] ドメインに与えられておらず、かつ [destination] ドメインに割り当てられているプロファイル( CONFIG または CONFIG::file または CONFIG::file::open (後者が前者より優先されます))のモードが mode=enforcing の場合、実行要求は拒否されます。 |
(10) プログラムの実行 |
もし、カレントプロセスが要求されたプログラムによって正常に置き換えられた場合、カレントプロセスは [destination] ドメインへと遷移します。 |
この種類のドメイン遷移はアクセス制御のモードに依存しません。ポリシーで許可されていないドメイン遷移要求は常に拒否されます。
もし、ドメインに対して task auto_domain_transition ディレクティブが指定されていた場合、カレントプロセスは条件節で指定されている条件を満たした時点で自動的にそのディレクティブで指定されたドメインへと遷移します。この遷移はプログラムの実行要求時だけでなくファイルのオープンのような全てのアクセス要求時にチェックされます。
もし、ドメインに対して task manual_domain_transition ディレクティブが指定されていた場合、カレントプロセスは /proc/ccs/self_domain インタフェースに対してこのディレクティブで指定されているドメイン名を書き込むことにより、そのドメインへと遷移します。
もし、ドメインポリシーのアクセス許可に auto_domain_transition="name" という条件が指定されており、カレントプロセスがそのアクセス許可に一致するアクセス要求を行った場合、カレントプロセスは「現在のドメイン名」と「 name で指定されたパス名」とを連結したドメイン名を持つドメインへと遷移します。この遷移は、アクセス許可のチェック時点で行われるものであるため、アクセス要求がアクセス許可に一致することによりドメイン遷移が発生した後にアクセス要求が失敗する可能性があります。注意して利用してください。