Solaris Trusted Extensions 開発ガイド

Java バインディング

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 ファクトリおよびメソッドのプロトタイプ宣言が含まれます。

public static SensitivityLabel getFileLabel(java.io.File file)

getFileLabel static ファクトリでは、file によって指定された Java File オブジェクトのラベルを取得します。

public static SensitivityLabel getSocketPeer(java.net.Socket socket)

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();
        }
    }
}
public static void setFileLabel(java.io.File file, SensitivityLabel label)

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) のマニュアルページを参照してください。

次のコンストラクタおよびメソッドの記述には、各コンストラクタのプロトタイプ宣言が含まれています。

public static Range getDeviceRange(java.lang.String device)

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

list_devices コマンドを使用して、デバイスのラベル範囲を表示できます。list_devices(1) および getdevicerange(3TSOL) のマニュアルページを参照してください。

public static <L extends SolarisLabel,U extends SolarisLabel> Range getLabelRange(L lower, U upper)

getLabelRange static ファクトリでラベル範囲を作成します。static ファクトリでは、パラメータとして範囲の下限値および上限、すなわち認可上限 を利用します。upper が lower より優位でない場合は、例外がスローされます。

public L getLower()

getLower メソッドは範囲内の下位の部分を返します。

public U getUpper()

getUpperメソッドは範囲内の上位の部分を返します。

public static Range getUserRange(java.lang.String user)

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

ユーザーのラベル範囲のデフォルト値は label_encodings ファイルで指定します。その値は user_attr ファイルによって上書きできます。

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

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

次の記述には、メソッドのプロトタイプ宣言が含まれます。

public final java.lang.String toRootPath()

このメソッドは、指定した機密ラベルのゾーンのルートパス名を返します。

次のコーディング抜粋は、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) のマニュアルページを参照してください。

public final java.lang.String toColor()

このメソッドは SolarisLabel オブジェクトの色を返します。この値は HTML での使用に適しています。

public final java.lang.String toInternal()

このメソッドは、公開オブジェクトへの格納に安全なラベルの内部表現を返します。内部変換は、あとでその同じ値に解析することができます。これは toString メソッドの使用方法と同じです。

これらの 2 つのメソッドでは、エラーの処理方法が異なります 。toInternalメソッドでエラーが検出された場合には、java.io.IOException が返されます。一方、toString メソッドでエラーが検出された場合は、NULL が返されます。

public java.lang.String toString()

このメソッドは、ラベルの 内部 16 進数バージョンを文字列形式で返します。これは、toInternal メソッドの使用方法と同じです。

これらの 2 つのメソッドでは、エラーの処理方法が異なります 。toString メソッドでエラーが検出された場合は、NULL が返されます。ただし、 toInternal メソッドでエラーが検出された場合には、java.io.IOException が返されます。

public java.lang.String toText()

このメソッドは、SolarisLabel オブジェクトの人間が読み取れる文字列を長形式で返します。

public java.lang.String toTextLong()

このメソッドは、SolarisLabel オブジェクトの人間が読み取れる文字列を長形式で返します。

public java.lang.String toTextShort()

このメソッドは、SolarisLabel オブジェクトの人間が読み取れる文字列を長形式で返します。

次のメソッドで、マルチレベルのプリンタバナーページの作成に適したラベル変換を実行します。これらのメソッドは、label_to_str() ルーチンの一部の機能とよく似ています。label_to_str(3TSOL) および m_label(3TSOL) のマニュアルページを参照してください。

public java.lang.String toCaveats()

このメソッドは、バナーページの警告セクションの作成に適した、人間が読み取れるテキスト文字列を返します。

このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。

public java.lang.String toChannels()

このメソッドは、バナーページの処理チャネルセクションに適した、人間が読み取れるテキスト文字列を返します。

このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。

public java.lang.String toFooter()

このメソッドは、機密ラベルとしての使用に適した、人間が読み取れるテキスト文字列を返します。この機密ラベルは、末尾のページの下部に表示されます。

このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。

public java.lang.String toHeader()

このメソッドは、機密ラベルとしての使用に適した、人間が読み取れるテキスト文字列を返します。この機密ラベルは、末尾のページの上部に表示されます。

このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。

public java.lang.String toProtectAs()

このメソッドは、機密ラベルとしての使用に適した、人間が読み取れるテキスト文字列を返します。この機密ラベルは、のページの下部に表示されます。

このメソッドは SensitivityLabel オブジェクトにのみ使用可能であり、ClearanceLabel オブジェクトには使用できません。


例 9–1 Java バインディングを使用したバナーページの作成

次のサンプルコーディグは、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) のマニュアルページを参照してください。

public static ClearanceLabel getClearanceLabel(java.lang.String label)

この static ファクトリでは、指定された文字列から認可上限ラベルを作成します。次の例では、ラベル名およびラベルの内部 16 進数名に基づいて新しい認可上限ラベルを作成します。


ClearanceLabel cl = SolarisLabel.getClearanceLabel("PUBLIC");
ClearanceLabel cl = SolarisLabel.getClearanceLabel("0x0002-08-08");
public static SensitivityLabel getSensitivityLabel(java.lang.String label)

この 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) のマニュアルページを参照してください。

public boolean dominates(SolarisLabel label)

dominates メソッドで 2 つのラベルを比較して、一方のラベルがもう一方のラベルより優位であるかどうかを判別します。

次のサンプルコーディングは、どのように比較ができるかを示します。CNF : INTERNAL ラベルが比較されて、PUBLIC ラベルに対する優位性がチェックされます。


SensitivityLabel sl = SolarisLabel.getSensitivityLabel("CNF : INTERNAL");
boolean isDominant = sl.dominates(SolarisLabel.getSensitivityLabel("PUBLIC"));
public boolean equals(java.lang.Object obj)

equals ソッドで 2 つのラベルを比較して、それらが等位であるかどうかを判別します。

次のサンプルコーディングは、どのように比較ができるかを示します。


SensitivityLabel sl = SolarisLabel.getSensitivityLabel("CNF : INTERNAL");
boolean isSame = sl.equals(SolarisLabel.getSensitivityLabel("PUBLIC"));
public boolean Range inRange(SensitivityLabel label)

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();
        }
    }
}
public boolean strictlyDominates(SolarisLabel label)

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 サブクラスで定義されます。

public ClearanceLabel getMaximum(ClearanceLabel bounding)

getMaximum メソッドは、ユーザーが指定する 2 つのラベルオブジェクトよりも優位である、最下ラベルとなる新しい認可上限ラベルオブジェクトを作成します。 結果として得られるオブジェクトは、その範囲の最小上限です。getMaximum は、認可上限ラベルの内部形式でオブジェクトを返します。

public ClearanceLabel getMinimum(ClearanceLabel bounding)

getMinimum メソッドは、ユーザーが指定する 2 つのラベルのどちらに対しても優位でない、最大ラベルとなる新しい認可上限ラベルオブジェクトを作成します。結果として得られるオブジェクトは、その範囲の最大下限です。getMinimum は、認可上限ラベルの内部形式でオブジェクトを返します。

public SensitivityLabel getMaximum(SensitivityLabel bounding)

getMaximum メソッドは、ユーザーが指定する 2 つのラベルオブジェクトよりも優位である、最下ラベルとなる新しい機密ラベルオブジェクトを作成します。結果として得られるオブジェクトは、その範囲の最小上限です。getMaximum は、機密ラベルの内部形式でオブジェクトを返します。

public SensitivityLabel getMinimum(SensitivityLabel bounding)

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