Trusted Solaris 開発ガイド

第 9 章 アプリケーション監査

Trusted Solaris 7 の監査機能を使用すると、管理者はユーザーアクションを監視し、システムの不審な利用や異常な動作を検出することができます。監査の内容、用語、および管理手順の詳細は、『Trusted Solaris の監査管理』を参照してください。この章では、自身で作成した (独自の) アプリケーションで auditwrite(3) ルーチンを使用して、独自のユーザーイベントを作成してログをとる方法を説明します。

独自のユーザーアクティビティ

独自のアプリケーションは、auditwrite(3) ルーチンを使用して、アプリケーションに固有の独自の監査イベントと監査クラスを作成し、監査記録を生成することによってユーザーによるシステム使用状況を監査します。

アプリケーションプログラマは、独自のアプリケーションで使用される独自の監査イベントとクラスを定義します。そのアプリケーションを使用するサイトのシステム管理者は、前述したファイルを設定することによって、新しいイベントとクラスを認識します。

アプリケーション内部では、監査イベントが生成され、監査トレールにレコード単位でログが記録されます。監査レコードには、監査イベントとその他の関連情報 (イベントを生成したプロセスのプロセス ID、イベントが発生したマシン、日時など) を持つトークンが含まれます。監査トレールは、カーネル、システムアプリケーション、および独自のアプリケーションによって生成された監査レコードがファイル単位で格納される場所です。次の図は、これらの要素とその関係を示しています。

図 9-1 監査トレール、ファイル、レコード、およびトークン

Graphic

auditwrite(3) ルーチンに渡すトークンを決定し、どの情報を監査レコードに記録するかを決めるのはプログラマです。独自のアプリケーションの監査レコードは、可能なかぎり高いインタフェース層で生成してください。そうすることにより、もっとも正確な情報が得られ、価値の低い監査レコードを生成しないように制限しやすくなります。

特権オペレーション

auditwrite(3) ルーチンを呼び出して独自の監査レコードを監査トレールに記録する場合、プロセスは、有効セットに proc_audit_appl 特権を必要とします。この特権は、監査状態のような監査情報を取得する処理でも必要です。

ヘッダーファイルとライブラリ

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

#include <bsm/auditwrite.h>

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

-DTSOL -lbsm -lsocket -lnsl -lintl -ltsol

宣言と引数の種類

auditwrite(3) ルーチンは、独自の監査イベントを生成し、ログを作成します。

int		auditwrite(..., AW_END);

このライブラリルーチンでは、次に示す 3 種類の引数を組み合わせて使用できます。引数コマンドとそれらの意味の一覧は、auditwrite(3) のマニュアルページを参照してください。この章のコード例は、これらの引数コマンドを数多く使用しています。

コード例を実行するための事前設定

独自のイベントと独自のクラスの作成、および監査トレールに記録された監査レコードの表示を行うには、管理上の設定が多少必要です。次に、この章のコード例の実行に必要な、管理設定の概略を述べます。管理操作の詳細は、『Trusted Solaris の監査管理』を参照してください。

まず、監査が使用可能で有効であることを確認します。デフォルトでは有効ですが、auditconfig(1M) コマンドと getcond オプションを使用して確認できます。このコマンドは、プロファイルシェルから sys_audit または proc_audit_appl 特権を使用して実行してください。setcond オプションを使用すると、監査を有効または無効にできます。

phoenix% auditconfig -getcond

監査ファイルの設定

この節では、audit_classaudit_eventaudit_control ファイルの設定方法を示します。これらのファイルは、次の方法で編集してください。

  1. セキュリティ管理者の役割になります。

  2. アプリケーションマネージャを起動します。

  3. 「システム管理 (System_Admin)」アイコンをダブルクリックします。

  4. 「監査クラス (Audit Classes)」アクション、「監査イベント (Audit Events)」アクション、または「監査制御 (Audit Control)」アクションをダブルクリックします。

  5. 各ファイルを次のように編集します。

監査クラスと監査イベント

独自の監査クラス ec および、2 つの監査イベント AUE_second_signatureAUE_second_signature_verify を作成します。これらのファイルの詳細は、audit_class(4)audit_event(4) のマニュアルページを参照してください。

監査制御 (プロセスの事前選択マスク)

プロセスの事前選択マスクは、プロセスによって監査される監査クラスを指定します。独自のイベントの監査に対し事前選択マスクを設定するには、例題のクラス (ec) 内のイベントの成功 / 失敗を監査するように、/etc/security/audit_control のフラグのパラメータを次のように編集します。

flags:ec

audit_control(4) 内の設定は、システム内のすべてのユーザーに適用されます。設定を 1 人のユーザーに限定するには、/etc/security/audit_user ファイル (「ユーザーの監視」アクション) を次のように編集します。

zelda:ec

ファイルの詳細と設定方法は、audit_control(4)audit_user(4) マニュアルページを参照してください。ログアウトし、再度ログインすると、新しく定義したプロセスの事前選択マスクが有効になります。-setpmask オプションを指定して auditconfig(1M) を使用しても、既存のあらゆるプロセスにプロセスの事前選択マスクを設定できますが、ファイルを設定し、ログアウトしてログインし直す方が簡単です。

監査トレール設定の表示

auditwrite(3) ルーチンで生成した監査レコードなど、すべての監査レコードは、一連のバイナリファイルとして ADMIN_HIGH で監査トレールに記録されます。監査ファイルの位置は、/etc/security/audit_control ファイルで設定します。この位置は、デフォルトでは /var/audit です。praudit(1M) コマンドは、監査トレールファイルを読み取り、バイナリデータをユーザーが読める形式の監査レコードに変換します。

proc_audit_applproc_audit_tcb 特権を使用して、tail(1) コマンドと praudit(1M) コマンドを使用できる役割になります。端末を ADMIN_HIGH で開き、監査レコードが格納されているディレクトリに移動し、tailpraudit コマンドを次のように実行して現在の監査ファイルを表示します。


注 -

この構文は、*not_terminated* ファイルが 1 つ存在する場合だけ有効です。同名のファイルがほかにも存在する場合は、古いファイルを削除してからこのコマンドを実行してください。


phoenix% cd /var/audit
 phoenix% tail -0f *not_terminated* | praudit

監査デーモンは、監査パーティションに対し、定められた最大の容量に達するまで監査レコードを記録し、その後新しいファイルへの記録開始します。現在書き込みが行われているファイルは、not_terminated 監査ファイルです。どのファイルが使用中かを確認するには、/etc/security/audit_data ファイルを参照してください。

実行可能コードの設定

file_setpriv 特権を使用して、プロファイルシェルから setfpriv(1) を実行し、ソースコード例が入った実行可能ファイル (executable.file) の強制された特権セットと許可された特権セットに proc_audit_appl 特権を追加します。スクリプトを使用した実行方法は、「スクリプトを使用したファイル特権の割り当て」を参照してください。

phoenix% setfpriv -s -f proc_audit_appl -a proc_audit_appl executable.file

監査レコードの作成

監査レコードは、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

情報ラベルを含む監査レコード情報の追加

次の例は、auditwrite(3) ルーチンを使用して、内部レコードバッファに情報を追加し (AW_APPEND)、レコードが完全に構築された時点で監査トレールに書き込む (AW_WRITE) ことによって、監査レコードを作成します。この例では示していませんが、監査トレールに書き込まれない完成した監査レコードや部分的な監査レコードは、AW_DISCARD トークンを使用して破棄できます。

int			err;
 bclear_t			clearance;
 bilabel_t			inflabel;

 getclearance(&clearance);
 stobil("c a", &inflabel, NEW_LABEL, &err);
 auditwrite(AW_EVENT, "AUE_second_signature", AW_APPEND, AW_END);
 auditwrite(AW_CLEARANCE, &clearance, AW_APPEND, AW_END);
 auditwrite(AW_ILABEL, &inflabel, AW_APPEND, AW_END);
 auditwrite(AW_WRITE, AW_END);

表示用の端末に、次のレコードが表示されます。セキュリティ上の理由から、情報ラベルは 16 進で記述されています。16 進は、hextoalabel(1M) コマンドを使用して、対応する ASCII に変換できます。


header,204,2,second signature requested,,Mon Sep 09 
10:26:28 1996, + 5799540000 msec

clearance,TS A B

ilabel,0xef7d731c00000000000000040000000400000007ef7f942800
0000000000000000000000000000000000000000000000ffff1d8000000
000000000000000000000000000

subject,zelda,zelda,staff,zelda,staff,6098,5879,0 0 phoenix

slabel,C

return,success,0

監査レコードを待ち行列に入れる

システムコールのオーバーヘッドを最小限に抑えるため、監査レコードを AW_QUEUE トークンで待ち行列に入れ、auditwrite(3) ルーチンに対する 1 回のコールで書き込むことができます。次の例では、auditwrite(3) ルーチンに対する最初のコールで監査の待ち行列が有効にされ、待ち行列に 200 バイトの監査レコードが記録された時点ですべてのレコードがフラッシュするように設定されます。AW_FLUSH トークンを使用すると、待ち行列のフラッシュを強制できます。また、AW_NOQUEUE トークンにより、待ち行列が無効になるたびに待ち行列は自動的にフラッシュします。

次の例では、待ち行列は 200 バイトのデータに達していませんが、2 番目のレコードが追加された後、待ち行列は手動によりフラッシュします。また、待ち行列が無効にされた最後の時点で、待ち行列は再びフラッシュします。

バイト制限が理由で、監査トレールに部分的なレコードが記録されることはありません。待ち行列が 200 バイト保持できる場合、この制限に達した時点で、auditwrite(3) ルーチンに渡されたすべてのレコードが完全にフラッシュされます。これには、完全な監査レコードを形成する 200 バイトを超えるデータバイトも含まれます。

/* 140 バイトごとにフラッシュするように待ち行列を設定 */
 	auditwrite(	AW_QUEUE, 200, AW_END);

/* 待ち行列にレコードを書き込む */
 	auditwrite(	AW_EVENT, "AUE_second_signature",
 				AW_TEXT, "First record in queue",
 				AW_WRITE, AW_END);

 	auditwrite(	AW_EVENT, "AUE_second_signature_verify",
 				AW_TEXT, "Second record in queue",
 				AW_WRITE, AW_END);

/* 手動で待ち行列をフラッシュする */
 	auditwrite(AW_FLUSH, AW_END);

/* 次のレコードを書き込む */
 	auditwrite(	AW_EVENT, "AUE_second_signature",
 				AW_TEXT, "Third record in queue",
 				AW_WRITE, AW_END);

/* 待ち行列とフラッシュを終了する */
 	auditwrite(AW_NOQUEUE, AW_END);

表示用の端末に、次の監査記録が表示されます。


header,204,3,second signature requested,,Mon Sep 09 10:26:28 1996, + 79950000 msec

text,First record in queue

subject,zelda,zelda,staff,zelda,staff,6098,5879,0 0 phoenix

slabel,C

return,success,0


header,204,4,second signature added,,Mon Sep 09 10:26:28 1996, + 79950000 msec

text,Second record in queue

subject,zelda,zelda,staff,zelda,staff,6098,5879,0 0 phoenix

slabel,C

return,success,0


header,204,5,second signature requested,,Mon Sep 09 10:26:28 1996, + 119947000 msec

text,Third record in queue

subject,zelda,zelda,staff,zelda,staff,6098,5879,0 0 phoenix

slabel,C

return,success,0

事前選択マスクの指定

「監査制御 (プロセスの事前選択マスク)」で説明しているように、監査レコードは、実行環境に対して設定されたプロセスの事前選択マスクに基づいて選択されます。また、auditwrite(3) ルーチンは、AW_PRESELECT トークンを有し、そのトークンは、監査マスク構造体をその値としてとります。このトークンは監査マスクの値の設定に基づいてクラスを監査する、auditwrite(3) に対する後続の呼び出しを起動します。これは、AW_NOPRESELECT トークンが auditwrite(3) に渡されて、環境事前選択マスクを使用するように指示するまで続きます。

次の例は、この例のサンプルクラス (ec) の失敗を監査するプロセスの事前選択マスクを作成し、このマスクを AW_PRESELECT トークンを使用して auditwrite(3) ルーチンに渡して、有効にします。これにより、この例のクラスに属する失敗したイベントだけが監査トレールに記録されます。事前選択が無効にされる時点で、環境プロセス事前選択マスク (この例では、クラス内のイベントの成功または失敗を監査する) が復元されます。

char			succ_or_fail;
 u_int			retval;
 au_mask_t mask;

/* ec クラス内のイベントの失敗を監査するためのマスクを作成する */
 	getauditflagsbin("-ec", &mask);

/* 新しい事前選択マスクを使用する */
 	auditwrite(AW_PRESELECT, &mask, AW_END);

/* 監査レコードを生成するコード */
 	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);

/* 環境の事前選択マスクを復元をする */
/* ec クラスのイベントの成功または失敗が再び監査される */
 	auditwrite(AW_NOPRESELECT, AW_END);

監査レコードの並行作成

ファイル記述子に似たレコード記述子 AW_GETRD を使用しないかぎり、監査レコードはデフォルトのレコード記述子を使用して作成されます。次の例は、レコード記述子 ad1ad2 を使用して 2 つのレコードを並行して作成し、ad2 を監査トレールに書き込み、ad1 を破棄 (AW_DISCARDRD) します。この次の例に示す AW_DEFAULTRD は、レコードの作成をデフォルトのレコード記述子に切り替えます。

	int		ad1, ad2;
/* レコード記述子を取得して使用する */
 	auditwrite(	AW_GETRD, &ad1, AW_END);
 	auditwrite(	AW_USERD, ad1, AW_END);

/* レコードの情報を ad1 に追加する */
 	auditwrite(	AW_EVENT, "AUE_second_signature", AW_TEXT, "ad1 one", AW_APPEND, AW_END);

/* 2 番目のレコード記述子を得る */
 	auditwrite(	AW_GETRD, &ad2, AW_END);

/* レコード情報を ad1 に追加する */
 	auditwrite(	AW_PATH, "/export/home/zelda/document_4_sig_req", AW_APPEND, AW_END);

/* ad2 を使用する */
 	auditwrite(	AW_USERD, ad2, AW_END);

/* レコードを ad2 に追加する */
 	auditwrite(	AW_PATH, "/export/home/zelda/document_4_sig_ver", AW_APPEND, AW_END);
 	auditwrite(	AW_EVENT, "AUE_second_signature_verify", AW_WRITE, AW_END);

/* ad1 を破棄する */
 	auditwrite(	AW_DISCARDRD, ad1, AW_END);

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


header,141,2,second signature requested,,Wed Sep 11 11:16:29 1996, + 2399710000 msec

path,/export/home/zelda/document_4_sig_ver

subject,zelda,zelda,staff,zelda,staff,1983,536,0 0 phoenix

slabel,C

return,success,0

保存領域の使用

保存領域を有効にして (AW_SAVED) この領域にトークンを保存し、監査トレールに書き込まれる前にレコードに付加されるように設定できます。保存領域の取得と使用は、レコード記述子の取得と使用と同様です。保存領域は、AW_NOSAVE を使用して無効にします。

	int		ad1, ad2, ad3;
/* 保存領域 ad1 を有効にして使用する */
 	auditwrite(	AW_SAVERD, &ad1, AW_END);
 	auditwrite(	AW_USERD, ad1, AW_END);

/* 他のレコードの前に付加するテキストを ad1 に保存する */
 	auditwrite(AW_TEXT, "Prepended Text", AW_APPEND, AW_END);

/* デフォルトのレコード記述子を使用して、そこにイベントを書き込む */
 	auditwrite(	AW_DEFAULTRD, AW_END);
 	auditwrite(	AW_EVENT, "AUE_second_signature", AW_TEXT, "Default record",
 				AW_WRITE, AW_END);

/* レコード記述子 ad2 を取得して使用する */
 	auditwrite(	AW_GETRD, &ad2, AW_END);
 	auditwrite(	AW_USERD, ad2, AW_END);

/* イベントを ad2 に書き込む */
 	auditwrite(	AW_EVENT, "AUE_second_signature", AW_TEXT, "ad2 record", AW_WRITE, AW_END);

/* 保存領域を破棄する */
 	auditwrite(	AW_NOSAVE, AW_END);

/* レコード記述子 ad3 を取得して使用 */
 	auditwrite(	AW_GETRD, &ad3, AW_END);
 	auditwrite(	AW_USERD, ad3, AW_END);

/* ad3 にイベントを書き込む */
 	auditwrite(	AW_EVENT, "AUE_second_signature_verify", AW_TEXT, "ad3 with no prepend",
 				AW_WRITE, AW_END);
 

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


header,132,2,second signature requested,,Wed Sep 11 11:16:29 1996, + 2399710000 msec

text,Prepended Text

text,Default record

subject,zelda,zelda,staff,zelda,staff,1983,536,0 0 phoenix

slabel,C

return,success,0


header,128,2,second signature requested,,Wed Sep 11 11:16:29 1996, + 2399710000 msec

text,Prepended Text

text,ad2 record

subject,zelda,zelda,staff,zelda,staff,1983,536,0 0 phoenix

slabel,C


header,125,2,second signature added,,Wed Sep 11 11:16:29 1996, + 2399710000 msec

text,ad3 with no prepend

subject,zelda,zelda,staff,zelda,staff,1983,536,0 0 phoenix

slabel,C

サーバー領域の使用と機密ラベルの追加

AW_SERVER トークンは、トラステッドサーバーオプションを有効にし、呼び出しプロセスがサーバーであることを示します。トラステッドサーバーが有効な場合 auditwrite(3) ルーチンは自動的に header と return トークンを生成しますが、トラステッドサーバーが無効である場合には subject と slabel は自動的には生成しません (「最小限の監査レコードの作成」を参照)。トラステッドサーバーが有効な場合は、AW_SUBJECTAW_SLABEL トークンを明示的に渡して、この情報をレコードに含める必要があります。

この例は、トラステッドサーバーオプションを有効にし、レコードを書き込み、機密ラベルを含む別のレコードを書き込みます。続いて、トラステッドサーバーオプションを無効にし、違いがわかるように最終レコードを書き込みます。Confidential で動作しているプロセスは Secret よりも優位でないため、Secret 機密ラベルを変換するには sys_trans_label 特権が必要です。

bslabel_t				senslabel;

/* secret の機密ラベルを作成 */
 	stobsl("Secret", &senslabel, NEW_LABEL, &error);

/* トラステッドサーバーオプションをオン (有効) にする */
 	auditwrite(	AW_SERVER, AW_END);

/* レコードを監査トレールに書き込む */
 	auditwrite(	AW_EVENT, "AUE_second_signature",
 				AW_TEXT, "Some text",
 				AW_WRITE, AW_END);

/* レコードの機密ラベルを監査トレールに書き込む */
 	auditwrite(	AW_EVENT, "AUE_second_signature",
 				AW_TEXT, "Sensitivity label added",
 				AW_SLABEL, &senslabel,
 				AW_WRITE, AW_END);

/* トラステッドサーバーオプションをオフ (無効) にする */
 	auditwrite(AW_NOSERVER, AW_END);

/* 最終レコードを監査トレールに書き込む */
 	auditwrite(	AW_EVENT, "AUE_second_signature",
 				AW_TEXT, "Some more text",
 				AW_WRITE, AW_END);

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


header,38,2,second signature requested,,Wed Sep 11 12:46:41 1996 + 309940000 msec

text,Some text

return,success,0


header,38,2,second signature requested,,Wed Sep 11 12:46:41 1996 + 309940000 msec

text,Sensitivity label added 

slabel,S

return,success,0


header,112,2,second signature requested,,Wed Sep 11 12:46:41 1996 + 799939500 msec

text,Some more text

return,success,0

subject,zelda,zelda,staff,zelda,staff,420,286,0 0 phoenix

slabel,C

return,success,0

引数情報

AW_ARG トークンを使用すると、監査レコードに引数情報を書き込むことができます。この例は、関数 signature_request() に対する戻り値を書き込みます。これは、関数内部の return() 呼び出しに対する最初にして唯一のパラメータです。AW_ARG トークンの後に引数番号が続き、その後に説明テキストと引数値が続きます。

retval = signature_request();
 auditwrite(						AW_EVENT,
 						"AUE_second_signature",
 						AW_ARG, 1,
 						"Signature request return value",
 						retval);

表示用の端末に、次のレコードが表示されます。この例では、戻り値は、0xffffffff として書き込まれます。


header,137,3,second signature requested,,Fri Mar 21 08:51:19 1997, + 329950500 msec

argument,1,0xffffffff,Signature request return value

subject,zelda,zelda,staff,zelda,staff,420,286,0 0 phoenix

slabel,C

return,success,0

コマンド行引数

AW_EXEC_ARGS トークンを使用すると、argv (引数値) に格納されたコマンド行引数を監査レコードに入れることができます。

main(argc, argv)
 int argc;
 char **argv;
 {
/* アプリケーションのコード */
/* ... */
 	auditwrite(							AW_EVENT,
 								"AUE_second_signature",
 								AW_EXEC_ARGS, argv
 								AW_WRITE, AW_END);
 }

プログラムが「program Hello World!」と実行されると、表示用端末に次のレコードが表示されます。


header,120,3,second signature requested,,Fri Mar 21 09:31:01 1997, +989946000 msec

exec_args,3,

program,Hello World!

subject,zelda,zelda,staff,zelda,staff,420,286,0 0 phoenix

slabel,C

return,success,0

特権セット

AW_PRIVILEGE トークンは、監査レコードに特権セットを追加します。次の例は、指定された実行可能ファイルに対して許可された特権セットを、監査レコードに記録します。

priv_set_t								allowed_set;

 PRIV_EMPTY(&allowed_set);

 retval = getfpriv(								"/export/home/zelda/program",
 								PRIV_ALLOWED,
 								allowed_set);

 auditwrite(								AW_EVENT,
 								"AUE_second_signature",
 								AW_PRIVILEGE, AU_PRIV_ALLOWED, &allowed_set,
 								AW_WRITE, AW_END);

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


header,116,3,second signature requested,,Fri Mar 21 10:12:21 1997, + 809950000 msec

privilege,allowed,proc_audit_appl

subject,zelda,zelda,staff,zelda,staff,420,286,0 0 phoenix

slabel,C

return,success,0

プロセス間通信の識別子

AW_IPC トークンは、指定されたプロセス間通信 (IPC) 識別子を監査レコードに追加します。次の例は、セマフォセットを作成し、セマフォ識別子を監査レコードに追加します。

int 								semid;

 semid = semget(IPC_PRIVATE, 3, IPC_CREAT);

 auditwrite(								AW_EVENT,
 								"AUE_second_signature",
 								AW_IPC, AT_IPC_SEM, semid,
 								AW_WRITE, AW_END);

表示用端末に、次のレコードが表示されます。4 はセマフォ ID です。


header,104,3,second signature requested,,Fri Mar 21 12:45:21 1997, + 339949000 msec

IPC,sem,65539

subject,zelda,zelda,staff,zelda,staff,420,286,0 0 phoenix

slabel,C

return,success,0