Trusted Solaris 開発ガイド

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 の監査管理』を参照してください。