論理上、各トークンにはトークンタイプ識別子とそれに続くトークン固有のデータが付いています。各トークンタイプには固有の形式と構造があります。表 A-1 は現在のトークンを示しています。トークンのスキーマは拡張できます。
表 A-1 基本セキュリティモジュールの監査トークン
トークン名 |
記述 |
---|---|
acl |
アクセス制御リスト情報 |
arbitrary |
形式情報と型情報が付いたデータ |
arg |
システムコールの引数値 |
attr |
V ノードトークン |
exec_args |
Exec システムコールの引数 |
exec_env |
Exec システムコールの環境変数 |
exit |
プログラム終了情報 |
file |
監査ファイル情報 |
groups |
プロセスグループ情報 (使用しません) |
header |
レコードの始まりを示す |
in_addr |
インターネットアドレス |
ip |
IP ヘッダ情報 |
ipc |
System V IPC 情報 |
ipc_perm |
System V IPC オブジェクトトークン |
iport |
インターネットポートアドレス |
newgroups |
プロセスグループ情報 |
opaque |
構造化されていないデータ (形式が未指定) |
path |
パス情報 (パス) |
process |
プロセストークン情報 |
return |
システムコールの状態 |
seq |
シーケンス番号トークン |
socket |
ソケットのタイプとアドレス |
socket-inet |
ソケットのポートとアドレス |
subject |
サブジェクトトークン情報 (process トークンと同じ構造) |
text |
ASCII 文字列 |
trailer |
レコードの終わりを示す |
監査レコードには、必ず header トークンが入っています。header トークンは、監査トレール内で監査レコードの始まりを示します。ユーザの動作に帰因しないイベントからの監査レコードを除き、どの監査レコードにも subject トークンが入っています。ユーザに帰因するイベントの場合、この 2 つのトークンはイベントを引き起こしたプロセスの値を参照します。非同期イベントの場合、process トークンはシステムを参照します。
acl トークンは ACL に関する情報を記録するもので、 4 つの固定長フィールドからなります。このトークンが acl であることを示すトークン ID フィールド、ACL のタイプを表わすフィールド、ACL ID フィールド、およびこの ACL に関連したアクセス権を表わすフィールドです。形式は次のとおりです。
arbitrary トークンは、監査トレール用にデータをカプセル化します。このトークンは 4 つの固定長フィールドと 1 つのデータ配列からなっています。固定長フィールドは、このトークンを arbitrary トークンとして識別するトークン ID、推奨形式フィールド (16 進など)、カプセル化されるデータのサイズを指定するサイズフィールド (短い形式など)、後続の項目数を示すカウントフィールドの 4 つです。トークンの残りの部分は、指定された型の 1 つまたは複数の項目からなっています。arbitrary トークンは次のようになっています。
出力形式フィールドには、表 A-2 のような値を入れることができます。
表 A-2 arbitrary トークンの出力形式フィールドの値
値 |
動作 |
---|---|
AUP_BINARY |
日付が 2 進形式で出力される |
AUP_OCTAL |
日付が 8 進形式で出力される |
AUP_DECIMAL |
日付が 10 進形式で出力される |
AUP_HEX |
日付が 16 進形式で出力される |
AUP_STRING |
日付が文字列で出力される |
項目サイズフィールドには、表 A-3 のような値を入れることができます。
表 A-3 arbitrary トークンの項目サイズフィールドの値
値 |
動作 |
---|---|
AUR_BYTE |
データはバイト数単位 (1 バイト) |
AUR_SHORT |
データは短い形式の単位 (2 バイト) |
AUR_LONG |
データは長い形式の単位 (4 バイト) |
arg トークンには、システムコールの引数の数、引数の値、省略可能な記述テキスト文字列など、システムコールの引数情報が入っています。このトークンを使用すると、監査レコード内で 32 ビット整数のシステムコール引数を指定できます。arg トークンには 5 つのフィールドがあります。このトークンを arg トークンとして識別するトークン ID、システムコールにトークンの参照先となる引数を指示する引数 ID、引数の値、記述テキスト文字列の長さ、テキスト文字列の 5 つです。図 A-4 はトークンの形式を示しています。
attr トークンには、ファイル v ノードからの情報が入っています。このトークンには 7 つのフィールドがあります。このトークンを attr トークンとして識別するトークン ID、ファイルのアクセスモードとタイプ、所有者ユーザ ID、所有者グループ ID、ファイルシステム ID、i ノード ID、ファイルが表すデバイス ID の 7 つです。ファイルシステム ID とデバイス ID について詳しくは、statvfs(2) のマニュアルページを参照してください。一般に、このトークンには path トークンが付いており、パスの検索中に生成されます。パス検索エラーが発生すると、必要なファイル情報を取得するために利用できる v ノードがないので、このトークンは監査レコードの一部として組み込まれません。図 A-5 は、attr トークンの形式を示しています。
exec_args トークンは、exec システムコールへの引数を記録します。exec_args レコードには、2 つの固定長フィールドがあります。一方は、これを exec_args トークンとして識別するトークン ID フィールドです。他方は、exec コールに渡される引数の数を表すカウントフィールドです。トークンの残りの部分は、0 個以上の NULL で終わる文字列からなっています。図 A-6 は、exec_args トークンを示します。
exec_args トークンは、監査方針 argv が有効なときにのみ出力されます。詳しくは、「監査方針の設定」を参照してください。
exec_env トークンは、exec システムコールの現在の環境変数を記録します。exec_env レコードには 2 つの固定長フィールドがあります。一方は、これを exec_env トークンとして識別するトークン ID です。他方は、exec コールに渡される引数の数を表すカウントフィールドです。トークンの残りの部分は、0 個以上の NULL で終わる文字列からなっています。図 A-7 は、exec_env トークンを示しています。
exec_env トークンは、監査方針 arge が有効なときにのみ出力されます。詳しくは、「監査方針の設定」を参照してください。
exit トークンは、プログラムの終了状態を記録します。exit トークンには、プログラムの終了状態と戻り値が入っています。状態フィールドは exit システムコールに渡されるものと同じです。戻り値フィールドは、システムのエラー番号、または終了状態を詳細に記述する戻り値を示します。図 A-8 は、exit トークンを示しています。
file トークンは、新しい監査トレールファイルの始まりと無効になる古いファイルの終わりをマークするために、監査デーモンによって生成される特殊なトークンです。監査デーモンは、このトークンが入った特殊な監査レコードを構築して、連続する監査ファイルを 1 つの監査トレールに「リンク」します。file トークンには 4 つのフィールドがあります。第 1 はこれを file トークンとして識別するトークン ID、第 2 はファイルが作成されるかクローズされた時刻を示す日時のスタンプ、第 3 は NULL で終わる文字列を含むファイル名のバイト数、第 4 は NULL で終わる名前が入ったフィールドです。 図 A-9 は file トークンを示しています。
このトークンは、newgroups トークンに置き換えられています。newgroups トークンは同じタイプの情報をわずかな領域で提供します。ここでは完全を期すために groups トークンについて説明しますが、アプリケーション設計者は newgroups トークンを使用する必要があります。ASCII 形式の出力が表示されるときには、どちらのトークン ID にも groups というラベルが付いているため、praudit はこの 2 つのトークンを区別しないので注意してください。
groups トークンは、プロセスの資格からグループのエントリを記録します。groups トークンには 2 つの固定長フィールドがあります。一方は、これを groups トークンとして識別するトークン ID で、他方はこの監査レコードに入っているグループの数を表すカウントです。図 A-10 は groups トークンを示しています。
groups トークンは、監査方針 group が有効なときにのみ出力されます。詳しくは、「auditconfig コマンド」を参照してください。
header トークンは、監査レコードの始まりをマークし、trailer トークンとの組み合わせでレコード内の他のすべてのトークンを囲むという点で特殊です。header トークンには 6 つのフィールドがあります。これを header トークンとして識別するトークン ID フィールド、ヘッダとトレーラを含めた監査レコードの長さ合計を示すバイト数、監査レコード構造のバージョンを識別するバージョン番号、レコードが表す監査イベントのタイプを識別する監査イベント ID、イベントのタイプに関する補助記述情報が入ったイベント ID 修飾子、レコードの作成日時の 6 つです。図 A-11 は header トークンを示しています。
イベント修飾子フィールドでは、次のフラグが定義されています。
0x4000 PAD_NOTATTR nonattributable event 0x8000 PAD_FAILURE fail audit event
Solaris 7 リリースでは、header トークンを、32 ビットタイムスタンプではなく 64 ビットタイムスタンプで表示できます。
in_addr トークンには、インターネットアドレスが入っています。この 4 バイト値はインターネットプロトコルアドレスです。このトークンには 2 つのフィールドがあります。一方はこのトークンを in_addr トークンとして識別するトークン ID で、他方はインターネットアドレスです。図 A-12 は in_addr トークンを示しています。
Solaris 8 リリースでは、インターネットアドレスは、4 バイトを使用し、IPv4 アドレスとして表示できます。または、型に 16 バイト、アドレスに 16 バイトを使用すれば、IPv6 アドレスとして表示できます。
ip トークンには、インターネットプロトコルのヘッダのコピーが入っていますが、IP オプションは含まれていません。IP オプションは、トークン内の IP ヘッダ数を増やせば追加できます。このトークンには 2 つのフィールドがあります。一方はこれを ip トークンとして識別するトークン ID で、他方は IP ヘッダ (すべて 20 バイト) のコピーです。IP ヘッダ構造は、/usr/include/netinet/ip.h 内で定義されています。図 A-13 は ip トークンを示しています。
ipc トークンには、呼び出し元で特定の IPC オブジェクトを識別するための System V IPC メッセージ/セマフォ/共有メモリハンドルが入っています。このトークンには 3 つのフィールドがあります。第 1 はこれを ipc トークンとして識別するトークン ID、第 2 は IPC オブジェクトのタイプを指定するタイプフィールド、第 3 は IPC オブジェクトを識別するハンドルです。図 A-14 は ipc トークンを示しています。
IPC オブジェクト識別子は Solaris CMW 監査トークンのコンテキストに依存しない性質に違反しています。IPC オブジェクトを一意に識別するグローバルな「名前」はありません。代わりに、IPC オブジェクトが使用可能な間だけ有効なハンドルで識別されます。System V の IPC メカニズムはあまり使用されず、すべてが同じ監査クラスを共有するので、識別は問題ではないはずです。
IPC オブジェクトタイプフィールドには、表 A-4 のような値が入っています。値は /usr/include/bsm/audit.h 内で定義されます。
表 A-4 IPC オブジェクトタイプフィールド
名前 |
値 |
記述 |
---|---|---|
AU_IPC_MSG |
1 |
IPC メッセージオブジェクト |
AU_IPC_SEM |
2 |
IPC セマフォオブジェクト |
AU_IPC_SHM |
3 |
IPC 共有メモリオブジェクト |
ipc_perm トークンには、System V の IPC アクセス情報が入っています。このトークンは、共有メモリ、セマフォ、メッセージの IPC イベントによって生成された監査レコードに追加されます。このトークンには 8 つのフィールドがあります。具体的には、このトークンを ipc_perm トークンとして識別するトークン ID、IPC 所有者のユーザ ID、IPC 所有者のグループ ID、IPC 作成者のユーザ ID、IPC 作成者のグループ ID、IPC のアクセスモード、IPC のシーケンス番号、IPC キー値の 8 つです。値は、IPC オブジェクトに関連付けられた ipc_perm 構造から取り出されます。図 A-15 は ipc_perm トークンの形式を示しています。
iport トークンには、TCP (または UDP) ポートアドレスが入っています。このトークンには 2 つのフィールドがあります。一方はこれを iport トークンとして識別するトークン ID で、他方は TCP/UDP ポートアドレスです。図 A-16 は iport トークンを示しています。
このトークンは、groups トークンに代わるものです。ASCII 出力が表示されるときには、どちらのトークン ID にも groups というラベルが付いているため、praudit はこの 2 つのトークンを区別しないので注意してください。
newgroups トークンは、プロセスの資格からグループエントリを記録します。newgroups トークンには 2 つの固定長フィールドがあります。一方はこれを newgroups トークンとして識別するトークン ID で、他方はこの監査レコードに入っているグループの数を表すカウントです。このトークンの残りの部分は 0 個以上のグループエントリからなっています。図 A-17 は newgroups トークンを示しています。
newgroups トークンは、監査方針 group が有効なときにのみ出力されます。詳しくは、「auditconfig コマンド」を参照してください。
opaque トークンには、フォーマットされていないデータが一連のバイトとして入っています。このトークンには 3 つのフィールドがあります。これを opaque トークンとして識別するトークン ID、データ量を表すバイト数、バイトデータの配列の 3 つです。図 A-18 は、opaque トークンを示しています。
path トークンには、オブジェクトのアクセスパス情報が入っています。このトークンには、トークン ID の他にシステムの実ルートに基づくオブジェクトへの絶対パスが入っています。パスは、パス長を示すバイト数とパスからなっています。図 A-19 は path トークンを示しています。
process トークンには、信号の受信側など、プロセスをオブジェクトとして記述する情報が入っています。このトークンには 9 つのフィールドがあります。このトークンを process トークンとして識別するトークン ID、不変の (invariant) 監査 ID、実効ユーザ ID、実効グループ ID、実ユーザ ID、実グループ ID、プロセス ID、監査セッション ID、端末 ID の 9 つです。図 A-20 は process トークンを示しています。
監査 ID、ユーザ ID、グループ ID、プロセス ID、セッション ID は、短い形式ではなく長い形式です。
セッション ID、実ユーザ ID、または実グループ ID に process トークンのフィールドを使用できないことがあります。その場合、エントリは -1 に設定されます。
Solaris 7 リリースでは、process トークンを、32 ビットの値ではなく 64 ビットのデバイス ID で表示できます。
Solaris 8 リリースでは、端末 ID は、フォーマットを変更し、デバイスに 4 バイトまたは 8 バイト、型に 16 バイト、およびアドレスに 16 バイト使用して、IPv6 アドレスを表示できます。
return トークンには、システムコールの戻り状態 (u_error) とプロセスの戻り値 (u_rval1) が入っています。このトークンには 3 つのフィールドがあります。第 1 はこのトークンを return トークンとして識別するトークン ID、第 2 はシステムコールのエラー状態、第 3 はシステムコールの戻り値です。このトークンは、必ずシステムコールに関してカーネルによって生成される監査レコードの一部として返されます。このトークンは、アプリケーションを監査中の終了状態と他の戻り値を示します。図 A-21 は return トークンを示しています。
seq トークン (シーケンストークン) は、昇順のシーケンス番号が入った省略可能なトークンです。このトークンはデバッグ用です。AUDIT_SEQ 方針が有効になっているときは、各監査レコードにこのトークンが追加されます。seq トークンには 2 つのフィールドがあります。一方はこのトークンを seq トークンとして識別するトークン ID で、他方はシーケンス番号が入った 32 ビットの無符号長形式フィールドです。シーケンス番号は、監査レコードが生成されて監査レコードに組み込まれるたびに 1 ずつ増やされます。図 A-22 は、seq トークンを示しています。
socket トークンには、インターネットソケットを記述する情報が入っています。socket トークンには 6 つのフィールドがあります。つまり、このトークンを socket トークンとして識別するトークン ID、参照されるソケットのタイプ (TCP/UDP/UNIX) を示すソケットタイプフィールド、ローカルポートアドレス、ローカルインターネットアドレス、リモートポートアドレス、リモートインターネットアドレスです。図 A-23 は、socket トークンを示しています。
Solaris 8 リリースでは、インターネットアドレスは、4 バイトを使用して IPv4 アドレスとして表示できます。または、型に 16 バイト、アドレスに 16 バイトを使用すれば、IPv6 アドレスとして表示できます。
socket-inet トークンは、ローカルポートへのソケット接続を記述します。これは、インターネットの名前空間内でソケット情報を表すために使用されます。socket-inet トークンには 4 つのフィールドがあります。つまり、このトークンを socket-inet トークンとして識別するトークン ID、インターネットファミリ (AF_INET、AF_OSI など) を示すソケットファミリフィールド、ローカルポートのアドレス、ソケットのアドレスです。図 A-24 は socket-inet トークンを示しています。
subject トークンは、サブジェクト (プロセス) を記述します。構造は process トークンと同じです。このトークンには 9 つのフィールドがあります。つまり、これを subject トークンとして識別する ID、不変の監査 ID、実効ユーザ ID、実効グループ ID、実ユーザ ID、実グループ ID、プロセス ID、監査セッション ID、端末 ID です。このトークンは、必ずシステムコールに関してカーネルによって生成される監査レコードの一部として返されます。図 A-25 は subject トークンを示しています。
監査 ID、ユーザ ID、グループ ID、プロセス ID、セッション ID は、短い形式ではなく長い形式です。
セッション ID、実ユーザ ID、または実グループ ID に subject トークンのフィールドを使用できないことがあります。その場合、エントリは -1 に設定されます。
Solaris 7 リリースでは、subject トークンを、32 ビットの値ではなく 64 ビットのデバイス ID で表示できます。
Solaris 8 リリースでは、端末 ID は、フォーマットを変更し、デバイスに 4 バイトまたは 8 バイト、型に 16 バイト、およびアドレスに 16 バイト使用して、IPv6 アドレスを表示できます。
text トークンにはテキスト文字列が入っています。このトークンには 3 つのフィールドがあります。つまり、このトークンを text トークンとして識別するトークン ID、テキスト文字列の長さ、テキスト文字列そのものです。図 A-26 は text トークンを示しています。
header 、 trailer という 2 つのトークンは、監査レコードの終端を区別し、他のすべてのトークンを囲むという点で特殊です。trailer トークンは監査レコードを終了させます。これは省略可能なトークンであり、AUDIT_TRAIL 監査方針が設定されているときにのみ、各レコードの最後のトークンとして追加されます。
trailer トークンは、監査レコードの終端をマークするという点で特殊です。 trailer トークンは header トークンとの組み合わせによって監査レコードを区切ります。また、trailer トークンを使用すると監査トレールを逆方向に検索できます。trailer トークンには、3 つのフィールドがあります。つまり、このトークンを trailer トークンとして識別するトークン ID、レコードの終わりをマークしやすくするパッド番号、header トークンと trailer トークンを含めた監査レコード内の合計文字数です。図 A-27 は trailer トークンを示しています。
監査トレール分析ソフトウェアによって、各レコードに header と trailer の両方が入ることが保証されます。ファイルシステムがいっぱいのときなど、書き込みエラーが発生すると、監査レコードが不完全になって切り捨てられることがあります。auditsvc は監査トレールへのデータ書き込みを受け持つシステムコールであり、完全な監査レコードを取り出そうとします。auditsvc(2) のマニュアルページを参照してください。ファイルシステムの領域が足りなくなると、コールは現在の監査レコードを解放せずに終了します。コールが再開するときには、切り捨てたレコードを反復できます。