Trusted Solaris 7 は、CDE 1.0.2 の拡張版であるトラステッド共通デスクトップ環境 (CDE) を使用します。トラステッド CDE は、Trusted Solaris 7 X ウィンドウシステムサーバーに、X ウィンドウシステム Version 11 を使用します。トラステッド X ウィンドウシステムサーバーには、必須アクセス制御、任意アクセス制御、情報ラベルの浮上、および特権の使用をサポートするプロトコル拡張機能があります。クライアントは、UNIX ドメインと TCP/IP ドメインのネットワーク接続を介してトラステッド X ウィンドウシステムサーバーに接続します。
データ転送セッションは、複数の機密ラベルとユーザー ID でインスタンス化 (多重インスタンス化) されます。これは、1 つの機密ラベルまたはユーザー ID における特権のないクライアントのデータが、トラステッド X ウィンドウシステムの任意アクセス制御と必須アクセス制御ポリシーである同位書き込みと下位読み取りに違反して、別の機密ラベルまたはユーザー ID で別のクライアントに転送されないようにするためです。
Trusted Solaris 7 の X ウィンドウシステムプログラミングインタフェースを使用すると、セキュリティ関連の属性情報の取得と設定を行なったり、バイナリラベルを ASCII に変換し、フォントリストと幅を使用して Helvetica 14 ポイントのボールドなどの字体を ASCII 文字列出力に適用したりできます。これらのインタフェースは、通常、Motif ウィジェット、Xt イントリンシクス、Xlib、CDE インタフェースで記述された管理アプリケーションによって呼び出されます。
セキュリティ関連情報の取得 - これらのインタフェースは、X プロトコル要求を出す Xlib レベルで動作します。Xlib インタフェースは、入力パラメータ値のデータ取得に使用します。
バイナリから ASCII へのラベル変換 - これらのインタフェースは、Motif レベルで動作します。入力パラメータは、バイナリラベル、出力文字列の外観を指定するフォントリスト、および希望する幅です。指定されたスタイルと幅を使用した複合文字列が返されます。
この章は、短い Motif アプリケーションを使用して、トラステッド X ウィンドウシステムのセキュリティポリシーと Trusted Solaris 7 インタフェースについて説明しています。
トラステッド X ウィンドウシステムインタフェースは、さまざまな X ウィンドウオブジェクトのセキュリティ関連の属性情報を管理します。アプリケーション GUI が Motif だけで作成されている場合は、Xlib オブジェクトのセキュリティ属性情報を処理するために、Motif ウィジェットの下位層で使用されている Xlib オブジェクト ID を取得するには、Motif アプリケーション内で XToolkit ルーチンを使用する必要があります。
トラステッド X ウィンドウシステムインタフェースを使用してセキュリティ属性情報が取得できる X ウィンドウオブジェクトには、ウィンドウ、プロパティ、X ウィンドウサーバー、クライアントと X ウィンドウサーバー間の接続があります。Xlib には、ウィンドウ、プロパティ、ディスプレイ、およびクライアント接続 ID を取得する呼び出しがあります。
プロパティ - プロパティは、プロパティ名によってアクセスされる任意のデータ収集です。プロパティ名とプロパティの種類は、32 ビットの一意の識別子でありキャラクタ名文字列であるアトムを使用して参照できます。
ウィンドウ、プロパティ、クライアント接続のセキュリティ属性は、所有者 ID と CMW ラベル情報から構成されます。ウィンドウのセキュリティ属性には、さらに、入力情報ラベルのセキュリティ属性も含まれます。これらの属性を取得する構造体の詳細は、「データ型、ヘッダーファイル、およびライブラリ」を参照してください。セキュリティ属性情報の取得と設定を行うインタフェースの詳細は、「プログラミングインタフェース宣言」を参照してください。
Solaris 7 |
Trusted Solaris 7 |
ウィンドウサーバーの所有者 ID |
機密ラベル |
ユーザー ID |
情報ラベル |
グループ ID |
入力情報ラベル |
クライアント ID |
X ウィンドウサーバーの認可上限 |
IP アドレス |
X ウィンドウサーバーの最下位ラベル |
|
トラステッドパスウィンドウ |
ウィンドウ、プロパティ、ピクセルマップオブジェクトには、ユーザー ID、クライアント ID、CMW ラベルがあります。グラフィックコンテキスト、フォント、カーソルには、クライアント ID しかありません。クライアントと X ウィンドウサーバー間の接続には、ユーザー ID、X ウィンドウサーバーID、CMW ラベルがあります。
ユーザー ID は、オブジェクトを作成したクライアントの ID です。クライアント ID は、オブジェクトを作成するクライアントが接続している接続番号に関連しています。
オブジェクトに対して何か操作を行う場合、任意アクセスポリシーにより、クライアントはそのオブジェクトを所有していなければなりません。クライアントのユーザー ID がオブジェクトの ID と等しい場合、クライアントはそのオブジェクトを所有しています。接続要求を行うには、クライアントのユーザー ID が X ウィンドウサーバーワークステーションの所有者のアクセス制御リスト (ACL) に存在していなければなりません。存在しない場合には、「プロセスのセキュリティ属性フラグの取得と設定」で説明しているように、クライアントはトラステッドパス属性を表明する必要があります。
必須アクセスポリシーでは、ウィンドウに名前をつけるときは同位書き込みと同位読み取り、属性に対しては下位書き込みとなります。CMW ラベルの機密ラベル部は、作成クライアントの機密ラベルに設定されます。CMW ラベルの情報ラベル部は、初めは ADMIN_LOW であり、クライアントがウィンドウに書き込むデータの情報ラベルに従って浮上します。
変更、作成、削除 - クライアントの機密ラベルは、オブジェクトの機密ラベルと同等でなければなりません。
名前、読み取り、取得 - クライアントの機密ラベルは、オブジェクトの機密ラベルよりも優位でなければなりません。
接続要求 - クライアントの機密ラベルが X ウィンドウサーバーワークステーションの所有者のセッション認可上限より劣位でなければなりません。そうでない場合には、「プロセスのセキュリティ属性フラグの取得と設定」で説明しているように、クライアントはトラステッドパス属性を表明する必要があります。
ウィンドウは、複数のクライアントで共有される情報が入った属性を所有できます。ウィンドウ属性は、アプリケーションが動作している機密ラベルで作成されます。これは、属性データに対するアクセスをアプリケーションの機密ラベルによって区別するためです。クライアントは、必須アクセス制限と任意アクセス制限による条件を満たしていれば属性を作成し、ウィンドウの属性にデータを格納し、属性からデータを取得することができます。多重インスタンス化されていない属性を指定するには /user/openwin/server/tsol/property.atoms を参照してください。
すべてのウィンドウには入力情報ラベルがあり、そのデフォルトは ADMIN_LOW です。トラステッドパスメニューを使用により、ユーザーは、ウィンドウの入力情報ラベルを設定できます。入力情報ラベルは、キーやボタンを押して離す操作によるデータ入力に割り当てられ、イベントの情報ラベルを浮上させます。
ルートウィンドウは、ウィンドウ階層の最上位にあります。ルートウィンドウは、どのクライアントにも属さない公開オブジェクトですが、保護すべきデータも含まれます。ルートウィンドウの属性は、ADMIN_LOW で保護されます。
クライアントには、少なくともルートウィンドウから派生した最上位クライアントウィンドウが 1 つあり、その最上位ウィンドウには入れ子になった別のウィンドウが含まれます。クライアントの最上位ウィンドウから派生したすべてのウィンドウは、同じ機密ラベルを持ちます。情報ラベルは、最上位ウィンドウから派生した各ウィンドウの情報ラベルをすべて結合したものに浮上します。クライアントの最上位ウィンドウから派生したサブウィンドウは、クライアントの最上位ウィンドウと同じ入力情報ラベルを持ちます。
メニューやある種のダイアログボックスのような、override-redirect ウィンドウは、入力フォーカスを別のクライアントから切り替え、不正な機密ラベルでのファイル入力を入力フォーカスが受け入れることを防止できません。override-redirect は作成クライアントに所有されており、ほかのクライアントがこのウィンドウを使用して別の機密ラベルでデータにアクセスすることはできません。
キーボード、ポインタ、サーバー制御を取得するには、クライアントは必須アクセス権と任意アクセス権を必要とします。フォーカスをリセットするには、クライアントはそのフォーカスを所有しているか、あるいは win_devices 特権を持っていなければなりません。
ポインタをワープするには、クライアントは、ポインタ制御と対象ウィンドウに対する必須アクセス権、および任意アクセス権を必要とします。明示的なユーザーアクションを含むイベントには、X 座標と Y 座標を取得できます。
選択マネージャは、情報が非トラステッドウィンドウ間で転送されるカット&ペーストやドラッグ&ドロップのような、ユーザーレベルのウィンドウ間データ移動を調整します。転送が試みられる場合、選択マネージャは、転送を捕獲し、転送を制御しているユーザーの承認を検証し、そのユーザーに確認とラベル付け情報を要求します。選択マネージャは、エンドユーザーが書き込みアプリケーションコードなしでデータ移動を試みる場合に常に表示されます。
管理者は、一部の転送形式に対し自動確認を設定できます。この場合、選択マネージャは表示されません。転送が必須アクセスポリシーと任意アクセスポリシーを満たす場合、データ転送は達成されます。ファイルマネージャとウィンドウマネージャ、それらの専用ドロップ領域に対する選択エージェントとしても動作します。多重インスタンス化された選択ターゲットを指定するには、/usr/openwin/server/tsol/selection.atoms を参照してください。どの選択ターゲットが自動的に承認されるか決定するには、/usr/dt/config/sel_config を参照してください。
ADMIN_LOW とラベル付けされたデフォルト資源は、クライアントでは作成できません。デフォルト資源を変更できるのは、ADMIN_LOW で動作しているか適切な特権を持つクライアントだけです。
ルートウィンドウの属性 - すべてのクライアントには読み取り権と作成権がありますが、書き込み権または変更権があるのは特権を持つクライアントだけです。情報ラベルの浮上はありません。「特権の必要な処理」を参照してください。
デフォルトカーソル - クライアントは、プロトコル要求で、自由にデフォルトカーソルを参照できます。
定義済みアトム - /usr/openwin/server/tsol/public.atoms ファイルには、定義済みアトムの読み取り専用リストが含まれています。
クライアントが選択マネージャを介さずにウィンドウ間でデータ移動を行うには、win_selection 特権が必要です。選択マネージャの詳細は、「選択マネージャ」を参照してください。
プロセス属性フラグの取得と設定の詳細は、第 2 章「プログラミングインタフェースの概要」を参照してください。
ユーザーの介入なしでウィンドウ、プロパティ、アトム名にアクセスするライブラリルーチンには、必須アクセスと任意アクセスが必要です。フレームバッファのグラフィックコンテキスト、フォント、カーソルにアクセスするライブラリルーチンは、任意アクセスを必要とし、次に説明している特殊な作業を行う場合にはさらに別の特権が必要になる場合があります。
クライアントは、オブジェクトに対するアクセスが拒否される場合、有効セットに win_dac_read、win_dac_write、win_mac_read、win_mac_write 特権が 1 つ以上必要になる場合があります。これらのポリシーを有効または無効にするには、/user/openwin/server/tsol/confi.privs を参照してください。
クライアントは、X ウィンドウサーバーに永続的に保持されたウィンドウまたはプロパティを設定または削除する場合、有効セットに win_config 特権を必要とします。この種の資源の例として、スクリーンセーバーの時間切れが挙げられます。
クライアントは、キーボード制御とポインタ制御の取得と設定、またはマウスボタンとキー割り当ての変更を行う場合、有効セットに win_devices 特権を必要とします。
クライアントは、X プロトコルの拡張機能であるダイレクトグラフィックスアクセス (DGA) を使用する場合、有効セットに win_dga 特権を必要とします。
クライアントは、ウィンドウ、ピクセルマップ、プロパティの情報ラベルや機密ラベルを既存の情報ラベルよりも優位でない新しいラベルに変更する場合、有効セットに win_downgrade_il または win_downgrade_sl 特権を必要とします。
クライアントプロセスは、ウィンドウ、ピクセルマップ、プロパティの情報ラベルや機密ラベルを既存のラベルよりも優位な新しいラベルに変更する場合、有効セットに win_upgrade_il または win_upgrade_sl 特権を必要とします。
クライアントは、オブジェクトの情報ラベルを浮上させることなくウィンドウ、ピクセルマップ、プロパティに書き込みを行う場合、有効セットに win_nofloat 特権を必要とします。
クライアントは、フォントパスを変更する場合、有効セットに win_fontpath 特権を必要とします。
この章で説明しているトラステッド X11 プログラミングインタフェースを使用するには、次のヘッダーファイルが必要です。
#include <tsol/Xtsol.h>
トラステッド X11 の例は、次のライブラリを使用してコンパイルしています。
-lXtsol -ltsol
この章で説明している、X11 ウィンドウシステムのラベルクリッピング用のプログラミングインタフェースを使用するには、次のヘッダーファイルが必要です。
#include <tsol/label_clipping.h>
ラベルクリッピング例は、次のライブラリを使用してコンパイルしています。
-lDtTsol -ltsol
ResourceType 型定義は、処理される資源の種類を示します。値には、IsWindow も指定できます。
XTsolResAttributes 構造体は、資源の属性を含みます。
CARD32 |
ouid |
ワークステーションサーバーの所有者のユーザー ID |
CARD32 |
uid |
ウィンドウのユーザー ID |
bslabel_t |
sl |
機密ラベル |
bilabel_t |
il |
情報ラベル |
bilabel_t |
iil |
入力情報ラベル |
XTsolPropAttributes 構造体は、プロパティの属性を含みます。
CARD32 |
uid |
プロパティのユーザー ID |
bslabel_t |
sl |
機密ラベル |
bilabel_t |
il |
情報ラベル |
XTsolClientAttributes 構造体は、クライアントの属性を含みます。
uid_t |
uid |
クライアントを開始したユーザーの ID |
gid_t |
gid |
グループ ID |
pid_t |
pid |
プロセス ID |
u_long |
sessionid |
セッション ID |
au_id_t |
auditid |
監査 ID |
u_long |
iaddr |
クライアントが動作しているワークステーションの IP アドレス |
setting_flag 型の定義は、CMW ラベルのフラグ値を次のように定義します。
SETCL_SL - CMW ラベルの機密ラベル部を設定する。SETCL_IL - CMW ラベルの情報ラベル部を設定する。SETCL_ALL - CMW ラベルの全体を設定する。
バイナリ CMW ラベルを示すデータ構造体です。インタフェースは、bclabel_t 型の構造体であるバイナリ CMW ラベルを受け入れて返します。
バイナリ CMW ラベルの情報ラベル部を示す型定義です。インタフェースは、bilabel_t 型の構造体であるバイナリの情報ラベルをパラメータとして受け入れて返します。
認可上限を示す型定義です。インタフェースは、bclear_t 型の構造体であるバイナリの認可上限をパラメータとして受け入れて返します。
この節では、トラステッド X11 インタフェースの宣言と、X11 ウィンドウシステムのラベルクリッピングインタフェースの宣言を説明します。
次のルーチンは、*resattrp 内の、ウィンドウ ID の資源属性を返します。詳細は、XTSOLgetResAttributes(3X11TSOL) のマニュアルページを参照してください。
Status XTSOLgetResAttributes( Display *display, XID object, ResourceType resourceFlag, XTsolResAttributes *resattrp);
次のルーチンは、*propattrp 内の、ウィンドウ ID のプロパティ属性を返します。詳細は、XTSOLgetPropAttributes(3X11TSOL) のマニュアルページを参照してください。
Status XTSOLgetPropAttributes( Display *display, Window win, Atom property, XTsolPropAttributes *propattrp);
次のルーチンは、*clientattrp 内のクライアント属性を返します。詳細は、XTSOLgetClientAttributes(3X11TSOL) のマニュアルページを参照してください。
Status XTSOLgetClientAttributes( Display *display, XID win, XTsolClientAttributes *clientattrp);
次のルーチンは、ウィンドウの CMW ラベルの取得と設定を行います。詳細は、XTSOLgetResLabel(3X11TSOL) と XTSOLsetResLabel(3X11TSOL) のマニュアルページを参照してください。
Status XTSOLgetResLabel( Display *display, XID object, ResourceType resourceFlag, bclabel_t *cmwlabel); void XTSOLsetResLabel( Display *display, XID object, ResourceType resourceFlag, bclabel_t *cmwLabel, enum setting_flag labelFlag);
次のインタフェースは、ウィンドウのユーザー ID の取得と設定を行います。詳細は、XTSOLgetResUID(3X11TSOL) と XTSOLsetResUID(3X11TSOL) のマニュアルページを参照してください。
Status XTSOLgetResUID( Display *display, XID object, ResourceType resourceFlag, uid_t *uidp); void XTSOLsetResUID( Display *display, XID object, ResourceType resourceFlag, uid_t *uidp);
ウィンドウの入力情報ラベルが変わる場合、クライアントの最上位ウィンドウから派生しているすべてのウィンドウの入力情報ラベルも変わります。そのウィンドウの所有者と同じ機密ラベルおよびユーザー ID を持つ別のクライアントが入力ウィンドウ上のキーボードイベントを求めた場合、そのキーボードイベントは両クライアントに送られます。このときの入力情報ラベルは、イベントが発生したところの入力情報ラベルです。
次のルーチンは、ウィンドウに対応した入力情報ラベルの取得と設定を行います。詳細は、XTSOLgetWindowIIL(3X11TSOL) と XTSOLsetWindowIIL(3X11TSOL) のマニュアルページを参照してください。
Status XTSOLgetWindowIIL( Display *display, Window win, bilabel_t *label); void XTSOLsetWindowIIL( Diplay *display, Window win, bilabel_t *label);
次のルーチンは、ウィンドウプロパティの CMW ラベルの取得と設定を行います。詳細は、XTSOLgetPropLabel(3X11TSOL) と XTSOLsetPropLabel(3X11TSOL) のマニュアルページを参照してください。
Status XTSOLgetPropLabel( Display *display, Window win, Atom property, bclabel_t *cmwlabel); void XTSOLsetPropLabel( Display *display, Window win, Atom property, bclabel_t *cmwLabel, enum setting_flag labelFlag);
次のインタフェースは、ウィンドウプロパティのユーザー ID の取得と設定を行います。詳細は、XTSOLgetPropUID(3X11TSOL) と XTSOLsetPropUID(3X11TSOL) のマニュアルページを参照してください。
Status XTSOLgetPropUID( Display *display, Window winID, Atom property, uid_t *uidp); void XTSOLsetPropUID( Display *display, Window win, Atom property, uid_t *uidp);
次のルーチンは、ワークステーションサーバーの所有者のユーザー ID の取得と設定を行います。詳細は、XTSOLgetWorkstationOwner(3X11TSOL) と XTSOLsetWorkstationOwner(3X11TSOL) のマニュアルページを参照してください。
XTSOLsetWorkstationOwner(3X11TSOL) は、ウィンドウマネージャ用に予約されています。
Status XTSOLgetWorkstationOwner( Display *display, uid_t *uidp); void XTSOLsetWorkstationOwner( Display *display, uid_t *uidp);
次のルーチンは、X ウィンドウサーバーに対し、セッション認可上限と最下位のセッションラベルを設定します。詳細は、XTSOLsetSessionHI(3X11TSOL) と XTSOLsetSessionLO(3X11TSOL) のマニュアルページを参照してください。
セッション認可上限は、ログイン時にワークステーション所有者の認可上限から設定されます。この認可上限は、所有者の認可上限とマシンモニターのラベル範囲の上限より劣位でなければなりません。いったん変更されると、ウィンドウサーバーの認可上限よりも高い機密ラベルで動作しているクライアントからの接続要求は、それらに特権がないかぎり拒否されます。
セッションの最下位ラベルは、ログイン時にワークステーション所有者の最下位ラベルから設定されます。このラベルは、管理者の権限で設定したそのユーザーの最下位ラベルとマシンモニターのラベル範囲の下限より優位でなければなりません。いったん変更されると、ウィンドウサーバーの機密ラベルよりも低い機密ラベルで動作しているクライアントからの接続要求は、それらに特権がないかぎり拒否されます。
これらのインタフェースは、ウィンドウマネージャ用に予約されています。
void XTSOLsetSessionHI( Display *display, bclear_t *clearance); void XTSOLsetSessionLO( Display *display, bslabel_t *sl);
次のルーチンは、指定されたウィンドウをトラステッドパスウィンドウに設定し、その後、指定されたウィンドウがトラステッドパスウィンドウかをテストします。詳細は XTSOLMakeTPWindow(3X11TSOL) のマニュアルページを参照してください。
void XTSOLMakeTPWindow( Display *dpy, Window win); Bool XTSOLIsWindowTrusted( Display *display, Window win);
次のインタフェースは、トラステッドストライプの高さの取得と設定 (加減操作) を行います。トラステッドストライプがまったくないか、あるいは極端に大きくならないように気を付けてください。詳細は、XTSOLsetSSHeight(3X11TSOL) と XTSOLgetSSHeight(3X11TSOL) のマニュアルページを参照してください。
これらのインタフェースは、ウィンドウマネージャ用に予約されています。
Status XTSOLgetSSHeight( Display *display, int screen_num, int *newHeight); void XTSOLsetSSHeight( Display *display, int screen_num, int newHeight);
次のルーチンを使用すると、クライアントは、クライアント自身の機密ラベルとは異なる機密ラベルで、プロパティ情報を取得できます。最初の呼び出しでは、希望する機密ラベルとユーザー ID を指定し、enabled を TRUE に設定します。続いて、XTSOLgetPropAttributes(3X11TSOL)、XTSOLgetPropLabel(3X11TSOL)、 XTSOLgetPropUID(3X11TSOL) のいずれかを呼び出します。最後に、enabled を FALSE に設定し、このルーチンを再び呼び出します。詳細は、XTSOLsetPolyInstInfo(3X11TSOL) のマニュアルページを参照してください。
void XTSOLsetPolyInstInfo( Display *dpy, bslabel_t *senslabel, uid_t *userID, int enabled);
次のルーチンは、フォントリストを使用して、バイナリの CMW ラベル、機密ラベル、情報ラベル、認可上限を、複合された文字列に変換します。戻される文字列は、指定されるピクセル幅にクリップされます。幅 (width) が画面幅 (display) と等しい場合には、画面幅の半分でラベルが折り返されます。flags パラメータの詳細は、第 6 章「ラベルのコード例」の 「バイナリと ASCII」に挙げられています。詳細は、labelclipping(3) のマニュアルページを参照してください。
/* CMW ラベル */ XmString Xbcltos( Display *display, const bclabel_t *cmwlabel, const Dimension width, const XmFontList fontlist, const int flags); /* 機密ラベル */ XmString Xbsltos( Display *display, const bslabel_t *senslabel, const Dimension width, const XmFontList fontlist, const int flags); /* 情報ラベル */ XmString Xbiltos( Display *display, const bilabel_t *inflabel, const Dimension width, const XmFontList fontlist, const int flags); /* 認可上限 */ XmString Xbcleartos( Display *display, const bclear_t *clearance, const Dimension width, const XmFontList fontlist, const int flags);
次の図の Motif アプリケーション例は、xclock または xterm アプリケーションを起動します。このアプリケーションは Trusted Solaris 7 X ウィンドウのプログラミングインタフェースが Motif アプリケーション内からどのように呼び出されるかを示すことが目的なので、その構造はシンプルです。このアプリケーションのプロセスの機密ラベルは Confidential で、情報ラベルは Unclassified です。
以降の節では、セキュリティ属性を処理し、フォントリストを使用してバイナリラベルを ASCII に変換する Trusted Solaris 7 インタフェースコールを使用するコードセグメント例を示しています。このコードセグメントは、アプリケーションプログラムでもっとも一般的な操作であるウィンドウのセキュリティ属性の処理に焦点を当てています。クライアントは、しばしば、適切な特権を使用して別のアプリケーションが作成したオブジェクトのセキュリティ属性を取得します。また、そのオブジェクトに対する操作がシステムの任意の所有権ポリシーと必須アクセスの同位書き込みおよび下位読み取りポリシーに許可されるかを確認するために、その属性をチェックします。アクセスが拒否されると、アプリケーションはエラーを表示するか、妥当な場合には特権を使用します。特権が必要な場合については、「特権の必要な処理」を参照してください。
次のコードセグメントを含むこの Motif アプリケーションのソースコードは、「コード」に示されています。Trusted Solaris 7 プログラミングインタフェースに渡すオブジェクト ID を取得する Xlib 呼び出しは、取得する ID が存在するように、適切なオブジェクトを作成してから指定してください。このソースコードでは、Xlib 呼び出しは XtRealizeWidget() が呼び出された後に指定されています。
XTSOLgetResAttributes(3X11TSOL) ルーチンは、ウィンドウのセキュリティ関連の属性を返します。指定するのは、ディスプレイとウィンドウの ID、セキュリティ属性を有効にしたいオブジェクトがウィンドウであることを示すフラグ、および返される属性を受け取る XtsolResAttributes 構造体です。クライアント自身が作成したウィンドウのセキュリティ属性を取得するため、クライアントは特権を必要としません。
/* Xlib 呼び出しを使用して上位のウィンドウを検出し、ID を表示する */ window = XtWindow(topLevel); display = XtDisplay(topLevel); /* ウィンドウのセキュリティ属性を取り出す */ retval = XTSOLgetResAttributes(display, window, IsWindow, &winattrs); /* ラベルを文字列に変換する */ retval = bsltos(&winattrs.sl, &string1, 0, LONG_WORDS); retval = biltos(&winattrs.il, &string2, 0, LONG_WORDS); retval = biltos(&winattrs.iil, &string3, 0, LONG_WORDS); /* セキュリティ属性情報を出力する */ printf("Workstation owner ID = %d, User ID = %d, SL = %s, IL = %s, IIL = %s¥n", winattrs.ouid, winattrs.uid,string1, string2, string3);
printf(1) 文によって、次のように出力されます。
Workstation owner ID = 29378
User ID = 29378
SL = CONFIDENTIAL
IL = UNCLASSIFIED
IIL = UNCLASSIFIED
次の例は、プロセスの機密ラベルを取得し、フォントリストとピクセル幅を使用してその機密ラベルを ASCII に変換します。また、ラベルの文字列を使用して、ラベルウィジェットを作成します。プロセスの機密ラベルはウィンドウの機密ラベルと同等であるため、特権は必要ありません。
最終文字列が幅より長い場合、文字列はクリップされ、クリップを示すインジケータが使用されます。クリップされた機密ラベルのクリップインジケータの詳細は、「機密ラベルと情報ラベル」および sbsltos(3) のマニュアルページを参照してください。X ウィンドウシステムのラベル変換インタフェースは指定されたピクセル数にクリップし、ラベルのクリッピングインタフェースは指定された文字数にクリップします。
サイトが label_encodings ファイルを英語以外の言語で使用する場合、ISO 8859-1 文字セットの 128 以上の文字コードをもつアクセント文字は変換されない場合があります。このプログラム例では、アジア諸国の文字セットは変換されません。
retval = getcmwplabel(&cmwlabel); getcsl(&senslabel, &cmwlabel); /* フォントリストを作成して、ラベルを変換する */ italic = XLoadQueryFont(XtDisplay(topLevel), "-adobe-times-medium-i-*-*-14-*-*-*-*-*-iso8859-1"); fontlist = XmFontListCreate(italic, "italic"); xmstr = Xbsltos(XtDisplay(topLevel), &senslabel, width, fontlist, LONG_WORDS); /* フォントリストとラベルテキストを使用して、ラベルウィジェットを作成する */ i=0; XtSetArg(args[i], XmNfontList, fontlist); i++; XtSetArg(args[i], XmNlabelString, xmstr); i++; label = XtCreateManagedWidget( "label", xmLabelWidgetClass, form, args, i);
斜体で示された機密ラベル文字列と非斜体のラベル「Launch an application (アプリケーションの起動)」のソースコードは、「コード」に示されています。次の図に示すようにラベルウィジェット内で斜体の機密ラベル文字列を表示するには、任意のコマンド行引数を指定してこのアプリケーションを起動してください。
次の例は、ウィンドウの CMW ラベルを取得します。プロセスの機密ラベルはウィンドウの機密ラベルと同等であるため、特権は必要ありません。
/* ウィンドウの CMW ラベルを検出する */ retval = XTSOLgetResLabel(display, window, IsWindow, &cmwlabel); /* ラベルを文字列に変換し出力する */ retval = bcltos(&cmwlabel, &string, 0, LONG_WORDS); printf("CWM label = %s¥n", string);
printf(1) 文によって、次のように出力されます。
CMW label = UNCLASSIFIED[C]
次の例は、ウィンドウの CMW ラベルを設定します。新しい機密ラベルは、ウィンドウの機密ラベルおよびプロセスの機密ラベルよりも優位です。クライアントは、それ自身よりも優位なラベルを変換する場合、有効セットに sys_trans_label 特権を必要とします。また、そのウィンドウの機密ラベルを変更するには、win_upgrade_sl 特権を必要とします。
/* 機密ラベルを ASCII 文字列からバイナリに変換し */ /* 有効セット内で sys_trans_label をオン (有効) にする */ retval = stobsl(&string4, &senslabel, NEW_LABEL, &error); /* sys_trans_label をオフ (無効) にする */ /* cmwlabel 構造体に機密ラベルを設定する */ setcsl(&cmwlabel, &senslabel); /* CMW ラベルの機密ラベル部に新しい値を設定し */ /* 有効セット内で win_upgrade_sl をオン (有効) にする */ retval = XTSOLsetResLabel(display, window, IsWindow, &cmwlabel, SETCL_SL); /* win_upgrade_sl をオフ (無効) にする */
次の例は、ウィンドウのユーザー ID を取得します。プロセスはウィンドウ資源を所有しており、同じ機密ラベルで動作しているため、特権は必要ありません。
/* ウィンドウのユーザー ID を取得する */ retval = XTSOLgetResUID(display, window, IsWindow, &uid);
次の例は、X ウィンドウサーバーにログインしているユーザーの ID を取得します。プロセスの機密ラベルはウィンドウの機密ラベルと同等であるため、特権は必要ありません。
/* ウィンドウのユーザー ID を取得する */ retval = XTSOLgetWorkstationOwner(display, &uid);
これは、図 15-1 と 図 15-2 に示している簡単な Motif アプリケーションのソースコードです。ラベルウィジェットで斜体の ASCII ラベル文字列を表示するには、任意のコマンド行引数を使用してアプリケーションを起動してください。
次に、この簡単な Motif アプリケーションのコピー元のファイルを示します。ファイルを作成し、XENVIRONMENT 変数にパス名を設定すれば、このアプリケーションが使用できます。
phoenix% setenv XENVIRONMENT /export/home/zelda/resfile
Example.*geometry: 400X100 Example.*orientation: XmHORIZONTAL Example.*label.labelString: Launch an application Example.*xclock.labelString: Run xclock Example.*xterm.labelString: Run xterm Example.*xmag.labelString: Run xmag Example.*goodbye.labelString: Quit Example.*XmPushButton*background: blue Example.*XmLabel*foreground: white Example.*XmLabel*foreground: white
phoenix% cc -I/usr/openwin/include -I/usr/dt/include ex.c -o ¥ Example -L/usr/openwin/lib -L/usr/dt/lib -lXm -lXt -lX11 -lXtsol -ltsol -lDtTsol |
#include <stdio.h> #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <Xm/Xm.h> #include <Xm/Label.h> #include <Xm/PushB.h> #include <Xm/Form.h> #include <tsol/Xtsol.h> #include <Dt/label_clipping.h> XTsolResAttributes winattrs; int retval, error; uid_t uid; Window window; Display *display; char *string = (char *)0, *string1 = (char *)0, *string2 = (char *)0, *string3 = (char *)0, *string4 = "SECRET"; XmFontList fontlist; XmString xmstr; XFontStruct *italic; Arg args[9]; Dimension width = 144; Widget stringLabel; bslabel_t senslabel; bclabel_t cmwlabel; /* コールバック */ void Xclock(Widget w, caddr_t client_data, caddr_t call_data) { system("xclock &"); } void Xterm(Widget w, caddr_t client_data, caddr_t call_data) { system("xterm &"); } void Quit(Widget w, caddr_t client_data, caddr_t call_data) { fprintf(stderr, "exiting . . .¥n"); exit(0); } main(int argc, char **argv) { Widget rowcolumn, label, xclock, xterm, quit, form, topLevel; int i = 0; Arg args[9]; /* ウィジェットを作成する */ topLevel = XtInitialize(argv[0], "XMCmds1", NULL, 0, &argc, argv); form = XtCreateManagedWidget("form", xmFormWidgetClass, topLevel, NULL, 0); /* コマンドの引数にラベルウィジェットが使用する ASCII 文字列とフォントリストを持つ */ /* アプリケーションはここで起動する */ if (argc == 2) { /* フォントリストを作成しラベルを変換する */ retval = getcmwplabel(&cmwlabel); getcsl(&senslabel, &cmwlabel); italic = XLoadQueryFont(XtDisplay(topLevel), "-adobe-times-medium-i-*-*-14-*-*-*-*-*-iso8859-1"); fontlist = XmFontListCreate(italic, "italic"); xmstr = (XmString)Xbsltos(XtDisplay(topLevel), &senslabel, width, fontlist, LONG_WORDS); /* フォントリストとラベルテキストを使用してラベルウィジェットを作成する */ i=0; XtSetArg(args[i], XmNfontList, fontlist); i++; XtSetArg(args[i], XmNlabelString, xmstr); i++; label = XtCreateManagedWidget( "label", xmLabelWidgetClass, form, args, i); } /* コマンドの引数にラベルウィジェット用の資源ファイル内のテキストを使用しない */ /* アプリケーションはここで起動する */ else { label = XtCreateManagedWidget("label", xmLabelWidgetClass, form, NULL, 0); } /* 引き続きウィジェットを作成する */ i=0; XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++; XtSetArg(args[i], XmNtopWidget, label); i++; XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++; XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION); i++; XtSetArg(args[i], XmNrightPosition, 33); i++; XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++; xclock = XtCreateManagedWidget("xclock", xmPushButtonWidgetClass, form, args, i); i=0; XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++; XtSetArg(args[i], XmNtopWidget, label); i++; XtSetArg(args[i], XmNleftAttachment, XmATTACH_POSITION); i++; XtSetArg(args[i], XmNleftPosition, 33); i++; XtSetArg(args[i], XmNrightAttachment, XmATTACH_POSITION);i++;Ha>
Trusted Solaris オペレーティング環境におけるウィンドウの動作は、以下のファイルの設定によって変更できます。
/usr/dt/bin/Xsession
このスクリプトで、セッションとウィンドウマネージャが起動します。このスクリプトではフォントパスおよび他のセッション全体のデフォルト値を設定します。
/usr/dt/bin/Xtsolusersession
このスクリプトで、ワークスペース内のアプリケーションを起動するコンテキストを生成します。たとえば、このスクリプトには、pfsh 以外のログインシェルを使用するユーザー用に、$HOME/.dtprofile を source する行が含まれます (デフォルトでは、.dtprofile は、ログインシェルが pfsh であるアカウントの場合は source されない)。サイトのセキュリティ管理者は、スクリプトに修正を加えることで、これを変更できます。
/usr/openwin/server/tsol/config.privs
このファイルを使って、指定された特権のためのセキュリティチェックを外すことができます。このファイルに含まれる特権には、セキュリティチェックが実行されません。たとえば、このファイルに win_fontpath を挿入すると、フォント読み込み制限が緩和されます。
/usr/openwin/server/tsol/property.atoms
/usr/openwin/server/tsol/public.atoms
/usr/openwin/server/tsol/selection.atoms