Trusted Solaris 開発ガイド

第 4 章 ユーザー承認のチェック

アプリケーションは、特定の処理がユーザーの承認を必要とする場合、その処理を実行する前にユーザーに代わりユーザーの承認をチェックできます。この処理は、特権管理タスクの場合も特権のない管理タスクの場合もあります。アプリケーションで特権を有効にする場合には、承認がチェックされることを確認し、その処理を実行するユーザーまたは役割の識別を行い、ユーザーまたは役割にその処理を実行する承認があることを検査してください。

使用できる承認の詳細は、auth_desc(4) のマニュアルページを参照してください。一定のユーザー名またはユーザー ID の承認をチェックするには、この章で説明している chkauth(3) ルーチンを使用してください。システムにおけるユーザーと、役割と承認の情報を得るには、第 10 章「ユーザーとプロファイルのデータベースエントリへのアクセス」で説明しているインタフェースを使用してください。

Trusted Solaris 7 では、承認によって、ログイン、ファイルとファイル管理、デバイス、ラベル、システム管理作業を制御しています。この章では、承認のチェック、承認 ID の変換、および承認セットの解除を行うプログラミングインタフェースについて説明します。

承認の種類

Trusted Solaris 7 は、次の承認を実施します。

データ型、ヘッダーファイル、ライブラリ

この章で説明しているプログラミングインタフェースを使用するには、次のヘッダーファイルが必要です。

#include <tsol/auth.h>

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

-ltsol -ltsoldb -lcmd -lnsl

単一の承認

1 つの承認は、auth_t 型の定義で示します。auth_t 型の変数は、承認 ID (定数名または数値 ID) を使用して初期化します。コード内では定数名の方が読みやすいため、定数名を使用します。

auth_t auth_id = TSOL_AUTH_FILE_DOWNGRADE_SL;

承認セットの構造

承認セットは、auth_set_t データ構造体で示します。この構造は、複数の承認の管理に使用します。

承認名と説明

auth_desc(4) のマニュアルページには、すべてのシステム承認の承認名、明示的定数名、説明テキストが示されています。

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

ユーザーの承認のチェック、承認 ID の変換およびバイナリと ASCII 間の変換、承認の説明テキストの取得には、ライブラリルーチンを使用します。ライブラリルーチンはどれも特権を必要としません。auth_to_str(3) のマニュアルページを参照してください。

ユーザーの承認

このルーチンは、指定された承認 ID が指定されたユーザー名に割り当てられているかチェックします。

int					chkauth(					auth_t auth_id,
 										char *user_name);

承認 ID

次のルーチンは、指定された承認 ID を ASCII に変換し、再び元の形式に戻します。

char					*auth_to_str(							auth_t auth_id);
 auth_t					str_to_auth(							char *auth_name);

承認セット

次のルーチンは、指定された承認セットを ASCII に変換し、再び元の形式に戻し、承認セットに対応した記憶領域を解放します。

char				*auth_set_to_str(								authset_t *authset,
 												char separator);

 auth_set_t					*str_to_auth_set(								char *auth_names,
 												char *separator);

 void 				free_auth_set(								auth_set_t *auth_set);

承認の説明テキスト

次のルーチンは、指定された承認 ID の説明テキストを取得します。

char					*get_auth_text(							auth_t auth_id);

承認 ID のチェック

chkauth(3) ライブラリルーチンは、ユーザー zelda に「ファイルの機密ラベルを降格」承認があるか確認するため、ユーザー名の承認をチェックします。このルーチンは、指定されるユーザー名に対応したプロファイルをチェックします。ユーザー名には、役割名も使用できます。

後述するコードセグメントのヘッダーファイルと宣言は、次のプログラムに示されています。

#include <tsol/auth.h>

 main()
 {
 	int			result;
 	char			*zelda = "zelda";
 	char 			*string1, *string2;
 	char 			*string = "auth_file_downgrade_sl$auth_file_owner";
 	auth_set_t 	*auth_set;
 	auth_t 			auth_id;

 	result = chkauth(TSOL_AUTH_FILE_DOWNGRADE_SL, zelda);
 	printf("Result = %d¥n", result);
 }

printf 文によって、0 が出力されます。これは、ユーザー zelda に承認がないことを意味します。

Result = 0

承認の変換

次のライブラリルーチンは、指定された承認 ID を対応する外部名または数値 ID に変換し、再び元に戻します。これらのルーチンは、auth_name(4) のマニュアルページで説明されている承認名データベースファイルを読み取り、auth_id (承認 ID) と *string (文字列) 間で変換を行います。

承認 ID から文字列への変換

この例では、auth_id が明示的定数名 TSOL_AUTH_FILE_DOWNGRADE_SL に初期化され、auth_to_str(3) ルーチンに渡されてその外部名に変換されます。

	string1 = auth_to_str(TSOL_AUTH_FILE_DOWNGRADE_SL);
 	printf("%s¥n", string1);

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

downgrade file sensitivity label

文字列から承認 ID への変換

次の例では、auth_to_str(3) から戻された文字列が str_to_auth(3) に渡されて、文字列がその数値 ID に変換されます。

	auth_id = str_to_auth(string1);
 	printf("Auth ID = %d¥n", auth_id);

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

Auth ID = 5

承認の説明テキストの取得

get_auth_text(3) ルーチンは、指定された auth_id (承認 ID) の説明テキストを返します。auth_name(4) のマニュアルページには、システム内のすべての承認の説明テキストが示されています。

	string1 = get_auth_text(TSOL_AUTH_FILE_DOWNGRADE_SL);
 	printf("%s¥n", string1);

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

Allows a user to specify the Sensitivity Label to set on a file that does not dominate the file's existing Sensitivity Label.

承認セット

承認セットを文字列から初期化し、複数の承認の管理、承認セットからの文字列の作成、承認セットに割り当てられた記憶領域のクリアなどが行えます。

文字列から承認セットへの変換

承認名を区切る区切り文字を使用した文字列を指定し、複数の承認 (承認セット) を作成できます。この例では、ドル記号 (「$」) を使用して、2 つの承認を区切っています。セット中で初期化されているのが承認 1 つである場合は、区切り文字を使用しません。区切り文字には、任意の文字を指定できます。str_to_auth_set(3) ルーチンは、常に有効な承認セットを返します。有効でない承認については、それぞれセット内に -1 が含まれます。

	if((auth_set = str_to_auth_set(string, "$")) != NULL)
 		printf("Success¥n");
 	else
 		printf("Fail¥n");

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

Success

承認セットから文字列への変換

承認セットは、そのセットと区切り文字を指定して文字列に変換できます。この例は、str_to_auth_set(3) ルーチンにドル記号 (「$」) を区切り文字として使用するように指定しています。区切り文字には、任意の文字を指定できます。

	if(( string2 = auth_set_to_str(auth_set, '$')) != NULL)
 		printf("Auth string = %s¥n", string2);
 	else
 		printf("Fail¥n");

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

Auth string = auth_file_downgrade_sl$auth_file_owner

承認セットの解放

free_auth_set(3) ルーチンは、作成した承認セットに割り当てられている記憶領域を解放します。

	free_auth_set(auth_set);