トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

2008 Active Directoryでログオン・ログオフ監査.sys

[Microsoft Windows]

概要

実は、Active Directoryへのログオン・ログオフの監査は、監査ポリシーでは正確に記録することができない。
そもそも、「アカウントログオン」のポリシーしかないし、しかもこれはログオンを監査するのではなく、Kerberosの認証チケット発行イベントなので、ドメインへの実際のログオンタイミングとは違うものである。

一方「ログオンイベント・ログオフイベント」の監査の方は、対話型ログオン・ログオフに関わらず、マシンへのアクセスの際に生じる認証イベントをローカルマシン上に記録するものなので、Active Directory認証は関係ない。

そのため、正確にユーザーがドメインのコンピューターにログオン・ログオフしたことをイベントログに記録し集中管理するためには、ログオン・ログオフスクリプトを使うしかない、とのこと。
これはけっこう有名な話らしい。

前提条件

ADのアカウントユーザーは、イベントログへの書き込みを制限されている。

  • セキュリティログに書き込みができるのは、管理者権限のあるユーザーのみ。かつ、デフォルトでは管理者も書き込みできない。管理者権限のないユーザーは、どうやっても書き込みができないようになっている。
  • アプリケーションログとシステムログは、管理者はデフォルトで書き込みができる。一般ユーザーは、イベントログの権限設定を変更することで書き込みが可能となる。

一般ユーザーもログオン・ログオフスクリプトで監査する場合、上記のとおりセキュリティログは利用できない。一般的にはアプリケーションログを使用するという。

方法

アプリケーションログに対してDomain Usersからの書き込みを許可する

監査ログを記録したいドメインコントローラー上にて、以下のコマンドをコマンドプロンプトで実行する(2008以降のみ)。

wevtutil sl application /ca:O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x7;;;SO)(A;;0x3;;;IU)(A;;0x3;;;SU)(A;;0x3;;;S-1-5-3)(A;;0x3;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)(A;;0x3;;;DU)

/ca オプション以降の意味のわからない文字列は、「SDDL構文」と呼ばれるものだという。この書式に則って、アクセス権限が記述されているという。SDDLについての詳細はMSのサイトを参照のこと。

最後の (A;;0x3;;;DU) が、(「許可」;;「書き込み」;;;「Domain Users」)という意味になるといい、アプリケーションログのデフォルトのアクセス権に追加した部分。
つまり上記から(A;;0x3;;;DU)を除いた部分が、デフォルトのアクセス権。

このコマンドは、指定したSDDL構文文字列を値として、HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application\CustomSD というレジストリキーを追加して有効にするだけ。したがって、このレジストリキーを直接いじることでも、アプリケーションログへのアクセス権をカスタマイズできる。
単にこのキーを削除すれば、デフォルトのアクセス権に戻る。

イベントログにログを記録するログオン・ログオフスクリプトを作る

VBScript on WSH のサンプルは添付の通り。

strEventLogDcName に、イベントログを記録するDCのホスト名をUNCで指定する。このDC上で事前に、上記の wevtutil コマンドを実行しておかなければならない。
そうしないと一般ユーザーのログオン・ログオフがイベントログに書き込みできない。

このサンプルだと、ログオンしたユーザーが所属するグループの一覧がログに記録される。
ただし、MemberOf属性にはプライマリグループが含まれない。ADユーザーのデフォルトのプライマリグループは Domain Users なので、このスクリプトはそれを前提としている。
ADSIで、あるユーザーのプライマリグループを取得するためには、多少複雑な計算処理をしなければならない、とのこと。。。

一般的には WshShell オブジェクトの LogEvent メソッドを使用するスクリプト例が多いが、LogEventメソッドだと、イベントログの「ユーザー」フィールドが記録されない。これは困る。

そこで代替として、EventCreate を呼び出して使うようにしている。
/T オプションにはわけあって INFORMATION を指定しているが、通常は SUCCESS とかの方がいいと思う。
/D オプションを指定した場合、空文字引数は許されないので注意。

WshShell.Run メソッドの第二引数には 7 を指定している。実行ウィンドウを最小化し、かつウィンドウフォーカスの操作をしない、という意味。ユーザーにスクリプトの実行を見せないようにするため。詳細はMSのサイトを見てくれ。

ログオフスクリプトだけ、WshShell.Run メソッドの第三引数に True を指定している。これは、実行コマンドの終了を待つ、という意味。ログオフスクリプトでは、ここは必ず True にしないとならない。さもないと、EventCreate が完了する前に即時にログオフしてしまい、ログが記録されない。
一方でログオンスクリプトではそのような心配はない。むしろ True にするとログオン時にユーザーが少し待たされるため、こちらは省いている。