Solaris Trusted Extensions 開発ガイド

機密ラベルの取得

機密ラベルは、ラベル付けされたゾーンおよびほかのプロセスから取得されます。ユーザーは、現在のゾーンの現在の機密ラベルでのみプロセスを起動することができます。

プロセスがオブジェクトを作成する場合、オブジェクトは呼び出し元プロセスの機密ラベルを継承します。setlabel コマンドまたは setflabel() ルーチンを使用して、ファイルシステムオブジェクトの機密ラベルを設定できます。setlabel(1) および setflabel(3TSOL) のマニュアルページを参照してください。

次のスクリプト runwlabel は、指定するプログラムを、指定するラベル付けされたゾーンで実行します。このスクリプトは大域ゾーンから実行するのでなければなりません。


例 2–1 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 は、ゾーンが起動されていない場合でも、指定されたゾーンでプログラムを実行します。このスクリプトは大域ゾーンから実行するのでなければなりません。


例 2–2 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}"