ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
Trusted Extensions 開発者ガイド Oracle Solaris 10 1/13 Information Library (日本語) |
1. Trusted Extensions API およびセキュリティーポリシー
9. Solaris Trusted Extensions ラベル API のための試験的な Java バインディング
このセクションでは、基本的なラベル操作に使用できる API について説明します。これらの API を使用するには、次のヘッダーファイルを組み込む必要があります。
#include <tsol/label.h>
ラベル API は、-ltsol ライブラリオプションを指定してコンパイルします。
Trusted Extensions の API には、次に対応するデータ型が含まれています。
機密ラベル – m_label_t 型定義は機密ラベルを表します。m_label_t 構造体は不透明です。
インタフェースは m_label_t 型の変数をパラメータとして受け入れます。インタフェースは m_label_t 型の変数で機密ラベルを返すことができます。m_label_t 型定義は blevel_t 構造体と互換性があります。
機密ラベル範囲 – brange_t データ構造体は機密ラベルの範囲を表します。この構造体は最小ラベルと最大ラベルを保持します。構造体のフィールドは variable.lower_bound および variable.upper_bound と呼ばれます。
このセクションでは、次の操作に対応する API について説明します。
Trusted Extensions システムの検出
プロセス機密ラベルへのアクセス
ラベル用のメモリーの割り当てと解放
ファイルのラベルの取得と設定
ラベル範囲の取得
ゾーン内のラベルへのアクセス
リモートホストタイプの取得
ラベルと文字列の変換
ラベルの比較
is_system_labeled() ルーチンは、Trusted Extensions システム上で実行しているかどうかを判定するために使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。
Trusted Extensions ソフトウェアがインストールされてアクティブになっている場合、is_system_labeled() ルーチンは TRUE (1) を返します。それ以外の場合は、FALSE (0) を返します。
is_system_labeled(3C) のマニュアルページを参照してください。このルーチンの使用例については、「get_peer_label() ラベル対応関数」を参照してください。
また、これらの他のインタフェースを使用して、システムにラベルが付いているかどうかを調べることもできます。
X クライアント。マルチレベル機能に依存する X クライアントを作成している場合は、XQueryExtension() ルーチンを使用して X サーバーに SUN_TSOL 拡張を問い合わせます。
シェルスクリプト。システムにラベルが付いているかどうかを調べるシェルスクリプトを作成している場合は、plabel コマンドを使用します。plabel(1) のマニュアルページを参照してください。
次の例は、/onnv/onnv-gate/usr/src/cmd/svc/shell/smf_include.sh スクリプトで使用される smf_is_system_labeled() 関数を示しています。
# # Returns zero (success) if system is labeled (aka Trusted Extensions). # 1 otherwise. # smf_is_system_labeled() { [ ! -x /bin/plabel ] && return 1 /bin/plabel > /dev/null 2>&1 return $? }
getplabel() および ucred_getlabel() ルーチンは、プロセスの機密ラベルにアクセスするために使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。
getplabel() ルーチンは、呼び出し元プロセスのプロセスラベルを取得します。
getplabel(3TSOL) のマニュアルページを参照してください。
ucred_getlabel() ルーチンは、リモートプロセスの資格情報に含まれているラベルを取得します。
ucred_getlabel(3C) のマニュアルページを参照してください。このルーチンの使用例については、「get_peer_label() ラベル対応関数」を参照してください。
m_label_alloc()、m_label_dup()、および m_label_free() ルーチンは、ラベル用のメモリーの割り当てと解放に使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。
m_label_alloc() ルーチンは、ヒープ上の m_label_t データ構造体にラベルを割り当てます。ラベルの割り当ては、getlabel() や fgetlabel() などのルーチンを呼び出す前に行う必要があります。str_to_label() などの一部のルーチンでは、m_label_t 構造体が自動的に割り当てられます。
m_label_alloc() ルーチンを使用してラベルを作成する場合は、機密ラベルまたは認可上限ラベルになるようにラベルタイプを設定できます。
m_label_dup() ルーチンはラベルを複製します。
m_label_free() ルーチンは、ラベル用に割り当てられたメモリーを解放します。
m_label_t 構造体を割り当てる場合、または m_label_t 構造体が自動的に割り当てられる別のルーチンを呼び出す場合は、割り当てられたメモリーを解放する必要があります。m_label_free() ルーチンは、割り当てられたメモリーを解放します。
m_label(3TSOL) のマニュアルページを参照してください。
setflabel() ルーチン、getlabel() システムコール、および fgetlabel() システムコールは、ファイルのラベルを取得および設定するために使用します。次の記述には、それらのルーチンとシステムコールのプロトタイプ宣言が含まれています。
setflabel() ルーチンは、ファイルの機密ラベルを変更します。ファイルの機密ラベルが変わると、そのファイルは新しいラベルに対応するゾーンに移されます。ファイルは、その別のゾーンのルートからの相対パスである新規パス名に移動します。
setflabel(3TSOL) のマニュアルページを参照してください。
たとえば、setflabel() ルーチンを使用してファイル /zone/internal/documents/designdoc.odt のラベルを INTERNAL から RESTRICTED に変更した場合、そのファイルの新しいパスは /zone/restricted/documents/designdoc.odt になります。宛先ディレクトリが存在しない場合、ファイルは移動しません。
ファイルの機密ラベルを変更すると、元のファイルが削除されます。唯一の例外は、ソースおよび宛先のファイルシステムが、同一のベースとなるファイルシステムからループバックマウントされている場合に起こります。この場合、ファイルの名前が変更されます。
プロセスでオブジェクトが作成される場合、そのオブジェクトは呼び出し元プロセスの機密ラベルを継承します。setflabel() ルーチンは、ファイルシステムオブジェクトの機密ラベルをプログラム上で設定します。
ファイルマネージャーアプリケーションと setlabel コマンドは、承認ユーザーが既存のファイルを異なる機密ラベルに移動することを許可します。setlabel(1) のマニュアルページを参照してください。
getlabel() システムコールは、path で指定されるファイルのラベルを取得します。このラベルは、割り当てた m_label_t 構造体に格納されます。
getlabel(2) のマニュアルページを参照してください。
fgetlabel() システムコールは、ファイル記述子を指定することによって、開いているファイルのラベルを取得します。
m_label_t 構造体を割り当てた場合は、m_label_free() ルーチンを使用して、割り当てたメモリーを解放する必要があります。m_label(3TSOL) のマニュアルページを参照してください。
getuserrange() および getdevicerange() ルーチンは、それぞれユーザーとデバイスのラベル範囲を取得するために使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。
getuserrange() ルーチンは、指定されたユーザーのラベル範囲を取得します。範囲の下限は、ユーザーがマルチレベルデスクトップにログインしたときの初期ワークスペースラベルとして使用されます。上限あるいは認可上限は、ユーザーがラベル付けされたワークスペースに割り当てることができる使用可能なラベルの上限として使用されます。
ユーザーのラベル範囲のデフォルト値は label_encodings ファイルに指定されます。この値は user_attr ファイルによってオーバーライドできます。
setflabel(3TSOL)、label_encodings(4)、および user_attr(4) のマニュアルページを参照してください。
getdevicerange() ルーチンは、ユーザーが割り当て可能なデバイスのラベル範囲を取得します。デバイスのラベル範囲を指定しない場合のデフォルトの範囲では、上限が ADMIN_HIGH、下限が ADMIN_LOW になります。
list_devices コマンドを使用して、デバイスのラベル範囲を表示することができます。
list_devices(1) のマニュアルページを参照してください。
これらの関数は、ゾーン内のオブジェクトからラベル情報を取得します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。
getpathbylabel() ルーチンは、すべてのシンボリックリンクを展開して /./ および /../ への参照を解決し、余分なスラッシュ (/) 文字を削除して、resolved_path で指定されたバッファーにゾーンのパス名を格納します。bufsize 変数は、このバッファーのサイズをバイト単位で指定します。結果となるパスには、シンボリックリンクコンポーネントも、/./ や /../ も一切含まれません。この関数は、大域ゾーンからのみ呼び出すことができます。
ゾーンパス名は、機密ラベル sl からの相対位置で示されます。存在しないゾーン名に対して機密ラベルを指定するには、指定する機密ラベルがプロセス機密ラベルより優位であるか優位でないかに応じて、プロセスが priv_file_upgrade_sl または priv_file_downgrade_sl 特権を表明する必要があります。
getpathbylabel(3TSOL) のマニュアルページを参照してください。
getzoneidbylabel() ルーチンは、label というラベルを持つゾーンのゾーン ID を返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。
getzoneidbylabel(3TSOL) のマニュアルページを参照してください。
getzonelabelbyid() ルーチンは、zoneid の MAC ラベルを返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。
getzonelabelbyid(3TSOL) のマニュアルページを参照してください。
getzonelabelbyname() ルーチンは、zonename という名前のゾーンの MAC ラベルを返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。
getzonelabelbyname(3TSOL) のマニュアルページを参照してください。
getzonerootbyid() ルーチンは、zoneid のルートパス名を返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。返されるパス名は、呼び出し側のゾーンのルートパスからの相対位置で示されます。
getzonerootbyid(3TSOL) のマニュアルページを参照してください。
getzonerootbylabel() ルーチンは、label というラベルを持つゾーンのルートパス名を返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。返されるパス名は、呼び出し側のゾーンのルートパスからの相対位置で示されます。
getzonerootbylabel(3TSOL) のマニュアルページを参照してください。
getzonerootbyname() ルーチンは、zonename のルートパス名を返します。このルーチンでは、指定されたゾーンの状態が少なくとも ZONE_IS_READY である必要があります。呼び出し元プロセスのゾーンが指定されたゾーンのラベルより優位であるか、呼び出し元プロセスが大域ゾーン内に存在する必要があります。返されるパス名は、呼び出し側のゾーンのルートパスからの相対位置で示されます。
getzonerootbyname(3TSOL) のマニュアルページを参照してください。
このルーチンは、リモートホストタイプを特定します。次のルーチンの記述にはプロトタイプ宣言が含まれています。
tsol_getrhtype() ルーチンは、カーネルレベルのネットワーク情報を照会して、指定されたホスト名に関連付けられているホストタイプを特定します。hostname は、通常のホスト名、IP アドレス、またはネットワークワイルドカードアドレスにできます。返される値は、tsol_host_type_t 構造体に定義されている列挙型のいずれかになります。現時点では、これらの型は UNLABELED および SUN_CIPSO です。
tsol_getrhtype(3TSOL) のマニュアルページを参照してください。
label_to_str() および str_to_label() ルーチンは、ラベルと文字列との変換に使用します。次のルーチンの記述には、各ルーチンのプロトタイプ宣言が含まれています。
label_to_str() ルーチンは、ラベル m_label_t を文字列に変換します。このルーチンを使用すると、格付け名を表示しない文字列にラベルを変換できます。この形式は公開オブジェクトへの格納に適しています。呼び出し元プロセスは、変換されるラベルより優位であるか、プロセスに sys_trans_label 特権が含まれている必要があります。
label_to_str(3TSOL) のマニュアルページを参照してください。
label_to_str() ルーチンは、変換される文字列にメモリーを割り当てます。呼び出し側では、free() ルーチンを呼び出してこのメモリーを解放する必要があります。
free(3C) のマニュアルページを参照してください。
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 の有効な値ですが、変換のすべてのタイプが両方のラベルタイプに有効であるとは限りません。
M_LABEL は、ラベルのタイプ (機密または認可上限) に基づいたラベルの文字列です。このラベル文字列はそのラベルのレベルで格付けされるため、公開オブジェクトに格納する場合は安全ではありません。たとえば、CONFIDENTIAL などの M_LABEL 文字列は、ラベル内の単語が格付けされることが多いので、公開ディレクトリに格納するのは安全ではありません。
M_INTERNAL は、格付けされていない表現のラベル文字列です。この文字列は公開オブジェクトに格納する場合に安全です。たとえば、0x0002-04-48 などの M_INTERNAL 文字列は、LDAP データベースに格納する場合に安全です。
M_COLOR は、セキュリティー管理者がラベルに関連付けた色を表す文字です。ラベルと色の関連付けは、label_encodings ファイルの LOCAL DEFINITIONS セクションに格納されます。
PRINTER_TOP_BOTTOM は、バナーページおよびトレーラページの最上部と最下部のラベルとして使用される文字列です。
PRINTER_LABEL は、バナーページのダウングレード警告として使用される文字列です。
PRINTER_CAVEATS は、バナーページの警告のセクションで使用される文字列です。
PRINTER_CHANNEL は、バナーページの処理チャネルとして使用される文字列です。
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 つの格付けと一連のコンパートメントを指します。
blequal() ルーチンは、2 つのラベルを比較して level1 が level2 と等しいかどうかを判別します。
bldominates() ルーチンは、2 つのラベルを比較して level1 が level2 より優位であるかどうかを判別します。
blstrictdom() ルーチンは、2 つのラベルを比較して level1 が level2 よりも完全に優位であるかどうかを判別します。
これらのルーチンでは、比較が真の場合はゼロ以外の値を返し、比較が偽の場合は値 0 を返します。これらのルーチンの詳細は、blcompare(3TSOL) のマニュアルページを参照してください。これらのルーチンがマルチレベルの印刷アプリケーションでどのように使用されるかの例は、「プリンタのラベル範囲に基づいたラベルリクエストの検証」を参照してください。
ラベル関係の詳細については、「ラベルの関係」を参照してください。
blmaximum() および blminimum() ルーチンは、指定されたラベル範囲の上限と下限を調べるために使用します。
blmaximum() ルーチンは、2 つのラベルを比較して範囲の最小上限を見つけます。「最小上限」は、2 つの認可上限のうち低い方であり、特定の認可上限のシステムにアクセスできるかどうかを判別するために使用します。
たとえば、このルーチンを使用すると、ラベル付けされた 2 つのオブジェクトからの情報を組み合わせ、新たに別のオブジェクトを作成してラベル付けするときに使用するラベルを決められます。新しいオブジェクトのラベルは、ラベル付けされた元のいずれのオブジェクトよりも優位になります。
詳細は、blminmax(3TSOL) のマニュアルページを参照してください。
blminimum() ルーチンは、2 つのラベルを比較して、2 つのレベルで制限される範囲の最大下限を表しているラベルを見つけます。「最大下限」は、2 つのラベルのうちの高い方であり、特定の認可上限のシステムにアクセスできるかどうかを判別するためにも使用します。
詳細は、blminmax(3TSOL) のマニュアルページを参照してください。