この章で説明するツールを使用すると、監査ファイルを管理して報告するシェルスクリプトを開発し、それを定期的に実行できます。一般的に監査管理作業には、ファイルを圧縮したり、複数の監査ファイルを組み合せて 1 つにまとめたり、ファイルを分散システム内でディスク上のさまざまな位置に移動したり、古いファイルをテープに保存することなどが含まれます。また、スクリプトを使用して記憶領域の使用状況を監視できますが、その一部は監査デーモンによって自動的に実行されます。
もう 1 つの監査作業は、すべての監査ファイルを論理的に組み合せた監査トレー ルを検査することです。監査ツールを使用すると、監査データファイル内の特定の情報を対話形式で照会できます。
Solaris BSM には、監査レコードを理解できるように次の機能が組み込まれています 。
ユーザのプロセスに割り当てられた監査 ID は、ユーザ ID が変更されても変わりません。
各セッションは監査セッション ID を持ちます。
監査レコードに完全パス名が記録されます。
各監査レコードには、イベントを生成したユーザを識別する監査 ID が入っているため、完全パス名も記録されるので、監査トレール全体を見直さなくても、個々の監査レコードを調べて有用な情報を得ることができます。
Solaris BSM のプロセスには、標準 Solaris リリースのプロセスには関連付けられない、別のユーザ識別属性、つまり監査 ID が付いています。プロセスはログイン時に監査 ID を取得し、この監査 ID はすべての子プロセスに継承されます。
Solaris BSM のプロセスには、ログイン時に監査セッション ID が割り当てられます 。この ID は、すべての子プロセスに継承されます。
Solaris BSM の監査レコードにはイベントに関連するすべての情報が入っているため、他の監査レコードを参照しなくても発生したイベントを理解できます。たとえば、ファイルイベントを記述する監査レコードには、そのファイルに関してルートディレクトリから始まる完全パス名と、オープンまたはクローズした日時を表すスタンプが入っています。
Solaris BSM には、監査レコードのマージ、選択、表示、変換に使用できるように 2 つのツールが組み込まれています。これらのツールを直接使用するか、サードパーティのアプリケーションプログラムと併用できます。
auditreduce コマンドを使用すると、検証したい レコードのセットを選択できます。たとえば、過去 24 時間分のすべてのレコードを選択して日次レポートを生成したり、特定のユーザによって生成されたすべてのレコードを選択して、そのユーザによる動作を検証できます。さらに、特定のイベントタイプによるすべてのレコードを選択して、そのタイプの発生頻度を調べることもできます。
praudit コマンドを使用すると、監査レコードを対話形式で表示し、基本的なレポートを作成できます。praudit は、通常ユーザが読めない形式のレコードを、ユーザが読めるいくつかの形式のいずれかで表示します。praudit からの出力を (sed や awk などを使用して) 後処理するか、または 2 進の監査レコードを変換して処理するプログラムを作成して、さらに複雑な内容を表示したりレポートに作成したりできます。
この後の各節は、監査レコードの形式で、 praudit、 auditreduce コマンドの詳細、ツールを使うためのヒントと手順について説明します。
Solaris BSMの 監査レコードは、一連の監査トークンからなっており、各トークンでシステムの属性が記述されます。
各監査トークンについての詳細は 付録 A 「監査レコードの説明」 を参照してください。この付録には、Solaris BSM の監査機能によって生成される全監査レコードのリストも掲載されます。定義は短い説明の順にソートされていて、相互参照一覧ではイベント名とその説明箇所が示されています。
監査レコードは 2 進形式で格納され処理されますが、さまざまなマシン間での互 換性を保つために、データのバイトオーダーとサイズはあらかじめ決められています。
システム内の各監査対象イベントによって、特定のタイプの監査レコードが生成されます。各イベントの監査レコードには、そのイベントを記述する特定のトークンが入っています。監査レコードには、イベントが属する監査イベントクラスは記述されません。そのマッピングは外部テーブル、/etc/security/audit_event ファイルによって指定されます。
各トークンは 1 バイトのトークンタイプから始まり、タイプ別に決められた順序 で 1 つまたは複数のデータ要素が続いています。監査レコードの種類は、そのレコード内のイベントタイプと各種トークンセットによって区別されます。 text トークンのようにデータ要素が 1 つしか入っていないトークンと、process トークンのように複数の要素 (監査ユーザ ID、実ユーザ ID、実効ユーザ ID など) が入っているトークンがあります。
各監査レコードは、header トークンで始まって、trailer トークン (省略可能) で終わります。ヘッダとトレーラの間にある 1 つまたは複数のトークンでイベントが記述されます。ユーザレベルのイベントとカーネルイベントの場合は、トークンでそのイベントを実行したプロセス、実行対象となったオブジェクト、所有者やモードなどのオブジェクトのトークンが記述されます。
一般に、それぞれのユーザレベルイベントとカーネルイベントには、少なくとも次のトークンが付いています。
header
subject
return
trailer トークンは多くのイベントに含まれていますが、それは省略可能です。
この節では、各監査レコードの書式を praudit コマンドで生成される出力どおりに示し、各監査トークンについて簡単に説明します。各トークン内のフィールドについての詳細は付録 A 「監査レコードの説明」 を参照してください。
次のトークンの例は、デフォルトで praudit によって生成される書式を示しています。また、各例は raw(-r) オプションと短縮 (-s) オプションを指定することが前提となっています。praudit によって監査トークンが表示されるときは、まずトークンタイプ、次にそのトークンからのデータが表示されます。ただし、フィールド (パス名など) にカンマが入っている場合は、それとフィールド区切りのカンマとを区別できません。別のフィールド区切り記号を使用しないと、出力にカンマが含まれることになります。デフォルトでは、トークンタイプは header のように名前として表示されるか、または 10 進数として -r 形式で表示されます。
各トークンを次の順序で説明します。
すべての監査レコードは header トークンで始まります。headerトークンは、すべての監査レコードに共通の情報を示します。次のフィールドが入っています。
トークン ID
header トークンと trailer トークンを含めたバイト単位のレコード長
監査レコード構造体のバージョン番号
監査イベントのタイプを識別するイベント ID
イベントタイプに関する記述情報が付いたイベント ID 修飾子
レコードの作成日時
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 では時刻がミリ秒単位で表示されるので注意してください。
このトークンは監査レコードの終りを示し、監査トレールを逆方向から検索できるようにします。次のフィールドがあります。
トークン ID
レコードの終わりを示すパッド番号 (表示されない)
header トークンと trailer トークンを含めた監査レコードの合計文字数
praudit により、trailer トークンは次のように表示されます。
trailer,136 |
このトークンは、監査トレールのデータをカプセル化します。項目の配列には多くの項目が含まれることがあります。次のフィールドがあります。
トークン ID
10 進などの推奨形式
int など、カプセル化されたデータのサイズ
データ配列の項目数
項目の配列
praudit により、arbitrary トークンは次のように表示されます。
arbitrary,decimal,int,1 42
このトークンには、システムコールの引数情報が入っています。監査レコード内では、32 ビット整数によるシステムコール引数を使用できます。次のフィールドがあります。
トークン ID
関連するシステムコール引数の引数 ID
引数の値
省略可能な記述テキスト文字列の長さ (表示されない)
省略可能なテキスト文字列
praudit により、arg トークンは次のように表示されます。
argument,1,0x00000000,addr |
一般に、attrトークンはパスの検索中に生成され、path トークンが添付されていますが、パス検索エラーのイベントには含まれません。次のフィールドがあります。
トークン ID
ファイルのアクセスモードとタイプ
所有者のユーザ ID
所有者のグループ ID
ファイルシステム ID
i ノード ID
ファイルが示すデバイス ID
praudit により、attr トークンは次のように表示されます。
attribute,100555,root,staff,1805,13871,-4288 |
exitトークンには、プログラムの終了状態が記録されます。 次のフィールドがあります。
トークン ID
exit()システムコールに渡されるプログラムの終了状態
終了状態を記述するか、システムエラー番号を示す戻り値
praudit により、exit トークンは次のように表示されます。
exit,Error 0,0 |
このトークンは監査デーモンによって生成され、古いファイルが有効でなくなると、新しい監査トレールファイルのはじめと古いファイルの終りを示します。このトークンが入っている監査レコードは、連続する監査ファイルをまとめてリンクし、1 つの監査トレールにまとめます。次のフィールドがあります。
トークン ID
ファイルのオープンまたはクローズ日時を示すスタンプ
ファイル名のバイト数 (表示されない)
ファイル名
praudit により、file トークンは次のように表示されます。
file,Tue Sep 1 13:32:42 1992, + 79249 msec, /baudit/localhost/files/19920901202558.19920901203241.quisp
groupsトークンは、プロセスの資格からグループエントリを記録します。次のフィールドがあります。
トークン ID
サイズが NGROUPS_MAX (16) のグループエントリの配列
praudit により、groups トークンは次のように表示されます。
group,staff,wheel,daemon,kmem,bin,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 |
in_addrトークンは、マシンのインターネットプロトコルアドレスを示します。次のフィールドがあります。
トークン ID
インターネットアドレス
praudit により、in_addr トークンは次のように表示されます。
ip addr,129.150.113.7 |
ip トークンには、インターネットプロトコルヘッダのコピーが入っています。次のフィールドがあります。
トークン ID
IP ヘッダの 20 バイトのコピー
praudit により、ip トークンは次のように表示されます。
ip address,0.0.0.0 |
このトークンには、特定の IPC オブジェクトを識別するために呼び出し元に使用 される System V IPC メッセージ/セマフォ/共有メモリハンドルが入っています。次のフィールドがあります。
トークン ID
IPC オブジェクトタイプ識別子
IPC オブジェクトハンドル
praudit により ipc トークンは次のように表示されます。
IPC,msg,3 |
ipc_perm トークンには、System V IPC アクセス情報のコピーが入っています。共有メモリ、セマフォ、メッセージ IPC の監査レコードには、このトークンが追加されます。次のフィールドがあります。
トークン ID
IPC 所有者のユーザ ID
IPC 所有者のグループ ID
IPC 作成者のユーザ ID
IPC 作成者のグループ ID
IPC アクセスモード
IPC シーケンス番号
IPC キー値
praudit により ipc_perm トークンは次のように表示されます。
IPC perm,root,wheel,root,wheel,0,0,0x00000000 |
このトークンには、TCP (または UDP) アドレスが入っています。次のフィールドがあります。
トークン ID
TCP/UDP アドレス
praudit により iport トークンは次のように表示されます。
ip port,0xf6d6 |
opaqueトークンには、書式化されていないデータが一連のバイトとして入っています。次のフィールドがあります。
トークン ID
データ配列のバイト数
バイトデータ配列
praudit により opaque トークンは次のように表示されます。
opaque,12,0x4f5041515545204441544100 |
path トークンには、オブジェクトに関するアクセスパス情報が入っています。次のフィールドがあります。
トークン ID
パス長のバイト数 (表示されない)
絶対パス
praudit により path トークンは次のように表示されます。
path,/an/anchored/path/name/to/test/auditwrite/AW_PATH |
process トークンには、プロセスを記述する情報が入っています。次のフィールドがあります。
トークン ID
ユーザの監査 ID
実効ユーザ ID
実効グループ ID
実ユーザ ID
実グループ ID
プロセス ID
セッション ID
次の ID からなる端末 ID
デバイス ID
マシン ID
praudit により、process トークンは次のように表示されます。
process,root,root,wheel,root,wheel,0,0,0,0.0.0.0 |
returnトークンは、システムコールの戻り状態とプロセスの戻り値を示します。このトークンは、常にシステムコールに関してカーネルで生成される監査レコードの一部として返されます。次のフィールドがあります。
トークン ID
システムコールのエラー状態
システムコールの戻り値
praudit により、return トークンは次のように表示されます。
return,success,0 |
このトークンは省略可能で、デバッグに使用される昇順のシーケンス番号が入っています。seq ポリシーがアクティブになっているときは、このトークンが各監査レコードに追加されます。次のフィールドがあります。
トークン ID
32 ビットの符号なし long 型のシーケンス番号
praudit により、seq トークンは次のように表示されます。
sequence,1292 |
socketトークンはインターネットソケットを記述します。次のフィールドがあります。
トークン ID
ソケットタイプフィールド (TCP/UDP/UNIX)
ローカルポートアドレス
ローカルのインターネットアドレス
リモートポートアドレス
リモートのインターネットアドレス
praudit により、socket トークンは次のように表示されます。
socket,0x0000,0x0000,0.0.0.0,0x0000,0.0.0.0 |
このトークンはサブジェクト (プロセス) を記述します。次のフィールドがあります。
トークン ID
ユーザの監査 ID
実効ユーザ ID
実効グループ ID
実ユーザ ID
実グループ ID
プロセス ID
セッション ID
次の ID からなる端末 ID
デバイス ID
マシン ID
praudit により、subject トークンは次のように表示されます。
subject,cjc,cjc,staff,cjc,staff,424,223,0 0 quisp |
text トークンにはテキスト文字列が入っています。次のフィールドがあります。
トークン ID
テキスト文字列の長さ (表示されない)
テキスト文字列
praudit により、text トークンは次のように表示されます。
text,aw_test_token |
auditreduce コマンドを実行すると、1 つまたは複数の入力監査ファイルから監査レコードがマージされます。通常は、分散システム全体のすべての監査トレールファイルがマウントされているマシンから、このコマンドを入力することになります。
オプションを指定せずに auditreduce を実行すると、監査される全体 (監査ディレクトリ /etc/security/audit 内のすべてのサブディレクトリ内のすべての監査ファイル) がマージされ、そのマージされたファイルが標準出力に送られます。
praudit コマンドを実行すると、各レコードはユーザが読める形式に変換されます。詳細は 「praudit の使用方法」を参照してください。
auditreduce コマンドのオプションには、次のような機能があります。
特定の監査フラグでのみ生成された監査レコードが入っている出力が表示される。
特定の 1 人のユーザによって生成された監査レコードが表示される。
特定の日付に生成された監査レコードが収集される。
Solaris BSM を実行する複数のマシンが分散システムの一部として管理される場合に は、各マシンが監査対象のイベントを実行し、監査レコードをマシン固有の専用監査ファイルに書き込みます。このため、ソフトウェアが単純化され、マシンの障害が発生した場合の信頼性が高まります。
auditreduce コマンドによって、監査トレール全体の管理作業を効率化できます。auditreduce (または、より高いインタフェースを提供するために独自に作成したシェルスクリプト) を使用すると、レコードの生成方法や格納場所に関係なく、システム内のすべてのファイルの論理上の組み合わせを 1 つの監査トレールとして読むことができます。
auditreduce プログラムは、監査デーモンによって生成された監査トレールを処理します。1 つまたは複数の監査ファイルからレコードが選択され、マージされて、1 つの時系列順のファイルが生成されます。auditreduce のマージ機能と選択機能は論理的に他に依存しません。auditreduce はレコードが読み取られると、入力ファイルがマージされてディスクに書き込まれる前に、そこからメッセージを選択します。auditreduce(1M)のマニュアルページを参照してください。
この節では、データを分析して管理するための auditreduce の一般的な使用方法について説明します。
監査トレール全体を一度に表示するには、auditreduce の出力を praudit にパイプします。
# auditreduce | praudit |
# auditreduce | praudit | lp |
次の例で、システム管理者は lo メッセージクラスを要求し て、ユーザ fred が 1990 年 4 月 13 日にログインしてログアウトした時刻を調べます。短い日付の書式は yymmdd です (長い形式については、auditreduce(1M) のマニュアルページを参照)。
# auditreduce -d 900413 -u fred -c lo | praudit |
次の例では、特定の日付に関するログイン/ログアウトメッセージが 1 つのファイルに集計されます。ターゲットファイルは、通常の監査ルート以外のディレクトリに書き込まれます。
# auditreduce -c lo -d 870413 -O /usr/audit_summary/logins |
-O オプションを使用すると、開始時刻と終了時 刻を示す 14 文字のタイムスタンプと接尾辞 logins が付いた監査ファイルが作成されます。
/usr/audit_summary/19870413000000.19870413235959.logins |
監査ファイルが開いているうちに監査デーモンが停止したり、サーバがアクセスできなくなってマシンが新しいサーバに強制的に切り替えたりすると、監査ファイルが監査レコードに使用されなくなっても、そのファイルが残り、ファイル名に含まれる終了時刻に文字列 not_terminated が付いたままになることがあります。この種のファイルが検出された場合は、ファイルが使用されていないことを手作業で検査し、正しいオプションを使用してファイル名を指定して整理するとよいでしょう。
# auditreduce -O machine 19870413120429.not_terminated.machine |
このコマンドを実行すると、正しい名前 (両方のタイムスタンプ) と正しい接尾辞 (明示的に指定された machine) が付いた新しい監査ファイルが作成され、すべてのメッセージがそのファイルにコピーされます。
auditreduce には他にも多数のオプションがあり、マニュアルページに掲載されています。大文字のオプションを使用すると files に対する処理またはパラメータが選択され、小文字のオプションを使用すると records に対するパラメータが選択されるので注意してください。この項では、2 つの便利なオプションの使用方法について説明します。
date-time オプション -b と -a を使用すると、特定の日時よりも前または後のレコードを指定できます。1 日は yyyymmdd00:00:00 から始まって yyyymmdd23:59:59 に終わります。日付に関するパラメータは年、月、日、時、分、秒の 6 つです。年のはじめの 2 桁 (19) は指定する必要はありません。
-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コマンドは、標準入力から監査レコードを読み取り、ユーザが読める書式で標準出力に表示します。一般に、入力は 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 などを使用して処理できます。