この章では、ラベルの初期化、ラベルと認可上限との比較など、基本的なラベル操作を実行するための Solaris Trusted Extensions API について説明します。また、プロセスのラベルにアクセスするための API についても説明します。
Trusted Extensions API を Solaris OS で使用する方法の例は、Solaris ソースコードを参照してください。OpenSolaris の Web サイト の左のナビゲーションバーにある「Source Browser」をクリックします。Source Browser を使用して Solaris のソースコードを検索します。
この章の内容は次のとおりです。
第 3 章「ラベルのコーディング例」に、この章で説明するプログラミングインタフェースのコーディング例があります。
操作がセキュリティーポリシーをバイパス、つまり上書きする場合、操作はその実効セットに特別な特権が必要です。
特権は、プログラム上または管理上、次のように実効セットに追加されます。
実行可能ファイルが root によって所有され、セットユーザー ID のアクセス権ビットが設定されている場合、実効セットにすべての特権を含んで起動されます。たとえば、CDE ファイルマネージャーが実効セットにすべての特権を含んで起動されます。次に、ファイルマネージャーはそのほとんどの特権をプログラム上で放棄し、ラベル間のドラッグ&ドロップ操作の実行に必要な特権のみを保持します。
管理者が、SMF サービス用のマニフェストファイル、または一般コマンド用の RBAC データベース exec_attr ファイルに特権を指定できます。このファイルについての詳細は、exec_attr(4) のマニュアルページを参照してください。
バイナリラベルを変換する場合、および機密ラベルをアップグレードまたはダウングレードする場合、操作には特別な特権が必要です。
ユーザーおよび役割は、特別な特権によって操作を実行できます。その特権は「権利プロファイル」を使用することによって指定できます。特定の特権によって特定の関数を実行できるようにアプリケーションを作成することもできます。特別な特権を必要とするアプリケーションを作成する場合、特権を必要とする関数を実行するときのみ特権を有効にし、関数が完了したら特権を削除するようにします。この方法を「特権ブラケット」と呼びます。詳細は、『Solaris セキュリティーサービス開発ガイド』を参照してください。
バイナリラベルの変換 – ラベルの内部表現と文字列を相互に変換できます。プロセスのラベルが変換されるラベルより優位ではない場合、変換を実行するために、呼び出し元プロセスには sys_trans_label 特権が必要です。
機密ラベルのアップグレードまたはダウングレード – ファイルの機密ラベルを「ダウングレード」または「アップグレード」できます。ファイルが呼び出し元プロセスに所有されていない場合、呼び出し元プロセスには file_owner 特権がその実効セットに必要です。詳細は、setflabel(3TSOL) のマニュアルページを参照してください。
プロセスは、その実効セットに file_downgrade_sl 特権を含めることによって、ファイルシステムオブジェクトの既存の機密ラベルをそれより優位ではない新しい機密ラベルに設定できます。 file_downgrade_sl 特権によって、ファイルを分離ラベルに付け替えることができます。
プロセスは、その実効セットに file_upgrade_sl 特権を含めることによって、ファイルシステムオブジェクトの既存の機密ラベルをそれより優位である新しい機密ラベルに設定できます。
アプリケーションは次のいずれかで動作するので、ほとんどのアプリケーションは特権を使用してアクセス制御をバイパスしません。
アプリケーションは 1 つの機密ラベルで起動され、その同じ機密ラベルでオブジェクトのデータにアクセスします。
アプリケーションは 1 つの機密ラベルで起動され、ほかの機密ラベルでオブジェクトのデータにアクセスしますが、必須アクセス操作がシステムセキュリティーポリシーによって許可されます。たとえば、下位読み取りが MAC によって許可されます。
アプリケーションがそのプロセスの機密ラベルとは異なる機密ラベルでデータにアクセスしようとして拒否される場合、プロセスにはアクセスを得るための特権が必要です。「特権」によって、アプリケーションは MAC または DAC をバイパスできます。たとえば、file_dac_read、 file_dac_write、および file_dac_search 特権は DAC をバイパスします。file_upgrade_sl および file_downgrade_sl 特権は MAC をバイパスします。どのようにアクセスするにしても、アクセスされるデータの格付けが、アプリケーションの設計によって損なわれてはなりません。
アプリケーションがそれ自体の機密ラベルまたは別のオブジェクトの機密ラベルを変更する場合、必ずすべてのファイル記述子を閉じてください。開いているファイル記述子があると、機密データがほかのプロセスに漏れる可能性があります。
この節では、基本的なラベル操作に使用できる API について説明します。それらの API を使用するには、次のヘッダーファイルを組み込む必要があります。
#include <tsol/label.h>
ラベル API は -ltsol ライブラリオプションを指定してコンパイルします。
Trusted Extensions API は、次に対するデータ型を含みます。
機密ラベル – m_label_t 型定義は機密ラベルを表します。m_label_t 構造体は不透明です。
インタフェースは m_label_t 型の変数をパラメータとして受け入れます。インタフェースは m_label_t 型の変数で機密ラベルを返します。m_label_t 型定義は blevel_t 構造体と互換性があります。
機密ラベル範囲 – brange_t データ構造は機密ラベルの範囲を表します。この構造体は最小ラベルと最大ラベルを保持します。構造体フィールドは variable.lower_bound と variable.upper_bound です。
次の操作のための API について、この節で説明します。
Trusted Extensions システムの検出
プロセス機密ラベルへのアクセス
ラベルのためのメモリーの割り当てと解放
ファイルのラベルの取得と設定
ラベル範囲の取得
ゾーンのラベルへのアクセス
遠隔ホストタイプの取得
ラベルと文字列との変換
ラベルの比較
is_system_labeled() ルーチンを使用して、Trusted Extensions システム上で実行中であるかどうかを判別します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれます。
Trusted Extensions ソフトウェアがインストールされてアクティブである場合、is_system_labeled() ルーチンは TRUE (1) を返します。それ以外の場合は FALSE (0) を返します。
is_system_labeled(3C) のマニュアルページを参照してください。このルーチンの使用例は、「get_peer_label() ラベル対応関数」を参照してください。
ほかにも次のようなインタフェースを使用して、システムにラベルが付けられているかどうかを判別することができます。
X クライアント。マルチレベル機能に依存する X クライアントを書き込んでいる場合は、XQueryExtension() ルーチンを使用して SUN_TSOL 拡張用の X サーバーをクエリーします。
シェルスクリプト。システムにラベルが付けられているかどうかを判別するシェルスクリプトを書き込んでいる場合に、plabel コマンドを使用します。plabel(1) のマニュアルページを参照してください。
次の例は、/onnv/onnv-gate/usr/src/cmd/svc/shell/smf_include.sh スクリプトで使用される smf_is_system_labeled() 関数を示します。
# # Trusted Extensions の別名でも知られるシステムにラベルが付けられている場合、成功を意味するゼロを返す。 # それ以外の場合は 1。 # smf_is_system_labeled() { [ ! -x /bin/plabel ] && return 1 /bin/plabel > /dev/null 2>&1; return $? }
getplabel() および ucred_getlabel() ルーチンが、プロセスの機密ラベルへのアクセスのために使用されます。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれます。
getplabel() ルーチンは、呼び出し元プロセスのプロセスラベルを取得します。
getplabel(3TSOL) のマニュアルページを参照してください。
ucred_getlabel() ルーチンは、遠隔プロセスの資格のラベルを取得します。
ucred_getlabel(3C) のマニュアルページを参照してください。このルーチンの使用例は、「get_peer_label() ラベル対応関数」を参照してください。
m_label_alloc()、m_label_dup()、および m_label_free() ルーチンが、ラベルのためのメモリーの割り当てと解放に使用されます。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれます。
m_label_alloc() ルーチンは、ヒープの m_label_t データ構造にラベルを割り当てます。getlabel() や fgetlabel() などのルーチンを呼び出す前に、ラベルを割り当てる必要があります。str_to_label() などのルーチンでは、m_label_t 構造体が自動的に割り当てられます。
m_label_alloc() ルーチンを使用してラベルを作成する場合、機密ラベルまたは認可上限ラベルになるようにラベルタイプを設定できます。
m_label_dup() ルーチンはラベルを複製します。
m_label_free() ルーチンは、ラベルに割り当てられたメモリーを解放します。
m_label_t 構造体を割り当てる場合、または m_label_t 構造体が自動的に割り当てられる別のルーチンを呼び出す場合、割り当てられたメモリーを解放する必要があります。m_label_free() ルーチンは、割り当てられたメモリーを解放します。
m_label(3TSOL) のマニュアルページを参照してください。
setflabel() ルーチン、getlabel() システムコール、および fgetlabel() システムコールが、ファイルのラベルの取得と設定のために使用されます。次の記述には、ルーチンおよびシステムコールのプロトタイプ宣言が含まれます。
setflabel() ルーチンは、ファイルの機密ラベルを変更します。ファイルの機密ラベルが変わると、新しいラベルに対応するゾーンにファイルが移動します。ファイルは、ほかのゾーンのルートに相対的な新しいパス名に移動します。
setflabel(3TSOL) のマニュアルページを参照してください。
たとえば、setflabel() ルーチンを使用してファイル /zone/internal/documents/designdoc.odt のラベルを INTERNAL から RESTRICTED に変更すると、ファイルの新しいパスは /zone/restricted/documents/designdoc.odt になります。移動先のディレクトリが存在しない場合、ファイルは移動しません。
ファイルの機密ラベルを変更すると、元のファイルは削除されます。移動元と移動先のファイルシステムが同じ基礎となるファイルシステムからループバックマウントされる場合は例外です。この場合、ファイルの名前が変更されます。
プロセスがオブジェクトを作成する場合、オブジェクトは呼び出し元プロセスの機密ラベルを継承します。setflabel() ルーチンは、ファイルシステムオブジェクトの機密ラベルをプログラムによって設定します。
ファイルマネージャーアプリケーションおよび setlabel コマンドでは、承認ユーザーが既存のファイルを異なる機密ラベルに移動することができます。setlabel(1) のマニュアルページを参照してください。
getlabel() システムコールは、path によって指定されるファイルのラベルを取得します。ラベルは、割り当てた m_label_t 構造体に格納されます。
getlabel(2) のマニュアルページを参照してください。
fgetlabel() システムコールは、ファイル記述子を指定することによって、開かれているファイルのラベルを取得します。
m_label_t 構造体を割り当てる場合、割り当てられたメモリーを m_label_free() ルーチンを使用して解放する必要があります。m_label(3TSOL) のマニュアルページを参照してください。
getuserrange() および getdevicerange() ルーチンが、それぞれユーザーとデバイスのラベル範囲を取得するために使用されます。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれます。
getuserrange() ルーチンは、指定したユーザーのラベル範囲を取得します。ユーザーがマルチレベルデスクトップにログインするときに、範囲の下限がラベルとして使用されます。範囲の上限、すなわち認可上限は、ラベル付けされたワークスペースにユーザーが割り当てることができる使用可能なラベルに対する上限として使用されます。
ユーザーのラベル範囲のデフォルト値は label_encodings ファイルで指定します。その値は user_attr ファイルによって上書きできます。
setflabel(3TSOL)、label_encodings(4)、および user_attr(4) のマニュアルページを参照してください。
getdevicerange() ルーチンは、ユーザーが割り当て可能なデバイスのラベル範囲を取得します。デバイスにラベル範囲を指定しない場合のデフォルト範囲は、上限が ADMIN_HIGH、下限が ADMIN_LOW です。
list_devices コマンドを使用して、デバイスのラベル範囲を表示できます。
list_devices(1) および getdevicerange(3TSOL) のマニュアルページを参照してください。
次の関数が、ゾーンのオブジェクトからラベル情報を取得します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれます。
getpathbylabel() ルーチンは、すべてのシンボリックリンクを展開して /./、/../ の参照を解決し、余分なスラッシュ (/) 文字を削除し、resolved_path という名前のバッファーにゾーンパス名を格納します。bufsize 変数は、このバッファーのバイト単位のサイズを指定します。その結果得られたパスには、シンボリックリンクの構成要素、または /./ や /../ はありません。この関数は大域ゾーンからのみ呼び出せます。
ゾーンパス名は機密ラベル sl から相対的なものです。存在しないゾーン名に機密ラベルを指定するには、指定する機密ラベルがプロセス機密ラベルより優位であるか優位でないかに応じて、プロセスが priv_file_upgrade_sl または priv_file_downgrade_sl 特権を表明する必要があります。
getpathbylabel(3TSOL) のマニュアルページを参照してください。
getzoneidbylabel() ルーチンは、ラベルが label であるゾーンのゾーン ID を返します。このルーチンは、指定したゾーンの状態が少なくとも ZONE_IS_READY でなければなりません。呼び出し元プロセスのゾーンは指定したゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーンにある必要があります。
getzoneidbylabel(3TSOL) のマニュアルページを参照してください。
getzonelabelbyid() ルーチンは zoneid の MAC ラベルを返します。このルーチンは、指定したゾーンの状態が少なくとも ZONE_IS_READY でなければなりません。呼び出し元プロセスのゾーンは指定したゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーンにある必要があります。
getzonelabelbyid(3TSOL) のマニュアルページを参照してください。
getzonelabelbyname() ルーチンは、名前が zonename であるゾーンの MAC ラベルを返します。このルーチンは、指定したゾーンの状態が少なくとも ZONE_IS_READY でなければなりません。呼び出し元プロセスのゾーンは指定したゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーンにある必要があります。
getzonelabelbyname(3TSOL) のマニュアルページを参照してください。
getzonerootbyid() ルーチンは zoneid のルートパス名を返します。このルーチンは、指定したゾーンの状態が少なくとも ZONE_IS_READY でなければなりません。呼び出し元プロセスのゾーンは指定したゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーンにある必要があります。返されるパス名は、呼び出し元ゾーンのルートパスから相対的なものです。
getzonerootbyid(3TSOL) のマニュアルページを参照してください。
getzonerootbylabel() ルーチンは、ラベルが label であるゾーンのルートパス名を返します。このルーチンは、指定したゾーンの状態が少なくとも ZONE_IS_READY でなければなりません。呼び出し元プロセスのゾーンは指定したゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーンにある必要があります。返されるパス名は、呼び出し元ゾーンのルートパスから相対的なものです。
getzonerootbylabel(3TSOL) のマニュアルページを参照してください。
getzonerootbyname() ルーチンは zonename のルートパス名を返します。このルーチンは、指定したゾーンの状態が少なくとも ZONE_IS_READY でなければなりません。呼び出し元プロセスのゾーンは指定したゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーンにある必要があります。返されるパス名は、呼び出し元ゾーンのルートパスから相対的なものです。
getzonerootbyname(3TSOL) のマニュアルページを参照してください。
このルーチンが遠隔ホストタイプを判別します。次のルーチンの記述にはプロトタイプ宣言が含まれます。
tsol_getrhtype() ルーチンは、カーネルレベルのネットワーク情報を照会して、指定されたホスト名に関連付けられているホストタイプを判別します。hostname は、通常のホスト名、IP アドレス、またはネットワークワイルドカードアドレスです。返される値は、tsol_host_type_t 構造体に定義されている列挙型のいずれかです。現在、そのタイプは UNLABELED および SUN_CIPSO です。
tsol_getrhtype(3TSOL) のマニュアルページを参照してください。
label_to_str() および str_to_label() ルーチンが、ラベルと文字列との変換に使用されます。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれます。
label_to_str() ルーチンは、ラベル m_label_t を文字列に変換します。このルーチンを使用して、格付け名を表示しない文字列にレベルを変換できます。この形式は、共通オブジェクトでの格納に適します。呼び出し元プロセスは変換されるラベルより優位であるか、プロセスに sys_trans_label 特権がある必要があります。
label_to_str(3TSOL) のマニュアルページを参照してください。
label_to_str() ルーチンは、変換される文字列にメモリーを割り当てます。呼び出し元は、free() ルーチンを呼び出してこのメモリーを解放する必要があります。
free(3C) のマニュアルページを参照してください。
str_to_label() ルーチンは、ラベル文字列をラベル m_label_t に変換します。m_label_t 構造体を割り当てる場合、割り当てられたメモリーを m_label_free() ルーチンを使用して解放する必要があります。
str_to_label() ルーチンを使用してラベルを作成する場合、機密ラベルまたは認可上限ラベルになるようにラベルタイプを設定できます。
str_to_label(3TSOL) および m_label(3TSOL) のマニュアルページを参照してください。
label_to_str() ルーチンは、ラベルの読み取り可能バージョンを提供します。M_LABEL 変換タイプは、そのラベルで格付けされている文字列を返します。M_INTERNAL 変換タイプは、格付けされていない文字列を返します。格付けされた文字列バージョンは、通常、ウィンドウなどの表示用に使用します。格付けされた文字列は格納に適さない場合があります。印刷のために、いくつかの変換タイプが提供されています。すべての印刷用タイプは、文字列が示すラベルで格付けされる読み取り可能文字列を示します。
conversion_type パラメータはラベル変換のタイプを制御します。次は、conversion_type の有効な値ですが、変換のすべてのタイプが両方のレベルタイプに有効ではありません。
M_LABEL は、ラベルのタイプ (機密ラベルまたは認可上限) に基づくラベルの文字列です。このラベル文字列はラベルのレベルで格付けされるので、共通オブジェクトで格納する場合は安全でありません。たとえば、CONFIDENTIAL などの M_LABEL 文字列は、ラベルの単語が格付けされることが多いので、共通ディレクトリに格納するのは安全ではありません。
M_INTERNAL は、格付けされていない表現のラベル文字列です。この文字列は、共通オブジェクトで格納する場合に安全です。たとえば、0x0002-04-48 などの M_INTERNAL 文字列は、LDAP データベースに格納する場合に安全です。
M_COLOR は、セキュリティー管理者がラベルに関連付けた色を表す文字列です。ラベルと色の関連付けは、label_encodings ファイルの LOCAL DEFINITIONS セクションに格納されます。
PRINTER_TOP_BOTTOM は、バナーページおよびトレーラページの最上部ラベルと最下部ラベルとして使用される文字列です。
PRINTER_LABEL は、バナーページのダウングレード警告として使用される文字列です。
PRINTER_CAVEATS は、バナーページの警告のセクションに使用される文字列です。
PRINTER_CHANNEL は、バナーページの処理チャネルとして使用される文字列です。
label_to_str() ルーチンは label_encodings ファイルのラベル定義を使用します。エンコーディングファイルは、セキュリティー管理者が管理するテキストファイルです。ファイルには、サイト固有のラベルの定義および制約が含まれます。このファイルは /etc/security/tsol/label_encodings に保存されます。label_encodings ファイルについての詳細は、『Solaris Trusted Extensions ラベルの管理』, 『コンパートメントモードワークステーションのラベル作成: エンコード形式』 および label_encodings(4) のマニュアルページを参照してください。
blequal()、bldominates()、および blstrictdom() ルーチンが、ラベルの比較のために使用されます。blinrange() ルーチンは、指定されたラベル範囲内にラベルがあるかどうかを判別するために使用されます。このルーチンで、level は、格付け、および機密ラベルまたは認可上限ラベルのコンパートメントのセットを指します。
blequal() ルーチンは 2 つのラベルを比較して、level1 が level2 と等しいかどうかを判別します。
bldominates() ルーチンは 2 つのラベルを比較して、level1 が level2 より優位であるかどうかを判別します。
blstrictdom() ルーチンは 2 つのラベルを比較して、level1 が level2 より厳密に優位であるかどうかを判別します。
これらのルーチンは、比較が真の場合はゼロ以外の値、比較が偽の場合は 0 の値を返します。これらのルーチンの詳細は、blcompare(3TSOL) のマニュアルページを参照してください。これらのルーチンがマルチレベルの印刷アプリケーションでどのように使用されるかの例は、「プリンタのラベル範囲に対するラベル要求の検査」を参照してください。
ラベル関係の詳細は、「ラベル関係」を参照してください。
blmaximum() および blminimum() ルーチンは、指定したラベル範囲の上限および下限を判別するために使用します。
blmaximum() ルーチンは 2 つのラベルを比較して、範囲の最小上限を見つけます。「最小上限」 は、2 つの認可上限のうちの低い方であり、特定の認可上限のシステムにアクセスしているかどうかを判別するために使用します。
たとえば、このルーチンを使用して、ラベル付けされた 2 つのオブジェクトの情報を組み合わせ、新たに別のオブジェクトを作成してラベル付けするときに使用するラベルを決定します。新しいオブジェクトのラベルは、ラベル付けされた元の 2 つのオブジェクトよりも優位となります。
blminmax(3TSOL) のマニュアルページを参照してください。
blminimum() ルーチンは 2 つのラベルを比較して、2 つのレベルによって制限される範囲の最大下限になっているラベルを見つけます。「最大下限」は、2 つのラベルのうちの高い方であり、特定の認可上限のシステムにアクセスできるかどうかを判別するためにも使用します。
blminmax(3TSOL) のマニュアルページを参照してください。
機密ラベルは、ラベル付けされたゾーンおよびほかのプロセスから取得されます。ユーザーは、現在のゾーンの現在の機密ラベルでのみプロセスを起動することができます。
プロセスがオブジェクトを作成する場合、オブジェクトは呼び出し元プロセスの機密ラベルを継承します。setlabel コマンドまたは setflabel() ルーチンを使用して、ファイルシステムオブジェクトの機密ラベルを設定できます。setlabel(1) および setflabel(3TSOL) のマニュアルページを参照してください。
次のスクリプト runwlabel は、指定するプログラムを、指定するラベル付けされたゾーンで実行します。このスクリプトは大域ゾーンから実行するのでなければなりません。
runwlabel スクリプトは、指定されたプログラムを実行する、ラベル付けされたゾーンの機密ラベルを最初に取得します。スクリプトは、getzonepath コマンドを使用して、コマンド行から指定されるラベルからゾーンパスを取得します。getzonepath(1) のマニュアルページを参照してください。
次に、runwlabel スクリプトは zoneadm コマンドを使用して、getzonepath によって取得されたゾーンパスに関連付けられているゾーン名を検索します。zoneadm(1M) のマニュアルページを参照してください。
最後に、runwlabel スクリプトは zlogin コマンドを使用して、指定されたラベルに関連付けられているゾーンで、指定されたプログラムを実行します。zlogin(1) のマニュアルページを参照してください。
Confidential:Internal Use Only ラベルに関連付けられているゾーンでzonename コマンドを実行するには、大域ゾーンから runwlabel スクリプトを実行します。たとえば、次のように指定します。
machine1% runwlabel "Confidential : Internal Use Only" zonename |
次に runwlabel スクリプトのソースを示します。
#!/sbin/sh # # 使用法: # runwlabel "my-label" my-program # [ ! -x /usr/sbin/zoneadm ] && exit 0 # SUNWzoneu がインストールされていない PATH=/usr/sbin:/usr/bin; export PATH # "my-label" ゾーンに関連付けられているゾーンパスを取得する # 末尾の "/root" を削除する zonepath=`getzonepath "$1" | sed -e 's/\/root$//'` progname="$2" # このゾーンパスに関連付けられているゾーン名を検索する for zone in `zoneadm list -pi | nawk -F: -v zonepath=${zonepath} '{ if ($4 == zonepath) { print $2 } }'`; do # 一致するゾーン指定されたコマンドを実行する zlogin ${zone} ${progname} done exit
次のスクリプト runinzone は、ゾーンが起動されていない場合でも、指定されたゾーンでプログラムを実行します。このスクリプトは大域ゾーンから実行するのでなければなりません。
このスクリプトは、最初に、指定されたゾーンを起動します。次に、zlogin コマンドを使用して、指定されたゾーンで waitforzone スクリプトを実行します。
waitforzone スクリプトは、ローカルゾーンオートマウンタが起動するのを待機し、指定したプログラムを、指定したユーザーとして実行します。
public ゾーンで /usr/bin/xclock コマンドを実行するには、大域ゾーンから次を実行します。
machine1% runinzone public terry /usr/bin/xclock |
次に runinzone スクリプトのソースを示します。
#!/sbin/ksh zonename=$1 user=$2 program=$3 # 指定されたゾーンを起動する zoneadm -z ${zonename} boot # 指定されたゾーンでコマンドを実行する zlogin ${zonename} /bin/demo/waitforzone ${user} ${program} ${DISPLAY}
runinzone スクリプトは次のスクリプト waitforzone を呼び出します。
#!/bin/ksh user=$1 program=$2 display=$3 # auto_home トリガーがロードされるのをチェックし # ローカルゾーンオートマウンタが起動するまで待機する while [ ! -d /home/${user} ]; do sleep 1 done # ここで、指定したコマンドを指定したユーザーとして実行する su - ${user} -c "${program} -display ${display}"