Trusted Solaris 開発ガイド

監査レコードの作成

監査レコードは、1 つの呼び出し (AW_WRITE) または複数の呼び出し (AW_APPEND、最後の呼び出しだけは AW_WRITE) により、auditwrite(3) ルーチンに 1 つの制御コマンドと 1 つ以上のトークンコマンドを渡して作成します。監査レコードには、AW_EVENT トークンが含まれている必要があります。また、発生したイベントおよびイベントの成功 / 失敗を示す AW_RETURN トークンが含まれている必要があります。詳細は、「return トークン」 を参照してください。

無効な呼び出しと有効なコードの作成

次に、auditwrite(3) ルーチンに対する呼び出しが無効な場合と有効な場合の、監査トレールに記録される監査レコード例をそれぞれ示します。監査レコードとトークンの構造は、「トークンの構造」を参照してください。

無効な呼び出し

複数の制御コマンドを使用するか、制御コマンドを省略するか、あるいは AW_END ターミネータコマンドを含めない場合、コードがコンパイルおよび実行されて、監査トレールに auditwrite(3) ルーチンに対する無効な呼び出しが記録されます。プロセスの事前選択マスクが AUE_auditwrite イベントの失敗を監査する場合にのみ、このイベントがトレールに記録されます。

次の例は、AW_END ターミネータコマンドが省略された無効な auditwrite(3) ルーチンコールと、その結果生成された監査レコードを示しています。この最初のプログラムに示しているヘッダーファイルは、この章のこれ以降の例にも適用されます。

#include <bsm/auditwrite.h>
 #include <tsol/label.h>
 #include <sys/param.h>
 #include <bsm/libbsm.h>
 #include <tsol/priv.h>

 main()
 {
/* AW_END のない無効な呼び出し。このような使い方はしないこと */
 	auditwrite(AW_EVENT, "AUE_second_signature", AW_WRITE);
 }

無効な呼び出しは syslog に記録され、その無効なレコードに情報が十分含まれる場合は監査トレールにも記録されます。この例では、無効な呼び出しは、次の情報とともに syslog にだけ記録されます。


header, 194,2,auditwrite(3) fail,,Fri Sep 06 10:11:33 1996, + 179952500 msec

text, auditwrite(3) aborted: aw_errno = 6 = Command invalid, errno = 0 = no such device or
address

subject,zelda,zelda,staff,zelda,staff,1774,348,0 0 phoenix

slabel,C

return,failure,-1

有効な呼び出し

auditwrite(3) ルーチンに対するこの呼び出しは AW_END コマンドを含み、AUE_second_signature イベントを監査トレールに記録します。

/* AW_END を含む有効な呼び出し */
 auditwrite(AW_EVENT, "AUE_second_signature", AW_WRITE, AW_END);

表示用の端末に、次のレコードが表示されます。


header, 4022,2,second signature requested,,Fri Sep 06 10:16:49 1996 + 969954500 msec

subject,zelda,zelda,staff,zelda,staff,1774,348,0 0 phoenix

slabel,C

return,success,0

最小限の監査レコードの作成

監査レコードは、一連のトークンから構成されます。レコードのそれぞれのトークンは、トークンの種類から始まり、その後にトークンの値が続きます。監査レコードには、 auditwrite(3) ルーチンに適切なトークンコマンドを渡すことによって、どのようなトークンや値でも含めることができます。

各監査レコードには、少なくとも、header (ヘッダー) トークン、subject (表題) トークン、slabel (機密ラベル) トークン、および return (リターン) トークンが入っています。前述の例の auditwrite(3) ルーチンコールは、AW_EVENT トークンコマンドだけを指定することによって、最小限の監査レコードを生成します。


注 -

auditwrite(3) を呼び出す場合は、常に有効セットに proc_audit_appl 特権が必要であることに注意してください。コード内のコメントは、第 3 章「特権」で説明している特権のブラケット化が必要な位置を示しています。これ以降の例では、読者がブラケット化の実施を理解していることを想定し、このコメントを示しません。


/* 有効セット内で proc_audit_appl をオン (有効) にする */
 auditwrite(AW_EVENT, "AUE_second_signature", AW_WRITE, AW_END);
/* proc_audit_appl 特権をオフ (無効) にする */

次の出力行は、それぞれ 1 つのトークンを含みます。各行の最初の語句はトークン ID であり、その後にトークンの構成要素が続いています。/etc/security/audit_event に定義された説明テキスト「second signature requested (2 番目の署名が要求されています)」が header トークンに加えられます。

この auditwrite(3) ルーチンコールには AW_SUBJECTAW_SLABELAW_RETURN トークンコマンドが渡されていませんが、デフォルトにより、監査レコードには subject、slabel、および return の 3 つのトークンが含まれます。

auditwrite(3) ルーチンに AW_SUBJECTAW_SLABEL、または AW_RETURN を渡す場合には、トークン値を明示的に定義する必要があります。監査の事前選択と事後選択は、return トークン値に基づいて、成功または失敗による監査レコードを選択します。「return トークン」で述べているように、監査レコードには、常に return トークンと成功または失敗を示す適切な値を含めてください。


header, 4022,2,second signature requested,,Fri Sep 06 10:16:49 1996 + 969954500 msec

subject,zelda,zelda,staff,zelda,staff,1774,348,0 0 phoenix

slabel,C

return,success,0

トークンの構造

Trusted Solaris の監査管理』には、各トークンの構造と各構成要素のバイトサイズが示されています。レコードの読み方とレコードサイズの決定方法 (容量を考慮する必要がある場合) を知る助けとなるように、subject トークンの構造を次に示します。

トークン 

ID 

監査  

ID 

ユーザー 

ID 

グループ 

ID 

実ユーザー 

ID 

実グループ 

ID 

プロセス 

ID 

セッション 

ID 

デバイス 

ID 

マシン 

ID 

subject 

zelda 

root 

other 

root 

other 

1774 

348 

0 0 

phoenix 

1 バイト 

4 バイト 

4 バイト 

4 バイト 

4 バイト 

4 バイト 

4 バイト 

4 バイト 

4 バイト 

4 バイト 

return トークン

return トークン AW_RETURN は、1 つの数値 (成功または失敗) と戻り値を受け入れます。デフォルトでは、return トークンは success (成功) と戻り値 0 を示します。return トークン値は、auditwrite(3) ルーチンに渡す直前に設定します。

戻り値は、監査レコードが監査トレールのログをとるかどうかを決定します。プロセスの事前選択マスクが、イベントの属するクラスに対し、イベントが失敗したかどうかだけを監査する場合には、成功イベントのログはとられません。プロセスの事前選択マスクが、イベントの属するクラスに対し、イベントが成功したかどうかだけを監査する場合には、失敗イベントのログはとられません。プロセスの事前選択マスクが、イベントが属しているクラスに対し、成功と失敗の両方を監査する場合には、成功イベントと失敗イベントの両方のログがとられます。また、auditreduce(1M) 事後選択プログラムは、レコードの return トークン内の成功または失敗を表す値によって、監査レコードを選択します。

次の例は、システムが 2 番目の署名を要求したことを示す、監査レコードの一部を作成します。signature_request() 関数は、署名の取得を試み、試みの成功または失敗を表す情報を返し、signature_requestretval パラメータを設定します。succ_or_fail パラメータは signature_request 内の値に基づいて設定され、このパラメータと retval は、AW_RETURN トークンに対して値として渡されます。

char			succ_or_fail;
 u_int			retval;

 auditwrite(	AW_TEXT, "Second signature needed,"
 			AW_APPEND, AW_END);

 if (signature_request() == -1) {
 	succ_or_fail = -1;
 	retval = -2;
 } else {
 	succ_or_fail = 0;
 	retval = 1;
 }

 auditwrite(	AW_EVENT, "AUE_second_signature",
 			AW_RETURN succ_or_fail, retval,
 			AW_WRITE, AW_END);

署名は取得されず、表示用の端末は次のレコードを表示します。


header,128,2,second signature requested,,Wed Sep 11 10:17:37 1996, + 239969000 msec

text, Second signature needed

return,failure,-2

subject,zelda,zelda,staff,zelda,staff,1905,536,0 0 phoenix

slabel,C