監査レコードは、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_SUBJECT、AW_SLABEL、AW_RETURN トークンコマンドが渡されていませんが、デフォルトにより、監査レコードには subject、slabel、および return の 3 つのトークンが含まれます。
デフォルトでは、トークン値の subject にはそのプロセスのセキュリティ属性情報が入り、slabel にはそのプロセスの機密ラベルが入ります。
デフォルトでは、return トークンには、戻り値 0 (成功) が入ります。
auditwrite(3) ルーチンに AW_SUBJECT、AW_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 トークン AW_RETURN は、1 つの数値 (成功または失敗) と戻り値を受け入れます。デフォルトでは、return トークンは success (成功) と戻り値 0 を示します。return トークン値は、auditwrite(3) ルーチンに渡す直前に設定します。
戻り値は、監査レコードが監査トレールのログをとるかどうかを決定します。プロセスの事前選択マスクが、イベントの属するクラスに対し、イベントが失敗したかどうかだけを監査する場合には、成功イベントのログはとられません。プロセスの事前選択マスクが、イベントの属するクラスに対し、イベントが成功したかどうかだけを監査する場合には、失敗イベントのログはとられません。プロセスの事前選択マスクが、イベントが属しているクラスに対し、成功と失敗の両方を監査する場合には、成功イベントと失敗イベントの両方のログがとられます。また、auditreduce(1M) 事後選択プログラムは、レコードの return トークン内の成功または失敗を表す値によって、監査レコードを選択します。
次の例は、システムが 2 番目の署名を要求したことを示す、監査レコードの一部を作成します。signature_request() 関数は、署名の取得を試み、試みの成功または失敗を表す情報を返し、signature_request と retval パラメータを設定します。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 |