Solaris Trusted Extensions 開発ガイド

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

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