Trusted Extensions ラベル API の Java 実装は、ラベル対応アプリケーションの作成に使用することを目的とします。したがって、Trusted Extensions で提供されるラベル API のすべてが Java 実装の一部に含まれるわけではありません。
この章で提示されている Java クラスおよびメソッドは、「ラベル API」 に示されている次の一般的なラベル機能によく似ています。
Trusted Extensions システムの検出
プロセス機密ラベルへのアクセス
ラベルオブジェクトのためのメモリーの割り当てと解放
ファイルのラベルの取得と設定
ラベル範囲オブジェクトの取得
ゾーンのラベルへのアクセス
遠隔ホストタイプの取得
ラベルと文字列との変換
ラベルオブジェクトの比較
これらの Java バインディングには、システムにラベルが付けられているかどうかを判別するメソッドは含まれません。むしろ、Trusted Extensions が有効でない場合にはライブラリでのロードが失敗します。
これらの Java バインディングには、プロセスのラベルを取得するメソッドは含まれません。Trusted Extensions では、ラベル付けされたゾーンで実行されるプロセスに、そのゾーンと同じラベルがあります。
これらの Java バインディングでは、Java の「ガベージコレクション」機能を利用します。これによって、「ファイルのラベルの取得と設定」で説明されているラベル API に対して行うように、ラベルオブジェクトによって使用されたメモリーを明示的に解放する必要がありません。
これらの Java バインディングでは、Java File オブジェクトを使用して、ファイルラベルの取得および設定を行います。getFileLabel static ファクトリを使用して、ファイルの File オブジェクトからラベルを取得します。ファイルラベルを別の指定ラベルに設定するには、 setFileLabel メソッドをファイルの File オブジェクトに対して使用します。
ファイルの機密ラベルの取得に加えて、getSocketPeer static ファクトリは、ソケットのピア終端用に機密ラベルの取得を可能にします。
getFileLabel static ファクトリおよび setFileLabelメソッドは、それぞれ getlabel() システムコールと setflabel() ルーチンにそれぞれ対応します。詳細は、「ファイルのラベルの取得と設定」および getlabel(2) と setflabel(3TSOL) のマニュアルページを参照してください。
次の記述には、static ファクトリおよびメソッドのプロトタイプ宣言が含まれます。
getFileLabel static ファクトリでは、file によって指定された Java File オブジェクトのラベルを取得します。
getSocketPeer static ファクトリは、指定されたソケット socket から機密ラベルオブジェクト、socket を取得します。
次のコードフラグメントは、ソケット s の機密ラベルオブジェクトを取得します。
SensitivityLabel sl = SolarisLabel.getSocketPeer(s); |
次のコーディグ例は、サーバーソケットをポート 9090 上に作成し、使用可能な接続のピア終端の機密ラベルを取得する方法を示します。このコーディング例では、取得されたソケットピアラベルに関して、内部形式、人間が読み取れる形式、色、およびルートパスも出力されます。
import java.io.*;
import java.net.*;
import solarismac.*;
public class ServerSocketTest
{
public static void main (String args[]) {
System.out.println("ServerSocketTest Start");
CreateListner();
System.out.println("ServerSocketTest End");
}
/*
* Listen for connections on port then print the peer connection label.
* You can use telnet host 9090 to create a client connection.
*/
private static void CreateListner() {
int port = 9090;
ServerSocket acceptSocket;
Socket s;
try {
System.out.println("Creating ServerSocket on port " + port);
acceptSocket = new ServerSocket(port);
System.out.println("ServerSocket created, waiting for connection");
s = acceptSocket.accept();
/*
* Get the Sensitivity Label for the peer end of the socket.
*/
SensitivityLabel socksl = SolarisLabel.getSocketPeer(s);
System.out.println("Client connected...");
System.out.println(" toInternal: " + socksl.toInternal());
System.out.println(" toText: " + socksl.toText());
System.out.println(" toString: " + socksl.toString());
System.out.println(" toColor: " + socksl.toColor());
System.out.println(" toRootPath: " + socksl.toRootPath());
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
setFileLabel メソッドで、指定したファイルの機密レベルを指定したラベルに変更します。ファイルの機密ラベルが変わると、新しいラベルに対応するゾーンにファイルが移動します。ファイルは、ほかのゾーンのルートに相対的な新しいパス名に移動します。
たとえば、setFileLabel メソッドを使用して、ファイル /zone/internal/documents/designdoc.odt のラベルを INTERNAL から RESTRICTED に変更すると、このファイルの新しいパスは /zone/restricted/documents/designdoc.odt になります。移動先のディレクトリが存在しない場合、ファイルは移動しません。
次のコードフラグメントは、ファイルのラベルをどのような方法で変更すべきかを示しています 。
SolarisLabel.setFileLabel(new File("/zone/internal/documents/designdoc.odt"),
SolarisLabel.getSensitivityLabel("RESTRICTED"));
|
ファイルの機密ラベルを変更すると、元のファイルは削除されます。移動元と移動先のファイルシステムが同じ基礎となるファイルシステムからループバックマウントされる場合は例外です。この場合、ファイルの名前が変更されます。
Java 仮想マシンは、ファイルのラベル変更に適した特権 (file_upgrade_sl または file_downgrade_sl) で実行されている必要があります。
特権の設定に関する詳細は、『Solaris セキュリティーサービス開発ガイド』の第 2 章「特権付きアプリケーションの開発」を参照してください。 setflabel(3TSOL) のマニュアルページも参照してください。
getLabelRange static ファクトリで、ラベル範囲オブジェクトを作成します。getUserRange および getDeviceRange static ファクトリでは、ユーザーおよびデバイスのラベル範囲オブジェクトをそれぞれ取得します。getUpper および getLower メソッドを使用して、範囲の上位ラベルおよび下位ラベルをそれぞれ取得します。 さらに、inRangeメソッドを使用して、指定したラベルが範囲内にあるかどうかを判別します。inRange の詳細は、「ラベルオブジェクトの比較」 を参照してください。
getUserRange および getDeviceRange static ファクトリは、 getuserrange() および getdevicerange() ルーチンに対応します。詳細は、「ラベル範囲の取得」および getdevicerange(3TSOL) のマニュアルページを参照してください。
次のコンストラクタおよびメソッドの記述には、各コンストラクタのプロトタイプ宣言が含まれています。
getDeviceRange static ファクトリでは、ユーザーが割り当て可能なデバイスのラベル範囲を取得します。デバイスにラベル範囲を指定しない場合のデフォルト範囲は、上限が ADMIN_HIGH、下限が ADMIN_LOW です。
list_devices コマンドを使用して、デバイスのラベル範囲を表示できます。list_devices(1) および getdevicerange(3TSOL) のマニュアルページを参照してください。
getLabelRange static ファクトリでラベル範囲を作成します。static ファクトリでは、パラメータとして範囲の下限値および上限、すなわち認可上限 を利用します。upper が lower より優位でない場合は、例外がスローされます。
getLower メソッドは範囲内の下位の部分を返します。
getUpperメソッドは範囲内の上位の部分を返します。
getUserRange static ファクトリは、指定したユーザーのラベル範囲を取得します。ユーザーがマルチレベルデスクトップにログインするときに、範囲の下限がラベルとして使用されます。範囲の上限、すなわち認可上限は、ラベル付けされたワークスペースにユーザーが割り当てることができる使用可能なラベルに対する上限として使用されます。
ユーザーのラベル範囲のデフォルト値は label_encodings ファイルで指定します。その値は user_attr ファイルによって上書きできます。
詳細は、getuserrange(3TSOL) のマニュアルページを参照してください。
次の記述には、メソッドのプロトタイプ宣言が含まれます。
このメソッドは、指定した機密ラベルのゾーンのルートパス名を返します。
次のコーディング抜粋は、PUBLIC 機密ラベルのルートパスを取得する方法を示します。
SensitivityLabel sl = SolarisLabel.getSensitivityLabel("PUBLIC");
System.out.println("toRootPath: " + sl.toRootPath();
|
無効なラベルが指定されるか、または指定したラベルにゾーンが設定されていない場合、このメソッドは java.io.IOException をスローします。
このメソッドは getzonerootbylabel() ルーチンによく似ています。getzonerootbylabel(3TSOL) のマニュアルページを参照してください。「ゾーンのラベルへのアクセス」も参照してください。
Trusted Extensions ラベル API の Java 実装には、遠隔ホストタイプ取得用のインタフェースは含まれません。
SolarisLabel abstract クラスには、ラベルと文字列間の変換に使用するメソッドが含まれており、そのメソッドのサブクラスによって継承されます。
これらのメソッドで、ラベルの内部表現 (m_label_t) を String オブジェクトに変換します。
toInternalメソッドを使用して、格付け名を表示しない文字列にラベルを変換できます。この形式は、共通オブジェクトでのラベルの格納に適します。
Java 仮想マシンの実行は、変換されるラベルよりも優位であることが必要です。つまり、sys_trans_label 特権を持つ必要があります。label_to_str(3TSOL) のマニュアルページを参照してください。
一部のラベル値は、label_encodings ファイル内のデータに基づきます。
次のメソッドは label_to_str() ルーチンによく似ています。label_to_str(3TSOL) のマニュアルページを参照してください。
このメソッドは、公開オブジェクトへの格納に安全なラベルの内部表現を返します。内部変換は、あとでその同じ値に解析することができます。これは toString メソッドの使用方法と同じです。
これらの 2 つのメソッドでは、エラーの処理方法が異なります 。toInternalメソッドでエラーが検出された場合には、java.io.IOException が返されます。一方、toString メソッドでエラーが検出された場合は、NULL が返されます。
このメソッドは、ラベルの 内部 16 進数バージョンを文字列形式で返します。これは、toInternal メソッドの使用方法と同じです。
これらの 2 つのメソッドでは、エラーの処理方法が異なります 。toString メソッドでエラーが検出された場合は、NULL が返されます。ただし、 toInternal メソッドでエラーが検出された場合には、java.io.IOException が返されます。
次のメソッドで、マルチレベルのプリンタバナーページの作成に適したラベル変換を実行します。これらのメソッドは、label_to_str() ルーチンの一部の機能とよく似ています。label_to_str(3TSOL) および m_label(3TSOL) のマニュアルページを参照してください。
このメソッドは、バナーページの警告セクションの作成に適した、人間が読み取れるテキスト文字列を返します。
このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。
このメソッドは、バナーページの処理チャネルセクションに適した、人間が読み取れるテキスト文字列を返します。
このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。
このメソッドは、機密ラベルとしての使用に適した、人間が読み取れるテキスト文字列を返します。この機密ラベルは、末尾のページの下部に表示されます。
このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。
このメソッドは、機密ラベルとしての使用に適した、人間が読み取れるテキスト文字列を返します。この機密ラベルは、末尾のページの上部に表示されます。
このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。
このメソッドは、機密ラベルとしての使用に適した、人間が読み取れるテキスト文字列を返します。この機密ラベルは、のページの下部に表示されます。
このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。
次のサンプルコーディグは、Java バインディングを使用して「プリンタバナー情報の取得」で説明されているものと同様のバナーページを作成する方法を示します。
import solarismac.*;
import java.io.*;
/*
* Banner page example
*/
public class PrintTest1
{
public static void main (String args[]) {
try {
// Pick a valid label using the label_encodings.example
SensitivityLabel sl = SolarisLabel.getSensitivityLabel("TOP SECRET A B SA");
// "Protect as classification"
System.out.println(sl.toHeader());
System.out.println();
// "Protect as classification plus compartments"
System.out.println("This output must be protected as:");
System.out.println(sl.toProtectAs());
System.out.println("unless manually reviewed and downgraded.");
System.out.println();
// Handling instructions specified in PRINTER BANNERS
System.out.println(sl.toCaveats());
System.out.println();
// Handling instructions specified in CHANNELS
System.out.println(sl.toChannels());
System.out.println();
// "Protect as classification"
System.out.println(sl.toFooter());
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
TOP SECRET A B SA のプロセスラベルの場合、テキスト出力は次のようになります。
TOP SECRET This output must be protected as: TOP SECRET A B SA unless manually reviewed and downgraded. (FULL SA NAME) HANDLE VIA (CH B)/(CH A) CHANNELS JOINTLY TOP SECRET |
toText、toInternal および toColor などのメソッドでは、文字列からラベルに変換しません。 文字列を機密ラベルまたは認可上限ラベルに変換するには、 getSensitivityLabel または getClearanceLabel static ファクトリを個別に呼び出す必要があります。 次の static ファクトリは str_to_label() ルーチンによく似ています。str_to_label(3TSOL) および m_label(3TSOL) のマニュアルページを参照してください。
この static ファクトリでは、指定された文字列から認可上限ラベルを作成します。次の例では、ラベル名およびラベルの内部 16 進数名に基づいて新しい認可上限ラベルを作成します。
ClearanceLabel cl = SolarisLabel.getClearanceLabel("PUBLIC");
ClearanceLabel cl = SolarisLabel.getClearanceLabel("0x0002-08-08");
|
この static ファクトリでは、指定した文字列から機密ラベルを作成します。次の例では、ラベル名およびラベルの内部 16 進数名に基づいて新しい機密ラベルを作成します。
SensitivityLabel sl = SolarisLabel.getSensitivityLabel("PUBLIC");
SensitivityLabel sl = SolarisLabel.getSensitivityLabel("0x0002-08-08");
|
次の equals、dominates、および strictlyDominates メソッドを使用してラベルを比較します。これらのメソッドは blequal()、bldominate()、および blstrictdom() ルーチンに対応します。inRange メソッドを使用して、指定したラベル範囲内にラベルがあるかどうかを判別します。このメソッドは blinrange() ルーチンに対応します。これらのメソッドで label が指すのは、格付けおよび機密ラベルまたは認可上限ラベルのコンパートメントのセットです。詳細は、「ラベルの比較」および blcompare(3TSOL) のマニュアルページを参照してください。
dominates メソッドで 2 つのラベルを比較して、一方のラベルがもう一方のラベルより優位であるかどうかを判別します。
次のサンプルコーディングは、どのように比較ができるかを示します。CNF : INTERNAL ラベルが比較されて、PUBLIC ラベルに対する優位性がチェックされます。
SensitivityLabel sl = SolarisLabel.getSensitivityLabel("CNF : INTERNAL");
boolean isDominant = sl.dominates(SolarisLabel.getSensitivityLabel("PUBLIC"));
|
equals ソッドで 2 つのラベルを比較して、それらが等位であるかどうかを判別します。
次のサンプルコーディングは、どのように比較ができるかを示します。
SensitivityLabel sl = SolarisLabel.getSensitivityLabel("CNF : INTERNAL");
boolean isSame = sl.equals(SolarisLabel.getSensitivityLabel("PUBLIC"));
|
The inRange メソッドで、指定したラベルが範囲内にあるかどうかを判別します。このメソッドは Range クラスに属します。
次のコードフラグメントは、ファイルがユーザーの認可上限範囲内であるかどうかを検証できる方法を示します。
import solarismac.*;
import java.io.*;
public class Example1
{
public static void main (String args[]) {
try {
Range range;
range = Range.getUserRange("jweeks");
SensitivityLabel fsl =
SolarisLabel.getFileLabel(new File("/etc/passwd"));
boolean isInRange;
isInRange = Range.inRange(fsl);
if (isInRange)
System.out.println("File is within user's range");
else
System.out.println("File is not within user's range");
}
catch (Exception e) {
e.PrintStackTrace();
}
}
}
|
strictlyDominates メソッドで 2 つのラベルを比較して、一方のラベルがもう一方のラベルよりも厳密に優位であるかどうかを判別します。一方のラベルがもう一方のラベルよりも厳密に優位である場合は、もう一方のラベルよりも優先されますが、等位ではありません。
次のサンプルコーディングは、どのように比較ができるかを示します。CNF : INTERNAL ラベルが比較されて、PUBLIC ラベルに対する完全な優位性がチェックされます。
SensitivityLabel sl = SolarisLabel.getSensitivityLabel("CNF : INTERNAL");
boolean isStrictlyDominant =
sl.strictlyDominates(SolarisLabel.getSensitivityLabel("PUBLIC"));
|
ラベル関係の詳細は、「ラベル関係」を参照してください。
getMaximum および getMinimum メソッドを使用して、指定した範囲の最小上限および最大下限をそれぞれ判別します。これらのメソッドで、blmaximum() および blminimum() ルーチンの機能をミラー化します。詳細は、「ラベルの比較」 および blminmax(3TSOL) のマニュアルページを参照してください。
たとえば、この getMaximum を使用して、ラベル付けされた 2 つのオブジェクトの情報を組み合わせ、新たに別のオブジェクトを作成してラベル付けするときに使用するラベルを決定します。新しいオブジェクトのラベルは、ラベル付けされた元の 2 つのオブジェクトよりも優位となります。各メソッド は、ClearanceLabel および SensitivityLabel サブクラスで定義されます。
getMaximum メソッドは、ユーザーが指定する 2 つのラベルオブジェクトよりも優位である、最下ラベルとなる新しい認可上限ラベルオブジェクトを作成します。 結果として得られるオブジェクトは、その範囲の最小上限です。getMaximum は、認可上限ラベルの内部形式でオブジェクトを返します。
getMinimum メソッドは、ユーザーが指定する 2 つのラベルのどちらに対しても優位でない、最大ラベルとなる新しい認可上限ラベルオブジェクトを作成します。結果として得られるオブジェクトは、その範囲の最大下限です。getMinimum は、認可上限ラベルの内部形式でオブジェクトを返します。
getMaximum メソッドは、ユーザーが指定する 2 つのラベルオブジェクトよりも優位である、最下ラベルとなる新しい機密ラベルオブジェクトを作成します。結果として得られるオブジェクトは、その範囲の最小上限です。getMaximum は、機密ラベルの内部形式でオブジェクトを返します。
getMinimum メソッドは、ユーザーが指定する 2 つのラベルのどちらに対しても優位でない、最上位ラベルとなる新しい機密ラベルオブジェクトを作成します。結果として得られるオブジェクトは、その範囲の最大下限です。getMinimum は、機密ラベルの内部形式でオブジェクトを返します。
次の表は、 getMaximum および getMinimum メソッドからのラベルの入力および出力を示します。
表 9–1 getMinimum および getMaximum メソッド|
入力ラベル |
getMinimum 出力 |
getMaximum 出力 |
|---|---|---|
|
SECRET A B TOP SECRET A B SA SB CC |
SECRET A B |
TOP SECRET A B SA SB CC |
|
SECRET A B TOP SECRET A SA CC |
SECRET A |
TOP SECRET A B SA CC |
|
SECRET A B TOP SECRET |
SECRET |
TOP SECRET A B |
|
SECRET A TOP SECRET B |
SECRET |
TOP SECRET A B |