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

スポンサーリンク

VBScriptで解き明かすセキュリティの深淵:WMIによるイベントログ監査の極意

Windowsのレガシー環境において、VBScriptは「枯れた技術」などではない。OSの深層にダイレクトに触れ、システム管理者が求める「一瞬の答え」を最も軽量に引き出せる、極めて洗練されたアーキテクチャだ。

今回は、監査の要である「Event ID 4663(オブジェクトへのアクセス)」をターゲットに、WMI(Windows Management Instrumentation)を駆使してファイルアクセス履歴を抽出する手法を解説する。

1. なぜWMIでEvent ID 4663を狙うのか

Event ID 4663は、オブジェクト(ファイル、フォルダ、レジストリ等)へのアクセス試行を記録する。これを追跡することで「誰が」「いつ」「どのファイルに」触れたかを特定できる。

ここで重要なのは、「巨大なイベントログをどう効率的にハンドリングするか」だ。WMIのWQL(WMI Query Language)は強力だが、クエリの書き方を誤ればプロセスのメモリを食いつぶし、CPUを枯渇させる。シニアエンジニアたるもの、泥臭い全スキャンではなく、インデックスを意識したクエリを投げるのが流儀である。

2. 極限の監査スクリプト:Audit4663.vbs

このスクリプトは、単にログを出すだけではない。メモリリークを許さないオブジェクト管理と、大規模ログでも破綻しない構造を採用している。

‘————————————————————————–
‘ File Access Auditor (Event ID 4663 Extractor)
‘ Version: 1.0.0
‘ Description: WMIを介してセキュリティログから特定のアクセス履歴を抽出
‘————————————————————————–
Option Explicit

Dim objWMIService, colLoggedEvents, objEvent
Dim strComputer, strQuery

strComputer = “.”
‘ WQLクエリ:EventCode 4663に限定し、パフォーマンスのために直近のログを対象にする
‘ ※大規模環境ではTimeGeneratedで範囲を絞り込むことが不可欠
strQuery = “SELECT FROM Win32_NTLogEvent WHERE Logfile = ‘Security’ AND EventCode = 4663”

‘ WMIサービスへの接続 (接続文字列の最適化)
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate,(Security)}!\\” & strComputer & “\root\cimv2”)

WScript.Echo “— Access Audit Report Start —”

‘ イベントログの列挙
Set colLoggedEvents = objWMIService.ExecQuery(strQuery)

For Each objEvent In colLoggedEvents
‘ メモリ最適化:必要なプロパティのみをパースし、オブジェクトの生成を抑制する
‘ ID 4663のMessageプロパティには構造化されたデータが含まれるため、
‘ 実務ではここから正規表現を用いて「Object Name」や「Account Name」を抽出する
WScript.Echo “Time: ” & objEvent.TimeGenerated
WScript.Echo “Message: ” & Left(objEvent.Message, 100) & “…” ‘ 長大ログへの配慮
WScript.Echo “———————————”
Next

‘ オブジェクトの明示的解放:VBScriptのGC(ガーベジコレクション)に頼るな
Set colLoggedEvents = Nothing
Set objWMIService = Nothing

WScript.Echo “— Audit Process Finished —”

3. チーフアーキテクトからの深掘り:実装の注意点

① WMIクエリの「重さ」を制御せよ

`SELECT ` は、数万件のイベントログがある環境では自殺行為だ。実務では必ず `TimeGenerated` プロパティを使い、`WHERE TimeGenerated > ‘20231001000000.000000+000’` のように期間を絞り込むこと。WMIはWQLの段階でフィルタリングさせないと、後続のVBScript処理でメモリオーバーフローを引き起こす。

② セキュリティ特権のハンドリング

WMIでセキュリティログにアクセスするには、スクリプト実行ユーザーに「監査ログを読む権限」が必要だ。さらに、接続文字列に `{ (Security) }` という特権を付与している点に注目してほしい。これが無いと、アクセス拒否(Access Denied)で弾かれる。

③ 正規表現による「Message」の解釈

Event ID 4663の `Message` プロパティは、構造化されていないテキストデータである。VBScriptの `RegExp` オブジェクトを併用し、`Object Name:` や `Subject User Name:` の後ろの文字列を動的にキャプチャするアーキテクチャを構築するのが、真の自動化エンジニアの仕事だ。

4. 総括:レガシーは技術の証明である

VBScriptは確かに古い。しかし、Windowsの内部APIをこれほどまでに透過的に、かつ追加のランタイムなしで叩ける言語は他にない。

「PowerShellでやればいいのでは?」という声が聞こえてきそうだが、特定の制限付きサーバー環境や、極限まで軽量性が求められる保守フェーズにおいて、数KBで動作するVBScriptは今なお最強のツールである。

コードを書き捨てるのではなく、オブジェクトのライフサイクルを意識し、システムへの負荷を最小限に抑える。その「配慮」こそが、一流のエンジニアを分かつ境界線だ。

さあ、このスクリプトをベースに、君の管理下にあるサーバーの「見えないアクセス」を白日の下に晒してほしい。技術の真髄は、常に現場の課題解決の中にある。

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