SunSHIELD 基本セキュリティモジュール

第 3 章 監査トレールの分析

この章で説明するツールを使用すると、監査ファイルを管理して報告するシェルスクリプトを開発し、それを定期的に実行できます。一般的に監査管理作業には、ファイルを圧縮したり、複数の監査ファイルを組み合わせて 1 つにまとめたり、ファイルを分散システム内でディスク上のさまざまな位置に移動したり、古いファイルをテープに保存することなどが含まれます。また、スクリプトを使用して記憶領域の使用状況を監視できますが、その一部は監査デーモンによって自動的に実行されます。

もう 1 つの監査作業は、すべての監査ファイルを論理的に組み合わせた監査トレー ルを検査することです。監査ツールを使用すると、監査データファイル内の特定の情報を対話形式で照会できます。

監査機能

Solaris BSM には、監査レコードを理解できるように次の機能が組み込まれています。

各監査レコードには、イベントを生成したユーザを識別する監査 ID が入っているため、完全パス名も記録されるので、監査トレール全体を見直さなくても、個々の監査レコードを調べて有用な情報を得ることができます。

監査ユーザ ID

Solaris BSM のプロセスには、標準 Solaris リリースのプロセスには関連付けられない、別のユーザ識別属性、つまり監査 ID が付いています。プロセスはログイン時に監査 ID を取得し、この監査 ID はすべての子プロセスに継承されます。

監査セッション ID

Solaris BSM のプロセスには、ログイン時に監査セッション ID が割り当てられます。この ID は、すべての子プロセスに継承されます。

それ自身で意味のわかる監査レコード

Solaris BSM の監査レコードにはイベントに関連するすべての情報が入っているため、他の監査レコードを参照しなくても発生したイベントを理解できます。たとえば、ファイルイベントを記述する監査レコードには、そのファイルに関してルートディレクトリから始まる完全パス名と、オープンまたはクローズした日時を表すスタンプが入っています。

監査レコードのマージ、選択、表示、および変換に使用するツール

Solaris BSM には、監査レコードのマージ、選択、表示、および変換に使用できるように 2 つのツールが組み込まれています。これらのツールを直接使用するか、サードパーティのアプリケーションプログラムと併用できます。

この後の各節は、監査レコードの形式で、 prauditauditreduce コマンドの詳細、ツールを使うためのヒントと手順について説明します。

監査レコードの形式

Solaris BSMの 監査レコードは、一連の監査トークンからなっており、各トークンでシステムの属性が記述されます。

各監査トークンについての詳細は付録 A 「監査レコードの説明」 を参照してください。この付録には、Solaris BSM の監査機能によって生成される全監査レコードのリストも掲載されます。リストはアルファベット順にソートされていて、相互参照一覧ではイベント名とその説明箇所が示されています。

2 進形式

監査レコードは 2 進形式で格納され処理されますが、さまざまなマシン間での互換性を保つために、データのバイトオーダーとサイズはあらかじめ決められています。

監査イベントのタイプ

システム内の各監査対象イベントによって、特定のタイプの監査レコードが生成されます。各イベントの監査レコードには、そのイベントを記述する特定のトークンが入っています。監査レコードには、イベントが属する監査イベントクラスは記述されません。そのマッピングは外部テーブル、/etc/security/audit_event ファイルによって指定されます。

監査トークンのタイプ

各トークンは 1 バイトのトークンタイプから始まり、タイプ別に決められた順序で 1 つまたは複数のデータ要素が続いています。監査レコードの種類は、そのレコード内のイベントタイプと各種トークンセットによって区別されます。 text トークンのようにデータ要素が 1 つしか入っていないトークンと、process トークンのように複数の要素 (監査ユーザ ID、実ユーザ ID、実効ユーザ ID など) が入っているトークンがあります。

監査トークンの順序

各監査レコードは、header トークンで始まって、trailer トークン (省略可能) で終わります。ヘッダとトレーラの間にある 1 つまたは複数のトークンでイベントが記述されます。ユーザレベルのイベントとカーネルイベントの場合は、トークンでそのイベントを実行したプロセス、実行対象となったオブジェクト、所有者やモードなどのオブジェクトのトークンが記述されます。

一般に、それぞれのユーザレベルイベントとカーネルイベントには、少なくとも次のトークンが付いています。

trailer トークンは多くのイベントに含まれていますが、省略可能です。

ユーザが読める監査レコード書式

この節では、各監査レコードの書式を praudit コマンドで生成される出力どおりに示し、各監査トークンについて簡単に説明します。各トークン内のフィールドについての詳細は付録 A 「監査レコードの説明」 を参照してください。

次のトークンの例は、デフォルトで praudit によって生成される書式を示しています。また、各例は raw(-r) オプションと短縮 (-s) オプションを指定することが前提となっています。praudit によって監査トークンが表示されるときは、まずトークンタイプ、次にそのトークンからのデータが表示されます。ただし、フィールド (パス名など) にコンマが入っている場合は、それとフィールド区切りのコンマとを区別できません。別のフィールド区切り記号を使用しないと、出力にコンマが含まれることになります。デフォルトでは、トークンタイプは header のように名前として表示されるか、または 10 進数として -r 形式で表示されます。

各トークンを次の順序で説明します。

header トークン

すべての監査レコードは header トークンで始まります。headerトークンは、すべての監査レコードに共通の情報を示します。次のフィールドが入っています。

header トークンが praudit によってデフォルト形式で表示されるときは、次の ioctl からの例のようになります。


header,240,1,ioctl(2),es,Tue Sept  1 16:11:44 1992, + 270000 msec

praudit -s を使用すると 、 イベント記述 (ioctl(2)) は、次のようにイベント名 (AUE_IOCTL) に置き換えられます。


header,240,1,AUE_IOCTL,es,Tue Sept 1 16:11:44 1992, + 270000 msec

praudit -r を使用すると、すべてのフィールドが数値として表示されます (10 進数、8 進数、または 16 進数)。この場合、158 はこのイベントのイベント番号です。


20,240,1,158,0003,699754304, + 270000 msec

praudit では時刻がミリ秒単位で表示されるので注意してください。

trailer トークン

このトークンは監査レコードの終わりを示し、監査トレールを逆方向から検索できるようにします。次のフィールドがあります。

praudit により、trailer トークンは次のように表示されます。


trailer,136

arbitrary トークン

このトークンは、監査トレールのデータをカプセル化します。項目の配列には多くの項目が含まれることがあります。次のフィールドがあります。

praudit により、arbitrary トークンは次のように表示されます。

arbitrary,decimal,int,1
42
 

arg トークン

このトークンには、システムコールの引数情報が入っています。監査レコード内では、32 ビット整数によるシステムコール引数を使用できます。次のフィールドがあります。

praudit により、arg トークンは次のように表示されます。


argument,1,0x00000000,addr

attr トークン

一般に、attrトークンはパスの検索中に生成され、path トークンが添付されていますが、パス検索エラーのイベントには含まれません。次のフィールドがあります。

praudit により、attr トークンは次のように表示されます。


attribute,100555,root,staff,1805,13871,-4288

exit トークン

exitトークンには、プログラムの終了状態が記録されます。 次のフィールドがあります。

praudit により、exit トークンは次のように表示されます。


exit,Error 0,0

file トークン

このトークンは監査デーモンによって生成され、古いファイルが有効でなくなると、新しい監査トレールファイルの始めと古いファイルの終わりを示します。このトークンが入っている監査レコードは、連続する監査ファイルをまとめてリンクし、1 つの監査トレールにまとめます。次のフィールドがあります。

praudit により、file トークンは次のように表示されます。

file,Tue Sep  1 13:32:42 1992, + 79249 msec,
	/baudit/localhost/files/19920901202558.19920901203241.quisp

groups トークン

groupsトークンは、プロセスの資格からグループエントリを記録します。次のフィールドがあります。

praudit により、groups トークンは次のように表示されます。


group,staff,wheel,daemon,kmem,bin,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

in_addr トークン

in_addrトークンは、マシンのインターネットプロトコルアドレスを示します。次のフィールドがあります。

praudit により、in_addr トークンは次のように表示されます。


ip addr,129.150.113.7

ip トークン

ip トークンには、インターネットプロトコルヘッダのコピーが入っています。次のフィールドがあります。

praudit により、ip トークンは次のように表示されます。


ip address,0.0.0.0

ipc トークン

このトークンには、特定の IPC オブジェクトを識別するために呼び出し元に使用される System V IPC メッセージ/セマフォ/共有メモリハンドルが入っています。次のフィールドがあります。

praudit により ipc トークンは次のように表示されます。


IPC,msg,3

ipc_perm トークン

ipc_perm トークンには、System V IPC アクセス情報のコピーが入っています。共有メモリ、セマフォ、メッセージ IPC の監査レコードには、このトークンが追加されます。次のフィールドがあります。

praudit により ipc_perm トークンは次のように表示されます。


IPC perm,root,wheel,root,wheel,0,0,0x00000000

iport トークン

このトークンには、TCP (または UDP) アドレスが入っています。次のフィールドがあります。

praudit により iport トークンは次のように表示されます。


ip port,0xf6d6

opaque トークン

opaqueトークンには、書式化されていないデータが一連のバイトとして入っています。次のフィールドがあります。

praudit により opaque トークンは次のように表示されます。


opaque,12,0x4f5041515545204441544100

path トークン

path トークンには、オブジェクトに関するアクセスパス情報が入っています。次のフィールドがあります。

praudit により path トークンは次のように表示されます。


path,/an/anchored/path/name/to/test/auditwrite/AW_PATH

process トークン

process トークンには、プロセスを記述する情報が入っています。次のフィールドがあります。

praudit により、process トークンは次のように表示されます。


process,root,root,wheel,root,wheel,0,0,0,0.0.0.0

return トークン

returnトークンは、システムコールの戻り状態とプロセスの戻り値を示します。このトークンは、常にシステムコールに関してカーネルで生成される監査レコードの一部として返されます。次のフィールドがあります。

praudit により、return トークンは次のように表示されます。


return,success,0

seq トークン

このトークンは省略可能で、デバッグに使用される昇順のシーケンス番号が入っています。seq ポリシーがアクティブになっているときは、このトークンが各監査レコードに追加されます。次のフィールドがあります。

praudit により、seq トークンは次のように表示されます。


sequence,1292

socket トークン

socketトークンはインターネットソケットを記述します。次のフィールドがあります。

praudit により、socket トークンは次のように表示されます。


socket,0x0000,0x0000,0.0.0.0,0x0000,0.0.0.0

subject トークン

このトークンはサブジェクト (プロセス) を記述します。次のフィールドがあります。

praudit により、subject トークンは次のように表示されます。


subject,cjc,cjc,staff,cjc,staff,424,223,0 0 quisp

text トークン

text トークンにはテキスト文字列が入っています。次のフィールドがあります。

praudit により、text トークンは次のように表示されます。


text,aw_test_token

auditreduce コマンドの使用方法

auditreduce コマンドを実行すると、1 つまたは複数の入力監査ファイルから監査レコードがマージされます。通常は、分散システム全体のすべての監査トレールファイルがマウントされているマシンから、このコマンドを入力することになります。

オプションを指定せずに auditreduce を実行すると、監査される全体 (監査ディレクトリ /etc/security/audit 内のすべてのサブディレクトリ内のすべての監査ファイル) がマージされ、そのマージされたファイルが標準出力に送られます。

praudit コマンドを実行すると、各レコードはユーザが読める形式に変換されます。詳細は praudit の使用方法」を参照してください。

auditreduce コマンドのオプションには、次のような機能があります。

分散システムで auditreduce を役立てる方法

Solaris BSM を実行する複数のマシンが分散システムの一部として管理される場合に は、各マシンが監査対象のイベントを実行し、監査レコードをマシン固有の専用監査ファイルに書き込みます。このため、ソフトウェアが単純化され、マシンの障害が発生した場合の信頼性が高まります。

auditreduce コマンドによって、監査トレール全体の管理作業を効率化できます。auditreduce (または、より高いインタフェースを提供するために独自に作成したシェルスクリプト) を使用すると、レコードの生成方法や格納場所に関係なく、システム内のすべてのファイルの論理上の組み合わせを 1 つの監査トレールとして読むことができます。

auditreduce プログラムは、監査デーモンによって生成された監査トレールを処理します。1 つまたは複数の監査ファイルからレコードが選択され、マージされて、1 つの時系列順のファイルが生成されます。auditreduce のマージ機能と選択機能は論理的に他に依存しません。auditreduce はレコードが読み取られると、入力ファイルがマージされてディスクに書き込まれる前に、そこからメッセージを選択します。auditreduce(1M)のマニュアルページを参照してください。

auditreduce の使用方法

この節では、データを分析して管理するための auditreduce の一般的な使用方法について説明します。

監査ログ全体を表示する方法

監査トレール全体を一度に表示するには、auditreduce の出力を praudit にパイプします。


# auditreduce | praudit

監査ログ全体を印刷する方法

lp にパイプすると、出力はプリンタに送られます。


# auditreduce | praudit | lp

選択したデータに関するユーザの動作を表示する方法

次の例で、システム管理者は lo メッセージクラスを要求して、ユーザ fred が 1990 年 4 月 13 日にログインしてログアウトした時刻を調べます。短い日付の書式は yymmdd です (長い形式については、auditreduce(1M) のマニュアルページを参照)。


# auditreduce -d 900413 -u fred -c lo | praudit

ログイン/ログアウトメッセージを 1 つのファイルにコピーする方法

次の例では、特定の日付に関するログイン/ログアウトメッセージが 1 つのファイルに集計されます。ターゲットファイルは、通常の監査ルート以外のディレクトリに書き込まれます。


# auditreduce -c lo -d 870413 -O /usr/audit_summary/logins 

-O オプションを使用すると、開始時刻と終了時刻を示す 14 文字のタイムスタンプと接尾辞 logins が付いた監査ファイルが作成されます。


/usr/audit_summary/19870413000000.19870413235959.logins

not_terminated 監査ファイルを整理する方法

監査ファイルが開いているうちに監査デーモンが停止したり、サーバがアクセスできなくなってマシンが新しいサーバに強制的に切り替えたりすると、監査ファイルが監査レコードに使用されなくなっても、そのファイルが残り、ファイル名に含まれる終了時刻に文字列 not_terminated が付いたままになることがあります。この種のファイルが検出された場合は、ファイルが使用されていないことを手作業で検査し、正しいオプションを使用してファイル名を指定して整理するとよいでしょう。


# auditreduce -O machine 19870413120429.not_terminated.machine

このコマンドを実行すると、正しい名前 (両方のタイムスタンプ) と正しい接尾辞 (明示的に指定された machine) が付いた新しい監査ファイルが作成され、すべてのメッセージがそのファイルにコピーされます。

その他の有用な auditreduce オプション

auditreduce には他にも多数のオプションがあり、マニュアルページに掲載されています。大文字のオプションを使用すると files に対する処理またはパラメータが選択され、小文字のオプションを使用すると records に対するパラメータが選択されるので注意してください。この項では、2 つの便利なオプションの使用方法について説明します。

date-time オプション -b-a を使用すると、特定の日時よりも前または後のレコードを指定できます。1 日は yyyymmdd00:00:00 から始まって yyyymmdd23:59:59 に終わります。日付に関するパラメータは年、月、日、時、分、秒の 6 つです。

-a を指定しなければ、auditreduce はデフォルトの 1970 年 1 月 1 日 00:00:00 となります。 -b を指定しなければ、 auditreduce はデフォルトの現在の日時 (GMT) となります。「ログイン/ログアウトメッセージを 1 つのファイルにコピーする方法」を参照してください。

次のように日付を指定して auditreduce -a コマンドを実行すると、1991 年 7 月 15 日の午後 12 時以降に作成されたすべての監査レコードが praudit に出力されます。


# auditreduce -a 91071500:00:00 | praudit 

上記と同じ日付を指定して auditreduce -b コマンドを実行すると、1991 年 7 月 15 日の午後 12 時以前に作成されたすべての監査レコードが praudit に出力されます。


# auditreduce -b 91071500:00:00 | praudit 

auditreduce のメッセージタイプ選択 (-m オプション) では、数値メッセージ識別子または AUE_xxxxx コードを指定できます。間違った書式を指定すると auditreduce に拒否されますが、正しい書式は表示されません。

praudit の使用方法

prauditコマンドは、標準入力から監査レコードを読み取り、ユーザが読める書式で標準出力に表示します。一般に、入力は auditreduce からパイプされるか、または 1 つの監査ファイルです。また、cat を使用して入力を生成して複数のファイルを連結したり、現在の監査ファイルに tail を使用することもできます。

praudit を使用すると、デフォルト形式、短い形式 (-s オプション)、raw 形式 (-r オプション) という 3 つの形式で出力を生成できます。デフォルトでは、出力は 1 行に 1 つずつトークンが入る形式で生成されます。 -l オプションでは、各行にレコード全体が入るように要求します。-d オプションでは、トークンフィールド間に使用される区切り記号を変更し、-l も指定すればトークン間に使用される区切り記号も変更されます。

-s 形式では、タイプはイベントの監査イベントテーブル名 (AUE_IOCTL など) で -r 形式ではイベント番号 (この場合は 158) です。 これは、-s とデフォルト形式の唯一の違いです。-r 形式では、すべての数値 (ユーザ ID、グループ ID など) は数値で表示されます (10 進形式、ただしインターネットアドレスの場合は 16 進形式、モードの場合は 8 進形式)。次の例は、header トークンに関する praudit からの出力を示しています。


header,240,1,ioctl(2),es,Tue Sept  1 16:11:44 1992, + 270000 msec

次の例は、同じ header トークンに関する praudit -r からの出力を示しています。


20,240,1,158,0003,699754304, + 270000 msec

auditreduce では実行できない選択を行う場合など、出力をテキスト行として処理する方が便利な場合があります。praudit の出力は単純なシェルスクリプトで処理できます。次の例は praudit_grep というスクリプトです。

#!/bin/sh
praudit | sed -e '1,2d' -e '$s/^file.*$//' -e 's/^header/^aheader/' ¥¥
| tr '¥¥012¥¥001' '¥¥002¥¥012' ¥¥
| grep "$1" ¥¥
| tr '¥¥002' '¥¥012'

このスクリプト例は、header トークンに接頭辞として Ctrl-A を付けて示します。^a は ^ と a という 2 つの文字ではなく Ctrl-A を示すので注意してください。接頭辞は、header トークンをテキストとして表示される文字列 header と区別するために必要です。このスクリプトは、改行を Ctrl-A として残したままでレコードのすべてのトークンを組み合わせて 1 行にまとめ、grep を実行し、元の改行を復元します。

praudit のデフォルトの出力形式では、各レコードを header トークンで始まって trailer トークンで終わる一連のトークン (1 行に 1 つずつ) として常に明確に識別できるので注意してください。 したがって、各レコードを簡単に識別し、awk などを使用して処理できます。