JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Trusted Extensions 開発者ガイド     Oracle Solaris 10 1/13 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  Trusted Extensions API およびセキュリティーポリシー

2.  ラベルと認可上限

特権操作とラベル

ラベル API

Trusted Extensions システムの検出

プロセス機密ラベルへのアクセス

ラベル用のメモリーの割り当てと解放

ファイルのラベルの取得と設定

ラベル範囲の取得

ゾーン内のラベルへのアクセス

リモートホストタイプの取得

ラベルと文字列の変換

ラベルの読み取り可能バージョン

ラベルエンコーディングファイル

ラベルの比較

機密ラベルの取得

3.  ラベルのコード例

4.  印刷とラベル API

5.  プロセス間通信

6.  Trusted X Window System

7.  ラベルビルダー API

8.  信頼できる Web ガードプロトタイプ

9.  Solaris Trusted Extensions ラベル API のための試験的な Java バインディング

A.  プログラマーのリファレンス

B.  Trusted Extensions API リファレンス

索引

ラベル API

このセクションでは、基本的なラベル操作に使用できる API について説明します。これらの API を使用するには、次のヘッダーファイルを組み込む必要があります。

#include <tsol/label.h>

ラベル API は、-ltsol ライブラリオプションを指定してコンパイルします。

Trusted Extensions の API には、次に対応するデータ型が含まれています。

このセクションでは、次の操作に対応する API について説明します。

Trusted Extensions システムの検出

is_system_labeled() ルーチンは、Trusted Extensions システム上で実行しているかどうかを判定するために使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。

int is_system_labeled(void);

Trusted Extensions ソフトウェアがインストールされてアクティブになっている場合、is_system_labeled() ルーチンは TRUE (1) を返します。それ以外の場合は、FALSE (0) を返します。

is_system_labeled(3C) のマニュアルページを参照してください。このルーチンの使用例については、get_peer_label() ラベル対応関数」を参照してください。

また、これらの他のインタフェースを使用して、システムにラベルが付いているかどうかを調べることもできます。

プロセス機密ラベルへのアクセス

getplabel() および ucred_getlabel() ルーチンは、プロセスの機密ラベルにアクセスするために使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。

int getplabel(m_label_t *label_p);

getplabel() ルーチンは、呼び出し元プロセスのプロセスラベルを取得します。

getplabel(3TSOL) のマニュアルページを参照してください。

m_label_t *ucred_getlabel(const ucred_t *uc);

ucred_getlabel() ルーチンは、リモートプロセスの資格情報に含まれているラベルを取得します。

ucred_getlabel(3C) のマニュアルページを参照してください。このルーチンの使用例については、get_peer_label() ラベル対応関数」を参照してください。

ラベル用のメモリーの割り当てと解放

m_label_alloc()m_label_dup()、および m_label_free() ルーチンは、ラベル用のメモリーの割り当てと解放に使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。

m_label_t *m_label_alloc(const m_label_type_t label_type);

m_label_alloc() ルーチンは、ヒープ上の m_label_t データ構造体にラベルを割り当てます。ラベルの割り当ては、getlabel()fgetlabel() などのルーチンを呼び出す前に行う必要があります。str_to_label() などの一部のルーチンでは、m_label_t 構造体が自動的に割り当てられます。

m_label_alloc() ルーチンを使用してラベルを作成する場合は、機密ラベルまたは認可上限ラベルになるようにラベルタイプを設定できます。

int m_label_dup(m_label_t **dst, const m_label_t *src);

m_label_dup() ルーチンはラベルを複製します。

void m_label_free(m_label_t *label);

m_label_free() ルーチンは、ラベル用に割り当てられたメモリーを解放します。

m_label_t 構造体を割り当てる場合、または m_label_t 構造体が自動的に割り当てられる別のルーチンを呼び出す場合は、割り当てられたメモリーを解放する必要があります。m_label_free() ルーチンは、割り当てられたメモリーを解放します。

m_label(3TSOL) のマニュアルページを参照してください。

ファイルのラベルの取得と設定

setflabel() ルーチン、getlabel() システムコール、および fgetlabel() システムコールは、ファイルのラベルを取得および設定するために使用します。次の記述には、それらのルーチンとシステムコールのプロトタイプ宣言が含まれています。

int setflabel(const char *path, const m_label_t *label_p);

setflabel() ルーチンは、ファイルの機密ラベルを変更します。ファイルの機密ラベルが変わると、そのファイルは新しいラベルに対応するゾーンに移されます。ファイルは、その別のゾーンのルートからの相対パスである新規パス名に移動します。

setflabel(3TSOL) のマニュアルページを参照してください。

たとえば、setflabel() ルーチンを使用してファイル /zone/internal/documents/designdoc.odt のラベルを INTERNAL から RESTRICTED に変更した場合、そのファイルの新しいパスは /zone/restricted/documents/designdoc.odt になります。宛先ディレクトリが存在しない場合、ファイルは移動しません。

ファイルの機密ラベルを変更すると、元のファイルが削除されます。唯一の例外は、ソースおよび宛先のファイルシステムが、同一のベースとなるファイルシステムからループバックマウントされている場合に起こります。この場合、ファイルの名前が変更されます。

プロセスでオブジェクトが作成される場合、そのオブジェクトは呼び出し元プロセスの機密ラベルを継承します。setflabel() ルーチンは、ファイルシステムオブジェクトの機密ラベルをプログラム上で設定します。

ファイルマネージャーアプリケーションと setlabel コマンドは、承認ユーザーが既存のファイルを異なる機密ラベルに移動することを許可します。setlabel(1) のマニュアルページを参照してください。

int getlabel(const char *path, m_label_t *label_p);

getlabel() システムコールは、path で指定されるファイルのラベルを取得します。このラベルは、割り当てた m_label_t 構造体に格納されます。

getlabel(2) のマニュアルページを参照してください。

int fgetlabel(int fd, m_label_t *label_p);

fgetlabel() システムコールは、ファイル記述子を指定することによって、開いているファイルのラベルを取得します。

m_label_t 構造体を割り当てた場合は、m_label_free() ルーチンを使用して、割り当てたメモリーを解放する必要があります。m_label(3TSOL) のマニュアルページを参照してください。

ラベル範囲の取得

getuserrange() および getdevicerange() ルーチンは、それぞれユーザーとデバイスのラベル範囲を取得するために使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。

m_range_t *getuserrange(const char *username);

getuserrange() ルーチンは、指定されたユーザーのラベル範囲を取得します。範囲の下限は、ユーザーがマルチレベルデスクトップにログインしたときの初期ワークスペースラベルとして使用されます。上限あるいは認可上限は、ユーザーがラベル付けされたワークスペースに割り当てることができる使用可能なラベルの上限として使用されます。

ユーザーのラベル範囲のデフォルト値は label_encodings ファイルに指定されます。この値は user_attr ファイルによってオーバーライドできます。

setflabel(3TSOL)label_encodings(4)、および user_attr(4) のマニュアルページを参照してください。

bl_range_t *getdevicerange(const char *device);

getdevicerange() ルーチンは、ユーザーが割り当て可能なデバイスのラベル範囲を取得します。デバイスのラベル範囲を指定しない場合のデフォルトの範囲では、上限が ADMIN_HIGH、下限が ADMIN_LOW になります。

list_devices コマンドを使用して、デバイスのラベル範囲を表示することができます。

list_devices(1) のマニュアルページを参照してください。

ゾーン内のラベルへのアクセス

これらの関数は、ゾーン内のオブジェクトからラベル情報を取得します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。

char *getpathbylabel(const char *path, char *resolved_path, size_t bufsize, const m_label_t *sl);

getpathbylabel() ルーチンは、すべてのシンボリックリンクを展開して /./ および /../ への参照を解決し、余分なスラッシュ (/) 文字を削除して、resolved_path で指定されたバッファーにゾーンのパス名を格納します。bufsize 変数は、このバッファーのサイズをバイト単位で指定します。結果となるパスには、シンボリックリンクコンポーネントも、/.//../ も一切含まれません。この関数は、大域ゾーンからのみ呼び出すことができます。

ゾーンパス名は、機密ラベル sl からの相対位置で示されます。存在しないゾーン名に対して機密ラベルを指定するには、指定する機密ラベルがプロセス機密ラベルより優位であるか優位でないかに応じて、プロセスが priv_file_upgrade_sl または priv_file_downgrade_sl 特権を表明する必要があります。

getpathbylabel(3TSOL) のマニュアルページを参照してください。

m_label_t *getzoneidbylabel(const m_label_t *label);

getzoneidbylabel() ルーチンは、label というラベルを持つゾーンのゾーン ID を返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。

getzoneidbylabel(3TSOL) のマニュアルページを参照してください。

m_label_t *getzonelabelbyid(zoneid_t zoneid);

getzonelabelbyid() ルーチンは、zoneid の MAC ラベルを返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。

getzonelabelbyid(3TSOL) のマニュアルページを参照してください。

m_label_t *getzonelabelbyname(const char *zonename);

getzonelabelbyname() ルーチンは、zonename という名前のゾーンの MAC ラベルを返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。

getzonelabelbyname(3TSOL) のマニュアルページを参照してください。

m_label_t *getzonerootbyid(zoneid_t zoneid);

getzonerootbyid() ルーチンは、zoneid のルートパス名を返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。返されるパス名は、呼び出し側のゾーンのルートパスからの相対位置で示されます。

getzonerootbyid(3TSOL) のマニュアルページを参照してください。

m_label_t *getzonerootbylabel(const m_label_t *label);

getzonerootbylabel() ルーチンは、label というラベルを持つゾーンのルートパス名を返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。返されるパス名は、呼び出し側のゾーンのルートパスからの相対位置で示されます。

getzonerootbylabel(3TSOL) のマニュアルページを参照してください。

m_label_t *getzonerootbyname(const char *zonename);

getzonerootbyname() ルーチンは、zonename のルートパス名を返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。返されるパス名は、呼び出し側のゾーンのルートパスからの相対位置で示されます。

getzonerootbyname(3TSOL) のマニュアルページを参照してください。

リモートホストタイプの取得

このルーチンは、リモートホストタイプを特定します。次のルーチンの記述にはプロトタイプ宣言が含まれています。

tsol_host_type_t tsol_getrhtype(char *hostname);

tsol_getrhtype() ルーチンは、カーネルレベルのネットワーク情報を照会して、指定されたホスト名に関連付けられているホストタイプを特定します。hostname は、通常のホスト名、IP アドレス、またはネットワークワイルドカードアドレスにできます。返される値は、tsol_host_type_t 構造体に定義されている列挙型のいずれかになります。現時点では、これらの型は UNLABELED および SUN_CIPSO です。

tsol_getrhtype(3TSOL) のマニュアルページを参照してください。

ラベルと文字列の変換

label_to_str() および str_to_label() ルーチンは、ラベルと文字列との変換に使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。

int label_to_str(const m_label_t *label, char **string, const m_label_str_t conversion_type, uint_t flags);

label_to_str() ルーチンは、ラベル m_label_t を文字列に変換します。このルーチンを使用すると、格付け名を表示しない文字列にラベルを変換できます。この形式は公開オブジェクトへの格納に適しています。呼び出し元プロセスは、変換されるラベルより優位であるか、プロセスに sys_trans_label 特権が含まれている必要があります。

label_to_str(3TSOL) のマニュアルページを参照してください。

label_to_str() ルーチンは、変換される文字列にメモリーを割り当てます。呼び出し側では、free() ルーチンを呼び出してこのメモリーを解放する必要があります。

free(3C) のマニュアルページを参照してください。

int str_to_label(const char *string, m_label_t **label, const m_label_type_t label_type, uint_t flags, int *error);

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 の有効な値ですが、変換のすべてのタイプが両方のラベルタイプに有効であるとは限りません。

ラベルエンコーディングファイル

label_to_str() ルーチンは、label_encodings ファイル内のラベル定義を使用します。このエンコーディングファイルは、セキュリティー管理者が管理するテキストファイルです。このファイルには、サイト固有のラベルの定義と制約が含まれています。このファイルは /etc/security/tsol/label_encodings に保存されています。label_encodings ファイルについては、『Solaris Trusted Extensions ラベルの管理』『Compartmented Mode Workstation Labeling: Encodings Format 』、および label_encodings(4) のマニュアルページを参照してください。

ラベルの比較

blequal()bldominates()、および blstrictdom() ルーチンは、ラベルの比較に使用します。blinrange() ルーチンは、ラベルが指定されたラベル範囲内にあるかどうかを調べるために使用します。これらのルーチンでは、level は機密ラベルまたは認可上限ラベルに含まれる 1 つの格付けと一連のコンパートメントを指します。

int blequal(const blevel_t *level1, const blevel_t *level2);

blequal() ルーチンは、2 つのラベルを比較して level1level2 と等しいかどうかを判別します。

int bldominates(const m_label_t *level1, const m_label_t *level2);

bldominates() ルーチンは、2 つのラベルを比較して level1level2 より優位であるかどうかを判別します。

int blstrictdom(const m_label_t *level1, const m_label_t *level2);

blstrictdom() ルーチンは、2 つのラベルを比較して level1level2 よりも完全に優位であるかどうかを判別します。

int blinrange(const m_label_t *level, const brange_t *range);

blinrange() ルーチンは、ラベル level が指定された範囲 range 内にあるかどうかを判別します。

これらのルーチンでは、比較が真の場合はゼロ以外の値を返し、比較が偽の場合は値 0 を返します。これらのルーチンの詳細は、blcompare(3TSOL) のマニュアルページを参照してください。これらのルーチンがマルチレベルの印刷アプリケーションでどのように使用されるかの例は、「プリンタのラベル範囲に基づいたラベルリクエストの検証」を参照してください。

ラベル関係の詳細については、「ラベルの関係」を参照してください。

blmaximum() および blminimum() ルーチンは、指定されたラベル範囲の上限と下限を調べるために使用します。

void blmaximum(m_label_t *maximum_label, const m_label_t *bounding_label);

blmaximum() ルーチンは、2 つのラベルを比較して範囲の最小上限を見つけます。「最小上限」は、2 つの認可上限のうち低い方であり、特定の認可上限のシステムにアクセスできるかどうかを判別するために使用します。

たとえば、このルーチンを使用すると、ラベル付けされた 2 つのオブジェクトからの情報を組み合わせ、新たに別のオブジェクトを作成してラベル付けするときに使用するラベルを決められます。新しいオブジェクトのラベルは、ラベル付けされた元のいずれのオブジェクトよりも優位になります。

詳細は、blminmax(3TSOL) のマニュアルページを参照してください。

void blminimum(m_label_t *minimum_label, const m_label_t *bounding_label);

blminimum() ルーチンは、2 つのラベルを比較して、2 つのレベルで制限される範囲の最大下限を表しているラベルを見つけます。「最大下限」は、2 つのラベルのうちの高い方であり、特定の認可上限のシステムにアクセスできるかどうかを判別するためにも使用します。

詳細は、blminmax(3TSOL) のマニュアルページを参照してください。