Solaris Trusted Extensions 開発ガイド

ラベル 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) および getdevicerange(3TSOL) のマニュアルページを参照してください。

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

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

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 ラベルの管理』, 『コンパートメントモードワークステーションのラベル作成: エンコード形式』 および label_encodings(4) のマニュアルページを参照してください。

ラベルの比較

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

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() ルーチンは、指定された範囲 range 内にラベル level があるかどうかを判別します。

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

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

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

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

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

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

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

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

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

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