Solaris Trusted Extensions 開発ガイド

第 3 章 ラベルのコーディング例

この章では、第 2 章「ラベルと認可上限」で説明するラベル API がどのように使用されるかを明らかにするコーディング例を示します。

この章の内容は次のとおりです。

プロセスラベルの取得

このコーディング例は、プログラムが実行されるゾーンの機密ラベルを取得し、出力する方法を示します。

#include <tsol/label.h>

main()
{
    m_label_t* pl;
    char *plabel = NULL;
    int retval;

    /* プロセス機密ラベルの m_label_t を割り当てる */
    pl = m_label_alloc(MAC_LABEL);
    /* プロセス機密ラベルを取得する */
    if ((retval = getplabel(pl)) != 0) {
        perror("getplabel(pl) failed");
        exit(1);
    }

    /* プロセス機密ラベルをテキストに変換し、出力する */
    if ((retval = label_to_str(pl, &plabel, M_LABEL, LONG_NAMES)) != 0) {
        perror("label_to_str(M_LABEL, LONG_NAMES) failed");
        exit(1);
    }
    printf("Process label = %s\n", plabel);

    /* 割り当てられたメモリーを解放する */
    m_label_free(pl);
    free(plabel);
    }

printf() 文は機密ラベルを出力します。機密ラベルは、プログラムが実行されるゾーンから継承されます。次は、この例のプログラムから出力されたテキストです。


Process label = ADMIN_LOW

テキスト出力は、label_encodings ファイルでの指定に依存します。

ファイルラベルの取得

ファイルの機密ラベルを取得し、そのラベルに対して操作を実行できます。

このコーディング例では、getlabel() ルーチンを使用してファイルのラベルを取得します。fgetlabel() ルーチンを同様に使用できますが、ファイル記述子に関して機能します。

#include <tsol/label.h>

main()
{
    m_label_t* docLabel;
    const char* path = "/zone/restricted/documents/designdoc.odt";
    int retval;
    char* label_string;

    /* ラベルを割り当てて、パスによって指定されるファイルラベルを取得する */
    docLabel = m_label_alloc(MAC_LABEL);
    retval = getlabel(path, docLabel);

    /* ファイルラベルを文字列に変換し、出力する */
    retval = label_to_str(docLabel, &label_string, M_LABEL, LONG_NAMES);
    printf("The file's label = %s\n", label_string);
    
    /* 割り当てられたメモリーを解放する */
    m_label_free(docLabel);
    free(label_string);
    }

このプログラムを実行した場合の出力は、次のようになります。


The file's label = CONFIDENTIAL : INTERNAL USE ONLY

ファイル機密ラベルの設定

ファイルの機密ラベルを変更すると、ファイルの新しいラベルに一致する新しいゾーンにファイルが移動します。

このコーディング例では、プロセスは CONFIDENTIAL ラベルで実行されています。プロセスを実行しているユーザーの認可上限は TOP SECRET です。TOP SECRET ラベルは CONFIDENTIAL ラベルより優位です。このプロセスは機密ラベルを TOP SECRET にアップグレードします。アップグレードを正常に実行するためには、ユーザーに「Upgrade File Label RBAC」承認が必要です。

次のプログラムは upgrade-afile によって呼び出されます。

#include <tsol/label.h>

main()
{
   int retval, error;
   m_label_t *fsenslabel;
   char *string = “TOP SECRET”;
   *string1 = “TOP SECRET”;

   /* 新しい機密ラベル値を作成する */
   if ((retval = str_to_label(string, &fsenslabel, MAC_LABEL, L_DEFAULT, &err)) != 0) {
        perror("str_to_label(MAC_LABEL, L_DEFAULT) failed");
        exit(1);
    }

   /* ファイルラベルを新しい値に設定する */
   if ((retval = setflabel(“/export/home/zelda/afile”, &fsenslabel)) != 0) {
        perror("setflabel(“/export/home/zelda/afile”) failed");
        exit(1);
    }

   m_label_free(fsenslabel);
}

このプログラムの実行結果は、プロセスに渡されたファイルのラベルを基準にしたプロセスのラベルに依存します。

このプログラムを実行する前後に getlabel コマンドを使用してファイルのラベルを確認します。次に示すように、プログラム実行前の afile のラベルは CONFIDENTIAL です。プログラム実行後の afile のラベルは TOP SECRET です。


% pwd
/export/home/zelda
% getlabel afile
afile: CONFIDENTIAL
% update-afile
% getlabel afile
afile: TOP SECRET

ファイルを再格付けしたあとに CONFIDENTIAL とラベル付けされたウィンドウから getlabel コマンドを実行すると、ファイルが表示されなくなります。TOP SECRET とラベル付けされたウィンドウから getlabel コマンドを実行すると、再格付けされたファイルが表示されます。

2 つのラベル間の関係の判別

アプリケーションが、異なる機密ラベルでデータにアクセスする場合、アクセス操作を許可する前に、コードを検査してプロセスラベルとデータラベルの関係が正しいことを確認します。アクセスされるオブジェクトの機密ラベルを検査して、システムによってアクセスが許可されるかどうかを判別します。

次のコーディング例は、2 つの機密ラベルの等位、優位、および厳密優位を検査する方法を示します。プログラムは、ファイルのラベルに対してプロセスのラベルが優位であるか、または等位であるかを検査します。

#include <stdio.h>
#include <stdlib.h>

#include <tsol/label.h>

main(int argc, char *argv[])
{
   m_label_t *plabel;
   m_label_t *flabel;

   plabel = m_label_alloc(MAC_LABEL);
   flabel = m_label_alloc(MAC_LABEL);

   if (getplabel(plabel) == -1) {
      perror("getplabel");
      exit(1);
   }
   if (getlabel(argv[1], flabel) == -1) {
      perror("getlabel");
      exit(1);
   }

   if (blequal(plabel, flabel)) {
      printf("Labels are equal\n");
   }
   if (bldominates(plabel, flabel)) {
      printf("Process label dominates file label\n");
   }
   if (blstrictdom(plabel, flabel)) {
      printf("Process label strictly dominates file label\n");
   }

   m_label_free(plabel);
   m_label_free(flabel);

   return (0);
}

このプログラムによって出力されるテキストは、次のように、プロセスに渡されたファイルのラベルを基準にしたプロセスのラベルに依存します。

ラベルのカラー名の取得

このコーディング例では、label_to_str() 関数を使用してラベルのカラー名を取得します。カラー名とラベルのマッピングは label_encodings ファイルで定義します。

#include <stdlib.h>
#include <stdio.h>

#include <tsol/label.h>

int
main()
{
   m_label_t *plabel;
   char *label = NULL;
   char *color = NULL;

   plabel = m_label_alloc(MAC_LABEL);

   if (getplabel(plabel) == -1) {
      perror("getplabel");
      exit(1);
   }

   if (label_to_str(plabel, &color, M_COLOR, 0) != 0) {
      perror("label_to_string(M_COLOR)");
      exit(1);
   }
   if (label_to_str(plabel, &label, M_LABEL, DEF_NAMES) != 0) {
      perror("label_to_str(M_LABEL)");
      exit(1);
   }

   printf("The color for the \"%s\" label is \"%s\".\n, label, color);

   m_label_free(plabel);

   return (0);
}

label_encodings ファイルで青がラベル CONFIDENTIAL にマップされている場合、プログラムの出力は次のようになります。


The color for the "CONFIDENTIAL" label is "BLUE".

プリンタバナー情報の取得

label_encodings ファイルには、プリンタ出力としてセキュリティー情報を印刷する場合に役立ついくつかの変換を定義します。ラベル変換は、ページの最上部と最下部に出力されます。処理チャネルなどのその他の変換は、バナーページに表示されます。

次のコーディング例では、label_to_str() ルーチンが、ラベルをヘッダーとフッター、警告セクション、処理チャネルなどの文字列に変換します。このルーチンは、第 4 章「印刷とラベル API」に示すように、Trusted Extensions 印刷システムによって内部的に使用されます。

#include <stdlib.h>
#include <stdio.h>

#include <tsol/label.h>

int
main()
{
   m_label_t *plabel;
   char *header = NULL;
   char *label = NULL;
   char *caveats = NULL;
   char *channels = NULL;

   plabel = m_label_alloc(MAC_LABEL);
   if (getplabel(plabel) == -1) {
      perror("getplabel");
      exit(1);
   }
   if (label_to_str(plabel, &header, PRINTER_TOP_BOTTOM, DEF_NAMES) != 0) {
      perror("label_to_str: header");
      exit(1);
   }
   if (label_to_str(plabel, &label, PRINTER_LABEL, DEF_NAMES) != 0) {
      perror("label_to_str: label");
      exit(1);
   }
   if (label_to_str(plabel, &caveats, PRINTER_CAVEATS, DEF_NAMES) != 0) {
      perror("label_to_str: caveats");
      exit(1);
   }
   if (label_to_str(plabel, &channels, PRINTER_CHANNELS, DEF_NAMES) != 0) {
      perror("label_to_str: channels");
      exit(1);
   }

   printf("\t\t\t\"%s\"\n\n", header);
   printf("\t\tUnless manually reviewed and downgraded, this output\n");
   printf("\t\tmust be protected at the following label:\n\n");
   printf("\t\t\t\"%s\"\n", label);
   printf("\n\n\n");
   printf("\t\t\"%s\"\n", caveats);
   printf("\t\t\"%s\"\n", channels);
   printf("\n\n");
   printf("\t\t\t\"%s\"\n", header);

   m_label_free(plabel);

   return (0);
}

TS SA SB のプロセスラベルの場合、テキスト出力は次のようになります。


			"TOP SECRET"

		Unless manually reviewed and downgraded, this output
		must be protected at the following label:

			"TOP SECRET A B SA SB"



		"(FULL SB NAME) (FULL SA NAME)"
		"HANDLE VIA (CH B)/(CH A) CHANNELS JOINTLY"


			"TOP SECRET"

詳細は、label_encodings(4) のマニュアルページ、『コンパートメントモードワークステーションのラベル作成: エンコード形式』、および『Solaris Trusted Extensions ラベルの管理』を参照してください。