Trusted Solaris 開発ガイド

第 2 章 プログラミングインタフェースの概要

この章では、短いコード例を使って Trusted Solaris 7 のプログラミングインタフェースの一部を紹介します。最初の節では、システムセキュリティ構成の照会方法と、ファイルシステムとプロセスのセキュリティ属性情報の照会と設定の方法を示します。2 番目の節では、Trusted Solaris 7 のセキュリティ機構の概要を示します。

システムセキュリティ構成と属性情報

システムセキュリティ構成変数は、システム全体の構成を示します。アプリケーションの中には、システムのセキュリティ構成状態に影響を受ける可能性がある動作を実行する前に、システム変数を照会するものがあります。たとえば、情報ラベルの浮上がシステムに設定されていない場合、プロセスには情報ラベルの浮上を停止するための特権は必要ではありません。

ファイルシステムのセキュリティ属性とフラグは、指定されたローカルファイルシステムとマウントされたファイルシステムのセキュリティ関連情報を提供します。アプリケーションは、ファイルシステムのセキュリティ属性とフラグの状態を知ることが必要な場合があります。たとえば、ディレクトリを操作する前にファイルシステムのデフォルトのアクセス制御リスト (ACL) を照会したり、ディレクトリに新しいファイルを作成する前に、そのディレクトリがマルチレベルディレクトリであるかを確認することができます。

プロセスのセキュリティ属性フラグは、呼び出し元プロセスについての情報を示します。たとえば、プロセスが管理役割から開始されたか (トラステッドパスフラグが設定されている)、それとも通常のユーザーによって開始されたか (トラステッドパスフラグは設定されていない) を知るため、場合によってはアプリケーションはプロセスのセキュリティ属性フラグの状態を知る必要があります。

プログラミングインタフェース

この節では、システムセキュリティ構成とセキュリティ属性情報をチェックするプログラミングインタフェースとコード例を示します。これらの呼び出しにより処理されるデータの説明は、該当する章に示されています。たとえば、第 5 章「ラベル」ではラベルについて、第 3 章「特権」では特権について説明しています。

パス名を使用してファイルにアクセスするインタフェースと、ファイル記述子を使用してファイルにアクセスする別のインタフェースが存在する場合、構文はほとんど変わらないため、例ではパス名だけを示します。

この節で示す例はすべて、-ltsol ライブラリを使用してコンパイルします。

システムセキュリティ構成

このシステムコールは、システムセキュリティ構成の情報を取得します。詳細は、secconf(2) のマニュアルページを参照してください。

long			secconf(								int name);

ファイルシステムのセキュリティ属性

これらのシステムコールは、パス名またはファイル記述子を使用してファイルシステム属性情報を取得します。詳細は、getfsattr(2) のマニュアルページを参照してください。

int 			getfsattr(								char *path, u_long type,
 											void *buf_P, int len);
 int			fgetfsattr(								int fd, u_long type, void *buf_P);

ファイルシステムのセキュリティ属性フラグ

これらのシステムコールは、パス名またはファイル記述子を使用してファイルシステムのセキュリティ属性フラグの情報を取得します。詳細は、getfattrflag(2) のマニュアルページを参照してください。

int			fgetfattrflag(								const char *path, secflgs_t *flags);
 int			setfattrflag(								const char *path, secflgs_t which,
 											secflgs_t flags);
 int			fsetfattrflag(								int fildes, secflgs_t *flags);
 int			getfattrflag(								int fildes, secflgs_t *flags);
 int			mldgetfattrflag(								const char *path, secflgs_t *flags)
 int			mldsetfattrflag(								const char * path, secflgs_t which,
 											secflgs_t flags))

プロセスのセキュリティ属性フラグ

これらのシステムコールは、プロセスのセキュリティ属性フラグの取得と設定を行います。getpattr(2) のマニュアルページを参照してください。

int			getpattr(								pattr_type_t type, pattr_flag_t *value);
 int			setpattr(								pattr_type_t type, pattr_flag_t value);

システムセキュリティ構成の照会

システム変数は、システムがどのように構成されているかを示します。システム変数はシステムの起動時に初期化され、system(4) にエントリがない場合にはデフォルト値が使用されます。アプリケーションは、secconf(2) システムコールを使用してシステム変数を照会できます。次に、/etc/system 内で定義される変数を、デフォルト値とともに示します。

_TSOL_ENABLE_IL - アプリケーションに情報ラベルの設定または表示を許容します。デフォルトはオンです。

_TSOL_ENABLE_IL_FLOATING - 情報ラベルの浮上を実行します。デフォルトはオン (ラベルを浮上する) です。オフの場合には情報ラベルは浮上しませんが、プログラム中でコードを記述して浮上するように設定することもできます。この変数を有効にするには、_TSOL_ENABLE_IL をオンにする必要があります。

_TSOL_FLOAT_SYSV_MSG_IL - System V IPC のメッセージ待ち行列に対する情報ラベルの浮上を有効にします。デフォルトはオフです。待ち行列内の各メッセージの情報ラベルには、待ち行列にメッセージを入力するプロセスの情報ラベル、または msgsndl(2) で設定される情報ラベルが入ります。読み取りプロセスの情報ラベルは、読み取られるメッセージの情報ラベルに応じて浮上します。詳細は、第 12 章「System V のプロセス間通信」を参照してください。この変数を有効にするには、_TSOL_ENABLE_IL_TSOL_ENABLE_IL_FLOATING をオンにする必要があります。

_TSOL_FLOAT_SYSV_SEM_IL - System V IPC のセマフォセットに対する情報ラベルの浮上を有効にします。デフォルトはオフです。読み取りプロセスの情報ラベルは、セマフォセットの情報ラベルに応じて浮上します。セマフォセットの情報ラベルは、書き込みプロセスの情報ラベルに応じて浮上します。詳細は、第 12 章「System V のプロセス間通信」を参照してください。この変数を有効にするには、_TSOL_ENABLE_IL_TSOL_ENABLE_FLOATING をオンにする必要があります。

_TSOL_FLOAT_SYSV_SHM_IL - System V IPC の共有メモリー領域に対する情報ラベルの浮上を有効にします。デフォルトはオフです。共有メモリー領域の情報ラベルは、領域に連結した書き込みアクセスを持つすべてのプロセスの情報ラベルに応じて常に浮上します。読み取りアクセスに連結したプロセスの情報ラベルは、共有メモリー領域の情報ラベルに応じて浮上します。詳細は、第 12 章「System V のプロセス間通信」を参照してください。この変数を有効にするには、_TSOL_ENABLE_IL_TSOL_ENABLE_IL_FLOATING をオンにする必要があります。

_TSOL_RESET_IL_ON_EXEC - exec(1) への呼び出しの前に、情報ラベルを ADMIN_LOW にリセットします。デフォルトはオンです。この変数を有効にするには、_TSOL_ENABLE_IL をオンにする必要があります。

_TSOL_HIDE_UPGRADED_NAMES - ディレクトリに、特権プロセスによって昇格された機密ラベルを持つファイルまたはサブディレクトリが含まれる場合、この変数は、昇格されたファイルまたはサブディレクトリが getdents(2) のようなシステムコール要求によって表示または取得できるかどうかを決定します。デフォルトはオフです。オフの場合、ディレクトリを表示すると、昇格されたファイルとサブディレクトリの名前が表示されます。オンの場合、昇格されたファイルまたはサブディレクトリの名前は表示されません。

_TSOL_PRIVS_DEBUG - 特権デバッグを有効にします。デフォルトはオフです。特権デバッグを有効にする方法と使用方法の詳細は、『Trusted Solaris 管理の手順』またはこのマニュアルの 「特権デバッグ」を参照してください。

_TSOL_STR_LINKB - streams ポリシースイッチを設定します。デフォルトはオンです。オンの場合、異なるセキュリティ属性を持つ別の streams メッセージとリンクするときに、linkb(9F) システムコールは streams メッセージを出力します。しかし、情報ラベルだけが異なる場合は、リンク先の streams メッセージの情報ラベルだけが出力されます。

このコードは、システム変数を照会し、それらの現在の値を表示します。

#include <tsol/secconf.h>

 main()
 {

 long			retval;

 	retval = secconf(_TSOL_ENABLE_IL);
 	printf("Enable IL = %d¥n", retval);

 	retval = secconf(_TSOL_ENABLE_IL_FLOATING);
 	printf("IL Floating = %d¥n", retval);

 	retval = secconf(_TSOL_FLOAT_SYSV_SEM_IL);
 	printf("Semaphore set IL Floating = %d¥n", retval);

 	retval = secconf(_TSOL_FLOAT_SYSV_MSG_IL);
 	printf("Message queue IL Floating = %d¥n", retval);

 	retval = secconf(_TSOL_FLOAT_SYSV_SHM_IL);
 	printf("Shared memory IL Floating = %d¥n", retval);

 	retval = secconf(_TSOL_HIDE_UPGRADED_NAMES);
 	printf("Hide Names = %d¥n", retval);

 	retval = secconf(_TSOL_PRIVS_DEBUG);
 	printf("Priv Debug = %d¥n", retval);

 	retval = secconf(_TSOL_RESET_IL_ON_EXEC);
 	printf("Reset IL = %d¥n", retval);

 	retval = secconf(_TSOL_STR_LINKB);
 	printf("Streams policy switch = %d¥n", retval);
 }

printf 文によって、次のように出力されます。retval (戻り値) が 1 の場合、変数はオンです。0 の場合はオフです。-1 の場合は、エラーが発生しています。errno (エラー番号) は、入力された変数が無効な場合にだけ設定されます。

Enable IL = 1

IL Floating = 1

Semaphore set IL floating = 0

Message queue IL floating = 0

Shared memory IL floating = 0

Hide Names = 0

Priv Debug = 0

Reset IL = 1

Streams policy switch = 1

ファイルシステムのセキュリティ属性の照会

ファイルシステムのセキュリティ属性は、システム管理者が一部のセキュリティ属性を割り当てなかった場合、あるいは作成プロセスで属性を取得していない場合、ローカルまたはマウントされたファイルシステムオブジェクトに対し、欠落しているセキュリティ属性を充てんします。ファイルシステムのセキュリティ属性は、vfstab(4) ファイルと vfstab_adjunct(4) ファイル、あるいはファイルまたはディレクトリの i ノードから取得できます。

vfstab_adjunct ファイルからの属性の取得

vfstab_adjunct(4) ファイルには、遠隔マウントポイントとその関連セキュリティ情報が含まれます。システム管理者は、遠隔ワークステーションからローカルワークステーションにマウントされたファイルシステムが正しいセキュリティ属性を持つように、このファイルの設定と管理を行います。

次の例は、vfstab_adjunct(4) から行を取得して表示します。getvfsaent(3) ルーチンは、初めにファイルの先頭の行を読み取り、それに続く呼び出しごとに次の行を 1 つずつ読み取ります。getvfsaent(3) ルーチンは、入力ファイルに指定されたマウントポイントの行を読み取ります。


注 -

このコード例に示すように、stdio.h を必ずインクルードしてください。


#include <stdio.h>
 #include <tsol/vfstab_adjunct.h>

 main()
 {
 	struct 					vfsaent *entry;
 	char 					*vfsfile = "/etc/security/tsol/vfstab_adjunct";
 	char 					*file = "/shark/doc";
 	int					retval;
 	FILE					*fp;

 	fp = fopen(vfsfile, "r");
 	if (fp == NULL) {
 			printf("Can't open %s¥n", vfsfile);
 			exit(1);
 	}

/* ファイルを 1 行ずつ読み取る */
 	retval = getvfsaent(fp, &entry);
 	if (retval == 0) {
 			printf("Mount Point is %s ¥n Security Info is %s¥n",
 			entry->vfsa_fsname, entry->vfsa_attr);
 			free(entry);
 	}
 	else
 			printf("No entries!¥n");

 	fseek(fp, 0, 0);

/* 指定のマウントポイントの行を読み取る */
 	retval = getvfsafile(fp, &entry, file);
 	if (retval == 0) {
 			printf("Mount Point is %s ¥nSecurity Info is %s¥n",
 			entry->vfsa_fsname, entry->vfsa_attr);
 			free(entry);
 	}
 	else
 			printf("Mount point not found.¥n");
 	fclose(fp);
 }

printf 文によって、次のように出力されます。この vfstab_adjunct ファイルには、/opt/SUNWspro マウントポイントに対するエントリが 1 つだけあります。

Mount Point is /opt/SUNWspro

Security Info is slabel=[C]:allowed all

Mount Point not found

i ノードからの属性の取得

次のコードは、file (ファイル) の CMW ラベル (FSA_LABEL) を取得し、それを buffer (バッファー) に返します。

#include <tsol/fsattr.h>
 #include <tsol/label.h>

 main()
 {
 	char 		*file = "/export";
 	char 		buffer [3*1024], *string = (char *)0;
 	int 		length, retval;

 	length = sizeof(buffer);
 	retval = getfsattr(file, FSA_LABEL, buffer, length);
 	retval = bcltos((bclabel_t *)buffer, &string, 0, VIEW_INTERNAL);
 	printf("/export CMW label = %s ¥n", buffer);
 }

printf 文によって、次のように出力されます。

/export CMW label = ADMIN_LOW [ADMIN_LOW]

明示的定数の値

明示的定数の値は、次のいずれかになります。

FSA_ACLCNT - ファイルシステムアクセスのアクセス制御リスト (ACL) 数

FSA_ACL - ファイルシステムアクセスの ACL

FSA_DFACLCNT - ファイルシステムのデフォルト ACL 数

FSA_DFACL - ファイルシステムのデフォルト ACL

FSA_APRIV - ファイルシステムの許容特権セット

FSA_FPRIV - ファイルシステムの強制特権セット

FSA_LABEL - ファイルシステムの CMW ラベル

FSA_AFLAGS - ファイルシステムの属性フラグ。「ファイルシステムのセキュリティ属性フラグの取得と設定」を参照してください。

FSA_LBLRNG - ファイルシステムのラベル範囲

FSA_MLDPFX - ファイルシステムのマルチレベルディレクトリの接頭辞文字列

FSA_APSACNT - プロセス監査の事前選択マスク内のクラスの数

FSA_APSA - プロセス監査の事前選択マスク内のクラス。プロセスは、この情報を取得する場合、有効特権セット内で file_audit 特権を必要とする。詳細は、「特権と承認」を参照してください。

明示的定数の内容

CMW ラベル、ファイルシステムのラベル範囲、ファイル特権、およびマルチレベルディレクトリにアクセスするプログラミングインタフェースの概要は、「Trusted Solaris 7 のセキュリティ機構」で述べています。詳細は、該当するそれぞれの章を参照してください。

ファイルシステムのセキュリティ属性フラグの取得と設定

この例は、通常のディレクトリに公開属性フラグを設定し、マルチレベルディレクトリの MLD フラグを取得します。この例を実行するには、プロセスに file_owner 特権と file_audit 特権が必要です。setfpriv(1) を使用してこれらの特権を次のように設定してください。setfpriv(1) は、プロファイルシェルから実行されるとき、file_setpriv 特権を必要とします。

phoenix% setfpriv -s -a file_owner,file_audit executable

#include <tsol/secflgs.h>
 main()
 {
 	secflgs_t 					value;
 	char 					*file = "/opt/SUNWspro";														/* MLD ではない */
 	char 					*file1 = "/export/home/zelda"; 														/* MLD */
 	int					retval;

 	retval = setfattrflag(file, FAF_PUBLIC, FAF_PUBLIC);
 	retval = getfattrflag(file, &value);
 	printf("Public Attribute Flag = %d¥n", value);

 	retval = mldgetfattrflag(file1, &value);
 	printf("MLD Attribute Flag = %d¥n", value);
 }

printf 文によって、次のように出力されます。1 は true (真) を、0 は false (偽) を意味します。

Public Attribute Flag = 0

MLD Attribute Flag = 1

FAF_MLD - ディレクトリはマルチレベルディレクトリです。FAF_MLD は、ディレクトリが空で、プロセスの実効ユーザー ID がディレクトリの所有者と一致し、プロセスに必須書き込みアクセスがある場合に、特権なしで設定できます。

FAF_SLD - ディレクトリはシングルレベルディレクトリです。このフラグをプログラムから設定することはできません。

装飾パス名が getfattrflag(1) に渡される場合でディレクトリがマルチレベルディレクトリ (MLD) の場合は、FAF_MLD が返されます。装飾されていないパス名が渡される場合でディレクトリが MLD の場合は、FAF_SLD が返されます。

装飾パス名が mldgetfattrflag(2) に渡される場合でディレクトリが MLD のときは FAF_SLD が返されます。装飾されていないパス名が渡される場合でディレクトリが MLD のときは、FAF_MLD が返されます。

装飾名の詳細は、第 8 章「マルチレベルディレクトリ」を参照してください。

FAF_PUBLIC - ファイルまたはディレクトリは公開です。監査記録は、公開ファイルと公開ディレクトリの読み取り操作に対しては作られません。これは、読み取り操作が事前選択された監査クラスの一部である場合でも同様です。このフラグは、次の読み取り操作に適用されます。access(2)fstatvfs(2)lstat(2)open(2) (読み取りのみ)、pathconf(2)readlink(2)stat(2)statvfs(2)


注 -

事前選択された監査クラスに AUE_MAC 監査または AUE_UPRIV 監査の疑似イベントが含まれる場合は、公開属性フラグの設定に関係なく上記のイベントの監査記録は常に作られます。疑似監査イベントの詳細は、『Trusted Solaris の監査管理』を参照してください。


ファイルまたはディレクトリに対し公開属性フラグを取得または設定する場合、プロセスは有効セットに file_audit 特権または file_owner 特権を必要とします。詳細は、「特権と承認」を参照してください。このフラグは、『Trusted Solaris 管理の手順』に述べているように、管理者の権限を使用しても設定できます。

FAF_ALL - ディレクトリは公開 MLD です。

プロセスのセキュリティ属性フラグの取得と設定

呼び出しプロセスの属性フラグを照会するには、getpattr(2) を使用してください。

#include <tsol/pattr.h>

 main()
 {
 	int 				retval;
 	pattr_flag_t 				value;

 	retval = getpattr(PAF_TRUSTED_PATH, &value);
 	printf("Trusted Path Value = %d¥n", value);

 	retval = getpattr(PAF_PRIV_DBG, &value);
 	printf("Priv Debug value = %d¥n", value);

 	retval = getpattr(PAF_NO_TOKMAP, &value);
 	printf("Trusted Network Value = %d¥n", value);

 	retval = getpattr(PAF_DISKLESS_BOOT, &value);
 	printf("Diskless Boot Value = %d¥n", value);

 	retval = getpattr(PAF_SELAGNT, &value);
 	printf("Bypass Selection Agent Value = %d¥n", value);

 	retval = getpattr(PAF_PRINT_SYSTEM, &value);
 	printf("Print System Value = %d¥n", value);

 	retval = getpattr(PAF_LABEL_VIEW, &value);
 	printf("Label View Value = %d¥n", value);

 	retval = getpattr(PAF_LABEL_XLATE, &value);
 	printf("Label Translate Value = %x¥n", value);
 }

printf 文によって、次のように出力されます。 0 は、フラグがオフであることを示します。値 1 はオンであることを示します。ラベル変換値は、フラグがオフの場合は 0 であり、オンの場合はラベル変換フラグを示す 16 進値です。プロセスの属性フラグの詳細は、「明示的定数の値」を参照してください。

Trusted Path Value = 0

Priv Debug Value = 0

Trusted Network Value = 0

Diskless Boot value = 0

Bypass Selection Agent Value = 0

Print System Value = 0

Label View Value = 1

Label Translate Value = 1

明示的定数の値

PAF_TRUSTED_PATH: すべての管理役割に対し、トラステッドパスフラグが設定されます。管理役割から開始されたプロセスはすべて、このフラグが 1 に設定されます。それ以外のプロセスでは、このフラグは 0 に設定されます。このフラグは照会と削除はできますが、設定はできません。

PAF_PRIV_DEBUG: プロセスが特権デバッグモードで開始される場合、この特権デバッグフラグが 1 に設定されます。このフラグはどのプロセスからでも照会できますが、設定ができるのはトラステッドパスプロセスからのみです。特権デバッグモードを有効にする方法と使用方法は、付録 A 「プログラマーズリファレンス」「特権デバッグ」と『Trusted Solaris 管理の手順』を参照してください。

PAF_NO_TOKMAP: このトラステッドコンピューティングベースのネットワークフラグは、セキュリティ属性を持つパケットを必要とするワークステーションに対し、セキュリティ属性のないパケットを送るトラステッドコンピューティングベースのアプリケーションだけに対して 1 に設定されます。

PAF_DISKLESS_BOOT: このディスクレスブートフラグは、ディスクレスブートサーバーをサポートします。このフラグが 1 に設定される場合、ネットワークパケットヘッダー内のセキュリティ属性情報は送信されません。

PAF_SELAGNT: このセレクションエージェントフラグが 1 に設定されると、データをあるウィンドウから別のウィンドウに移動させるときに、そのプロセスは「選択マネージャ」の管理の対象から外されます。詳細は、「ウィンドウ間のデータ移動」を参照してください。

PAF_PRINT_SYSTEM: この出力システムフラグが 1 に設定されると、クライアントプロセスが出力サブシステムのメンバーとして認識されます。

PAF_LABELVIEW: ユーザーまたは役割がプロセスを開始するとき、label_encodings ファイル内のラベル表示指定または /etc/security/tsol/tsoluser ファイル内のユーザーラベル表示設定に応じてこのフラグが設定されます。ラベル表示は、ADMIN_HIGHADMIN_LOW 管理ラベルがシステム内でユーザーにどのように表示されるかを決定します。tsoluser ファイルが存在する場合、このファイル内の設定が label_encodings ファイル内の設定より優先します。

値 0 は外部表示が使用中であることを示し、値 1 は内部表示が使用中であることを示します。このフラグの値に関係なく、ASCII からバイナリへのラベル変換では、内部名または外部名を使用するために管理ラベルの ASCII 文字列出力を要求できます。詳細は、第 6 章「ラベルのコード例」「バイナリから ASCII への変換」を参照してください。

PAF_LABEL_XLATE: このラベル変換フラグが 1 に設定されている場合、flags= keyword オプションが label_encondings(4) ファイルで使用中であることを示します。このオプションフラグ設定は、このオプションフラグを使用している語句に、15 フラグ中のどのフラグが関連付けられるかを指定します。システムはフラグを使用しませんが、ラベルの使用を具体的に記述したアプリケーションはフラグを使用できます。たとえば、通常のラベルではなくプリンタのバナーラベルだけに現れる特定の語句や、公式な内容のやりとり用のラベルだけに現れる特定の語句を定義できます。このフラグの照会と設定は、トラステッドパスプロセスからだけ行えます。

Trusted Solaris 7 のセキュリティ機構

この節では、短い例を使って Trusted Solaris 7 のセキュリティ機構がどのように使用されるかを説明します。それぞれの例で使われているインタフェースの宣言は、対応する章で説明します。これらの例はすべて、-ltsol ライブラリを使用してコンパイルします。例で説明しているように、-ltsol 以外のライブラリを必要とするものもあります。

特権と承認

プロセスで特権を使用すると、通常はシステムセキュリティポリシーによって禁止されているセキュリティ関連の処理を実行できます。承認が与えられると、ユーザーは、ユーザー全員には許容されてない特権処理を実行できます。それぞれの承認は、1 つの特権処理に対応します。特権処理の実行を許容する場合、事前に必ずユーザーの承認を確認してください。


注意 - 注意 -

特権を持つアプリケーションの開発、テスト、デバッグは、メインシステム上のセキュリティポリシーがソフトウェア上の問題や未完成のコードで損なわれることのないように、常に独立した開発用のマシンで行ってください。


特権は、プロセスが処理の実行に必要な、最低限のセキュリティ関連の権限を付与します。同様に、承認は、各ユーザーまたは役割が処理の実行に必要な、最低限のセキュリティ関連の権限を付与します。

システム管理者は、ユーザーと役割に対し実行プロファイルを介して承認を割り当てます。chkauth(3) ルーチンは、有効なユーザー名と承認をパラメータとして受け取り、そのユーザーに承認が割り当てられると true を返します。特権は、開発段階で実行可能ファイルに対して割り当てることも、実行時にユーザーまたは役割の実行可能プロファイルから継承するようにもできます。あるいは、この両方を設定することもできます。

プログラムが特権とユーザーの承認チェックが必要な処理を実行するかどうかを確認するには、次の点を調べてください。

次の例は、ファイルの機密ラベルの降格を含む処理を実行する前に、file_downgrade_sl 特権に対するプロセスの許可された特権のセット (許可セット) と、ユーザー ID zelda に対するユーザーの「ファイルの機密ラベルを降格」承認をチェックします。特権が許可セットに含まれており、 zelda に承認がある場合、このコードは有効な特権のセット (有効セット) 内で file_downgrade_sl 特権をオン (有効) にして処理を実行します。処理が終了すると、file_downgrade_sl はオフ (無効) になります。

この例は、次のライブラリを使用してコンパイルしています。

-ltsoldb -lnsl -lcmd -ltsol


注 -

許可セットにはプロセスが実行中に使用できる特権が含まれ、有効セットには一定の時間にプロセスが実際に使用する特権が含まれます。有効な特権を一定の期間オンにして、その後オフにすることを、「特権のブラケット化」と言います。詳細は、第 3 章「特権」に挙げられています。


#include <tsol/priv.h>
 #include <tsol/auth.h>

 main()
 {
 	char			*zelda = "zelda";
 	priv_set_t			priv_set;

/* 許可された特権のセットを得る */
 	getppriv(PRIV_PERMITTED, &priv_set);

 	if(PRIV_ISASSERT(&priv_set, PRIV_FILE_DOWNGRADE_SL) &&
 				chkauth(TSOL_AUTH_FILE_DOWNGRADE_SL, zelda)) {
 		set_effective_priv(PRIV_ON, 1, PRIV_FILE_DOWNGRADE_SL);
 		/* ファイルの機密ラベルを降格させる*/
 		set_effective_priv(PRIV_OFF, 1, PRIV_FILE_DOWNGRADE_SL);
 	}
 	else {/* エラーを出力する */}
 }

CMW ラベルと認可上限

プロセスがより高い機密ラベルのファイルに書き込みを行う場合や、オブジェクトの CMW ラベルを変更する場合、システムはファイルの機密ラベルがプロセスの機密ラベルよりも優位であり、プロセス認可上限がファイルの機密ラベルよりも優位であることをチェックします。アプリケーションが複数の異なる機密ラベルのファイルに書き込みを行う場合、必要に応じ、コード内でこれらのチェックを実行してエラーを見つけることも、必要に応じて有効セットに特権を追加することもできます。

このコードは、以下の処理を実行します。

第 5 章「ラベル」第 7 章「プロセス認可上限」では、バイナリ形式のラベルまたは認可上限を ASCII 形式に変換するプログラミングインタフェースについて説明します。ASCII 形式に変換すると、文字列のように処理できます。

#include <tsol/label.h>
 main()
 {
 	int						retval, retvalclearance, retvalsens;
 	bclabel_t					filecmwlabel, processcmwlabel;
 	bslabel_t					filesenslabel, processsenslabel;
 	bclear_t					processclearance;
 	char			*file = "/export/home/labelfile";

/* ファイルの CMW ラベルを得る */
 	retval = getcmwlabel(file, &filecmwlabel);

/* プロセスの CMW ラベルを得る */
 	retval = getcmwplabel(&processcmwlabel);

/* CMW ラベルの機密ラベル部を得る */
 	getcsl(&filesenslabel, &filecmwlabel);
 	getcsl(&processsenslabel, &processcmwlabel);

/* プロセスの認可上限を得る */
 	retval = getclearance(&processclearance);

/* プロセスのラベルがファイルのラベルより優位か調べる (retvalclearance > 0) */
 	retvalclearance = bldominates(&processsenslabel, &filesenslabel);

/* プロセスの認可上限がファイルのラベルより優位か調べる (retvalsens > 0) */
 	retvalsens = bldominates(&processclearance, &filesenslabel);

/* 検査の結果 */
 	if(retvalclearance && retvalsens > 0)
 		{ /* ファイル CMW ラベルの変更あるいはファイルへの書き込み */}
 	else if (retvalclearance == 0)
 		{ /* エラーメッセージの表示あるいは該当する有効な特権の作成 */}
 	else if (retvalsens == 0)
 		{ /* エラーメッセージの表示あるいは該当する有効な特権の作成 */}
 }

マルチレベルディレクトリ

マルチレベルディレクトリ (MLD) を使用すると、アプリケーションを複数の機密ラベルで実行し、プロセスが開始された機密ラベルでシングルレベルディレクトリ (SLD) のデータにアクセスできます。この例は、stobsl(3) を使用して ASCII 文字列をバイナリに変換し、そのバイナリラベルを getsldname(1) に渡すことによって、zelda MLD 内の Confidential の SLD の名前を取得する方法を示しています。/export/home/zelda MLD のラベルは ADMIN_LOW であり、プロセスは Confidential で実行しています。このプロセスには MLD に対する必須読み取りアクセスがあり、プロセスの機密ラベルが SLD の機密ラベルより優位であるため、プロセスは特権を必要としません。

#include <tsol/mld.h>

 char 				*file = "/export/home/zelda";
 char 				buffer[3*1024];
 bslabel_t				senslabel;
 int 				length, flags, retval, error;

 main()
 {
/* Confidential のSLD 名を得る */
 	retval = stobsl("CONFIDENTIAL", &senslabel, NEW_LABEL, &error);
 	length = sizeof(buffer);
 	retval = getsldname(file, &senslabel, buffer, length);
 	printf("SLD Name = %s¥n", buffer);
 }

printf 文によって、ラベルが ADMIN_LOW の SLD の名前が出力されます。SLD の名前の意味については、第 8 章「マルチレベルディレクトリ」を参照してください。

SLD Name = .SLD.2


注 -

mldstat(2)mldlstat(2) システムコールを使用すると、MLD、または MLD であるシンボリックリンクのファイル属性情報を表示できます。これらのシステムコールの詳細は、stat(2) のマニュアルページと第 8 章「マルチレベルディレクトリ」を参照してください。


アプリケーション監査

アプリケーションは、auditwrite(3) ライブラリルーチンを使用して、アプリケーション自体の独自の監査イベントのログを記録できます。この例は、auditwrite() に対する 1 つのコールでユーザー監査記録を作成します。記録される監査イベントは、「successful login at console (コンソールのログインが完了しました)」というテキストを含む AUE_su です。通常、auditwrite() は、アプリケーションレベルの監査イベントを記録します。この例では、ルーチンの使用方法を示すために、Trusted Solaris 7 のユーザーイベントを記録しています。独自の監査イベントの詳細は、第 9 章「アプリケーション監査」を参照してください。

AUE_su はトラステッドコンピューティングベース (TCB) の監査イベントであるため、このプログラムを実行するプロセスは、有効セット内に proc_audit_tcb 特権を必要とします。コードのコメントは、どこで特権のブラケット化が必要かを示します (特権のブラケット化の詳細は第 3 章「特権」を参照)。aw_strerror(3) ルーチンは、auditwrite エラーメッセージ (aw_errno) を文字列に変換します。auditwrite() に渡されるパラメータを次に示します。

#include <bsm/auditwrite.h>
 #include <types.h>
 #include <unistd.h>

 main()
 {
 	char		*aw_string;
 	int		retval, errno;

/* 有効な特権セットの proc_audit_tcb をオン (有効) にする */
 	retval = auditwrite(						AW_EVENT, "AUE_su", AW_TEXT, "Successful login at console",
 							AW_WRITE, AW_END);
/* proc_audit_tcb 特権をオフ(無効) にする */

 	aw_string = aw_strerror(aw_errno);
 	printf("Retval = %d AW_ERROR = %s ERRNO = %d¥n", retval, aw_string, errno);
 }

このプログラムを実行して監査記録を表示するには、次の手順に従ってください。

  1. 管理役割になり、表示用端末ウィンドウを ADMIN_HIGH で開き、次のコマンドを実行します。loAUE_su が属するクラスを示し、pid は端末のプロセス ID を示します。

    # auditconfig -setpmask pid lo

  2. 管理役割になり、2 番目の表示用端末を ADMIN_HIGH で開きます。続いて、praudit(1M) を使用し、次のコマンドとオプションを入力して not_terminated (最新のまだ閉じていない) 監査ログファイルを読み取ります。


    注 -

    この構文は、*not_terminated* ファイルが 1 つだけ存在する場合に動作します。ほかにもファイルが存在する場合は、古いファイルを削除してからこのコマンドを実行してください。


    phoenix% tail -0f *not_terminated* | praudit

  3. 最初に開いたウィンドウで、コードをコンパイルして実行します。

    この例のコンパイルには、次のライブラリが必要です。

    -lbsm -lnsl -lintl -lsocket -ltsol

    この例が動作するためには、プロセスに proc_audit_tcb 特権が必要です。特権を設定するには、次に示すように setfpriv(1) を使用してください。

    setfpriv(1) は、file_setpriv 特権を必要とするので、このコマンドをプロファイルシェルから実行するときは、この特権を使用しなければなりません。

    phoenix% setfpriv -s -a proc_audit_tcb executable

    printf 文によって、最初の端末ウィンドウに次のように出力されます。

    Retval = 0, AW_ERROR = No error, ERRNO = 0

    表示用ウィンドウには、監査記録が次のように表示されます。


    header, 129,2,su,,Wed Jun 26 14:50:19 1996, +699964500 msec  
    text, Successful login at console
    
    subject,zelda,zelda,staff,zelda,staff,1050,853,24,7 phoenix
    
    slabel,Confidential
    
    return,success,0

    この監査記録は、一連のトークンから構成されています。それぞれの行には、トークンとそれに続くトークン値が含まれます。この例では、監査イベント AUE_su のトークンは header、text、subject、slabel、return です。トークン値は、次のトークンが出現するまでに示される、そのトークンの情報です。トークンの詳細は、『Trusted Solaris の監査管理』を参照してください。

ユーザーデータベースとプロファイルデータベース

ユーザーデータベース tsoluser(4) と実行プロファイルデータベース tsolprof(4) 内の情報は、ライブラリルーチンを使用してアクセスできます。この例は、tsoluser データベースからユーザー情報を取得します。この情報は、システム管理者がユーザーマネージャとプロファイルマネージャを使用してシステムのユーザープロファイルと実行プロファイルを設定するときにデータベースに加えるものです

TSOL_DB_SRC_NISPLUS フラグは、Trusted Solaris 7 に対し tsoluser NIS+ データベースを読み取ってユーザー情報を取得するように伝えます。このルーチンやその他のデータベースアクセスルーチンが返す情報の詳細は、第 10 章「ユーザーとプロファイルのデータベースエントリへのアクセス」を参照してください。

この例は、次のライブラリを使用してコンパイルします。

-ltsoldb -lnsl -lcmd -ltsol

#include <tsol/user.h>
 #include <tsol/tsol.h>

 main()
 {
 	userent_t *uentry;
 	char *uname = "zelda";
 	uentry = getuserentbyname(uname, TSOL_DB_SRC_NISPLUS;
 }