アプリケーションは、特定の処理がユーザーの承認を必要とする場合、その処理を実行する前にユーザーに代わりユーザーの承認をチェックできます。この処理は、特権管理タスクの場合も特権のない管理タスクの場合もあります。アプリケーションで特権を有効にする場合には、承認がチェックされることを確認し、その処理を実行するユーザーまたは役割の識別を行い、ユーザーまたは役割にその処理を実行する承認があることを検査してください。
使用できる承認の詳細は、auth_desc(4) のマニュアルページを参照してください。一定のユーザー名またはユーザー ID の承認をチェックするには、この章で説明している chkauth(3) ルーチンを使用してください。システムにおけるユーザーと、役割と承認の情報を得るには、第 10 章「ユーザーとプロファイルのデータベースエントリへのアクセス」で説明しているインタフェースを使用してください。
Trusted Solaris 7 では、承認によって、ログイン、ファイルとファイル管理、デバイス、ラベル、システム管理作業を制御しています。この章では、承認のチェック、承認 ID の変換、および承認セットの解除を行うプログラミングインタフェースについて説明します。
Trusted Solaris 7 は、次の承認を実施します。
ログインの承認 - ログインを有効にできる権限、リモートログインを実行する権限、シリアルポートログインを実行する権限を制御します。
ファイルの承認とファイル管理の承認 - 機密ラベルの降格と昇格、一時的にファイル所有者になること、ファイル所有者の変更、ファイル特権の設定、特定の監査情報の設定と取得などを行う権限を制御します。また、ドラッグ&ドロップによるファイル内容の表示、および、共通デスクトップ環境 (CDE) が CDE アクションを読み込む位置を変更する権限も制御します。
デバイスの承認 - デバイスの割り当て、および、デバイス間でインポートまたはエクスポートされる情報に対応する CMW ラベルの指定を行う権限を制御します。
ウィンドウの承認 - 降格または昇格されたウィンドウに対するペースト、あるいは異なる機密ラベルでワークスペースを使用する権限を制御します。
ソフトウェア管理の承認 - ユーザー識別セキュリティ情報、パスワード情報、ユーザー属性、ユーザーラベル、監査フラグ、ユーザープロファイル、ワークステーションのアイドル時間などを、どの管理者が設定できるか制御します。
この章で説明しているプログラミングインタフェースを使用するには、次のヘッダーファイルが必要です。
#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 を 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);
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 (文字列) 間で変換を行います。
この例では、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
次の例では、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);