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.  ラベルと認可上限

3.  ラベルのコード例

4.  印刷とラベル API

5.  プロセス間通信

6.  Trusted X Window System

7.  ラベルビルダー API

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

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

Java バインディングの概要

試験的 Java ラベルインタフェースの構造

SolarisLabel 抽象クラス

ClearanceLabel サブクラス

SensitivityLabel サブクラス

Range クラス

Java バインディング

Trusted Extensions システムの検出

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

ラベルオブジェクトに対するメモリーの割り当てと解放

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

ラベル範囲オブジェクトの取得

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

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

ラベルと文字列の変換

ラベルオブジェクトの比較

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

B.  Trusted Extensions API リファレンス

索引

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 静的ファクトリを使用して、ファイルの File オブジェクトからラベルを取得します。ファイルのラベルを指定された別のラベルに設定するには、ファイルの File オブジェクトに対して setFileLabel メソッドを使用します。

ファイルの機密ラベルを取得する以外に、getSocketPeer 静的ファクトリによって、ソケットのピアエンドポイントの機密ラベルを取得できます。

getFileLabel 静的ファクトリおよび setFileLabel メソッドは、getlabel() システムコールおよび setflabel() ルーチンにそれぞれ対応します。詳細は、「ファイルのラベルの取得と設定」と、getlabel(2) および setflabel(3TSOL) のマニュアルページを参照してください。

次の説明には、静的ファクトリおよびメソッドのプロトタイプ宣言が含まれています。

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

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

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

getSocketPeer 静的ファクトリは、指定されたソケット 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) で実行している必要があります。

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

ラベル範囲オブジェクトの取得

getLabelRange 静的ファクトリはラベル範囲オブジェクトを作成します。getUserRange および getDeviceRange 静的ファクトリは、それぞれユーザーおよびデバイスのラベル範囲オブジェクトを取得します。getUpper および getLower メソッドは、それぞれ範囲の上側および下側のラベルを取得するために使用されます。また、inRange メソッドは、指定されたラベルが範囲内にあるかどうかを判別します。inRange メソッドの詳細については、「ラベルオブジェクトの比較」を参照してください。

getUserRange および getDeviceRange 静的ファクトリは、getuserrange() および getdevicerange() ルーチンに対応します。詳細は、「ラベル範囲の取得」を参照してください。

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

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

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

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

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

getLabelRange 静的ファクトリは、ラベル範囲を作成します。静的ファクトリは、範囲の下限値と、上限値または認可上限をパラメータとして指定します。upperlower より優位でない場合、例外が送出されます。

public L getLower()

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

public U getUpper()

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

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

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

ユーザーのラベル範囲のデフォルト値は 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 抽象クラスには、ラベルと文字列を変換するためのメソッドが含まれており、このメソッドはそのサブクラスによって継承されます。

これらのメソッドは、ラベルの内部表現 (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

toTexttoInternaltoColor などのメソッドでは、文字列からラベルへの変換は行いません。文字列を機密ラベルまたは認可上限ラベルに変換するには、getSensitivityLabel または getClearanceLabel 静的ファクトリをそれぞれ呼び出す必要があります。次の静的ファクトリは、str_to_label() ルーチンを模倣したものです。str_to_label(3TSOL) および m_label(3TSOL) のマニュアルページを参照してください。

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

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

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

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

SensitivityLabel sl = SolarisLabel.getSensitivityLabel("PUBLIC");
SensitivityLabel sl = SolarisLabel.getSensitivityLabel("0x0002-08-08");

ラベルオブジェクトの比較

次の equalsdominates、および strictlyDominates メソッドは、ラベルを比較するために使用され、blequal()bldominate()、および blstrictdom() ルーチンに対応します。inRange メソッドは、ラベルが指定されたラベル範囲内にあるかどうかを判別するために使用され、blinrange() ルーチンに対応します。これらのメソッドで、ラベルは機密ラベルまたは認可上限ラベルの格付けおよびコンパートメントのセットを表します。詳細は、「ラベルの比較」および blcompare(3TSOL) のマニュアルページを参照してください。

public boolean dominates(SolarisLabel label)

dominates メソッドは 2 つのラベルを比較して、1 つのラベルが別のラベルよりも優位かどうかを判断します。

次のサンプルコードは、比較を行う方法を示しています。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)

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 つのラベルを比較して、1 つのラベルが別のラベルよりも完全に優位であるかどうかを判断します。あるラベルが別のラベルよりも完全に優位であるとき、そのラベルは別のラベルよりも優位ですが、別のラベルと等しくはありません。

次のサンプルコードは、比較を行う方法を示しています。CNF : INTERNAL ラベルが PUBLIC ラベルより完全に優位であることを確認するために比較されます。

SensitivityLabel sl = SolarisLabel.getSensitivityLabel("CNF : INTERNAL");
boolean isStrictlyDominant =
    sl.strictlyDominates(SolarisLabel.getSensitivityLabel("PUBLIC"));

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

getMaximum および getMinimum メソッドは、指定されたラベル範囲の最小の上限および最大の下限を判別するために、それぞれ使用されます。これらのメソッドは、blmaximum() および blminimum() ルーチンの機能を反映したものです。詳細は、「ラベルの比較」および blminmax(3TSOL) のマニュアルページを参照してください。

たとえば、2 つの異なるラベル付きオブジェクトからの情報を組み合わせた新しいラベル付きオブジェクトを作成するとき、getMaximum メソッドを使用して、使用するラベルを判別します。新しいオブジェクトのラベルは、ラベル付けされた元のいずれのオブジェクトよりも優位になります。各メソッドは、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