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