【入門編】【ファイルセキュリティ監査】Windowsイベントログ (Event ID 4663) のWMI抽出によるファイルアクセス履歴追跡 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【セキュリティ監査の極意】VBScriptで挑む「イベントログ 4663」抽出の自動化

こんにちは。現場の最前線で自動化アーキテクトをしている私から、今日は少し「硬派」な自動化の技術を伝授しましょう。

マクロの記録ボタンを押すだけの日常から一歩進み、「Windowsの心臓部(OSログ)を直接叩く」という経験は、あなたのエンジニアとしての視座を劇的に変えます。今回は、ファイルアクセスの追跡に不可欠な「イベントID 4663」を、VBScriptを使ってWMI経由で抽出する手法を解説します。

1. なぜ今、VBScriptなのか?

「今さらVBScript?」と思うかもしれません。しかし、VBScriptは「Windows環境さえあれば、追加インストール不要で即座に動く」という圧倒的な特権を持っています。特に、セキュリティ監査のような「現場の端末にツールを持ち込みにくい環境」において、これほど信頼できる武器はありません。

今回扱う「WMI (Windows Management Instrumentation)」は、OSのあらゆる情報を管理するためのインターフェースです。これを使えば、イベントビューアをポチポチと手作業で巡回する必要はなくなります。

2. ターゲット:イベントID 4663とは

Windowsのセキュリティログには数万のイベントが記録されますが、その中でも「4663」は極めて重要です。これは「ファイルやディレクトリへのアクセス試行」を指します。

  • 何ができるのか: 誰が(アカウント)、どのファイルに、いつ、何をしたか(書き込み、削除、読み取りなど)が記録されます。
  • 注意点: 膨大なログが生成されるため、監査設定(監査ポリシー)が事前に有効になっている必要があります。

3. 実装:WMIクエリによるログ抽出スクリプト

それでは、実戦的なコードを見てみましょう。以下のコードをメモ帳に貼り付け、`.vbs` 拡張子で保存してください。

‘ — セキュリティログ監査ツール: FileAccessTracker.vbs —
Option Explicit

Dim objWMIService, colLoggedEvents, objEvent
Dim strComputer, strQuery

‘ 接続先設定 (ローカルホスト)
strComputer = “.”

‘ WMI経由でセキュリティログからID:4663を抽出するクエリ
‘ 実行速度を考慮し、直近のイベントに絞るなどの工夫が現場では必要です
strQuery = “SELECT FROM Win32_NTLogEvent WHERE Logfile = ‘Security’ AND EventCode = 4663”

‘ WMIサービスへの接続
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)

‘ クエリの実行
Set colLoggedEvents = objWMIService.ExecQuery(strQuery)

WScript.Echo “— ファイルアクセス監査開始 —”

‘ 結果のループ処理
For Each objEvent In colLoggedEvents
‘ 必要なプロパティだけを出力(EventCode 4663特有のメッセージをパース)
WScript.Echo “————————————”
WScript.Echo “発生時刻: ” & objEvent.TimeGenerated
WScript.Echo “ユーザー: ” & objEvent.User
WScript.Echo “詳細情報: ” & objEvent.Message
Next

WScript.Echo “— 監査終了 —”

‘ オブジェクトの解放 (メモリ管理の基本)
Set colLoggedEvents = Nothing
Set objWMIService = Nothing

4. コードの深掘り:ここを理解すれば一人前

① `GetObject(“winmgmts:…”)` の魔力

これはWMIという「OSの管理ツール」の入り口を叩く魔法の呪文です。`impersonationLevel=impersonate` と書くことで、スクリプト実行者がOSに対して「私になり代わって情報を取ってきて」と要求する権限を与えています。

② `ExecQuery` のパフォーマンス

WMIクエリは強力ですが、ログ全体をなめると非常に重いです。実運用では `AND TimeGenerated > ‘20231001000000.000000+000’` のように期間を絞り込むのが、プロのエンジニアの作法です。

③ なぜエラーが起きるのか?

  • 権限不足: セキュリティログへのアクセスには「管理者権限」が必須です。スクリプトを「管理者として実行」することを忘れないでください。
  • 監査ポリシー未設定: Windows側で「オブジェクトアクセスの監査」が有効になっていないと、このクエリの結果は空になります。

5. 次のステップへのアドバイス

このコードはあくまで入り口です。現場で使うなら、以下の拡張を検討してみてください。

1. CSV出力機能: `Scripting.FileSystemObject` を使い、結果をログファイルに書き出すようにする。
2. フィルタリング: `objEvent.Message` の中から特定のパス(例: `C:\Confidential\`)が含まれるものだけを抽出するロジックを加える。
3. エラーハンドリング: `On Error Resume Next` を適切に使い、アクセス権のないログでスクリプトが止まらないようにする。

VBScriptは古い言語と言われますが、「システムに深く根を下ろす力」は最新の言語にも引けを取りません。このコードをベースに、自分だけの「最強の監査ツール」を育ててみてください。

「動いた!」という感動こそが、エンジニアとしての確かな一歩です。何か分からないことがあれば、いつでも聞いてくださいね。応援していますよ。

タイトルとURLをコピーしました