機密ラベルは、ラベル付けされたゾーンおよびほかのプロセスから取得されます。ユーザーは、現在のゾーンの現在の機密ラベルでのみプロセスを起動することができます。
プロセスがオブジェクトを作成する場合、オブジェクトは呼び出し元プロセスの機密ラベルを継承します。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}"