【実務・中級編】【タイムスタンプ監査】DateCreatedとDateLastModifiedの整合性をFSOでチェックするファイル改ざん検知VBS – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握する極限の知見:FSOで挑む「タイムスタンプ監査」の真実

現場のエンジニア諸君。ファイルシステムオブジェクト(FSO)を単なる「ファイルの読み書きツール」だと思っていないか?

確かにVBScriptはレガシーだ。だが、Windowsの深層で実行される軽量な自動化エンジンとして、これほど「無駄のない」道具はない。特にファイルシステムの整合性監査において、FSOはOSのメタデータに直接触れることができる唯一無二の存在だ。

今回は、最も初歩的でありながら、多くのエンジニアが見落としている「DateCreated(作成日時)とDateLastModified(更新日時)の不整合」を検知する堅牢なアーキテクチャを伝授する。

—

なぜ「タイムスタンプの整合性」が重要なのか

ファイル操作において、`DateCreated` が `DateLastModified` より未来にある現象は、通常あり得ない。だが、以下のケースでこの鉄則は崩れる。

1. ファイル移動によるメタデータの継承不全: OSのコピー・移動処理でメタデータが誤って再構築された場合。
2. バックアップ・同期ツールによる復元: タイムスタンプを維持できない安価な同期ツールが引き起こす破壊。
3. 悪意ある改ざん(タイムストンプ): 攻撃者がファイルの更新日時を過去に偽装し、システム監査の目を潜り抜けようとする「タイムストンプ」攻撃。

これらをFSOで検知するには、単にプロパティを読むだけでは不十分だ。「どのプロパティが、どの瞬間に何を指しているのか」というオブジェクトのライフサイクルを理解しなければならない。

—

プロダクション環境のための堅牢な設計指針

単に「if文で比較する」だけのコードは書くな。現場で生き残るスクリプトには、以下の3つの原則が必要だ。

  • 型変換の徹底: `Date`型としての比較を行うこと。文字列比較は論外だ。
  • 例外処理の標準化: ファイルアクセス権限やロックによるエラーを想定し、`On Error Resume Next` を局所的に適用せよ。
  • ログの構造化: 後続の分析(CSVインポートなど)を見据え、タブ区切りやカンマ区切りの構造化ログを吐き出すこと。

—

実装コード:ファイル整合性監査エンジン

以下は、指定ディレクトリ下の全ファイルを走査し、不整合を検出してログに書き出すプロフェッショナル向けスクリプトだ。

‘ — タイムスタンプ監査エンジンのコアロジック —
Option Explicit

Dim fso, targetFolder, logFile
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 監査対象とログ出力先
Const TARGET_PATH = “C:\Data\AuditTarget”
Const LOG_PATH = “C:\Logs\AuditResult.csv”

‘ ログ出力用ファイル作成
Set logFile = fso.CreateTextFile(LOG_PATH, True)
logFile.WriteLine(“FilePath,DateCreated,DateLastModified,Status”)

‘ 監査開始
Call AuditDirectory(fso.GetFolder(TARGET_PATH))
logFile.Close

Sub AuditDirectory(folder)
Dim file, subFolder

‘ ファイルの監査
For Each file In folder.Files
‘ 整合性チェック:作成日時が更新日時より新しい場合は「不整合」
If file.DateCreated > file.DateLastModified Then
logFile.WriteLine file.Path & “,” & file.DateCreated & “,” & file.DateLastModified & “,不正:作成日時が更新日時より未来”
End If
Next

‘ 再帰的にフォルダを走査
For Each subFolder In folder.SubFolders
Call AuditDirectory(subFolder)
Next
End Sub

WScript.Echo “監査完了。ログを確認してください。”

—

現場で「バグを発生させない」ための極意

このスクリプトを運用に乗せる際、注意すべきポイントを補足する。

1. DateCreatedの罠: Windowsにおいて `DateCreated` は、ファイルを「コピー」した際に「コピー先で作成された日時」に書き換わることがある。このスクリプトで検知するのは「異常な更新」だが、環境によっては「ファイル移動」そのものがノイズになる。運用に合わせて、作成日時を無視して `DateLastModified` のみを監視対象とするフィルタリングも検討せよ。
2. データベース連携: もしこれをSQL ServerやSQLiteに蓄積するなら、`Date`型ではなく、必ずミリ秒まで保持できる数値フォーマット(Unix Epoch等)に変換してから格納せよ。VBScriptの`Date`型は、データベース連携時にロケールの影響を受けやすく、暗黙の型変換で痛い目を見る。
3. パフォーマンス: 巨大なディレクトリを走査する場合、`FileSystemObject`は同期的に動作する。あまりに広大な階層を対象にするなら、WMIの `Win32_LogicalFileSecuritySetting` 等と組み合わせて、イベント駆動型の監視を検討すべきだ。

最後に:エンジニアとしての矜持

コードを書くことは、単なる実装ではない。「システムの挙動を記述し、未来のトラブルを未然に防ぐ儀式」だ。

FSOは枯れた技術だが、その分、OSの仕様と密接に結びついている。このコードをベースに、君たちの現場の要件に合わせて「検知条件」をカスタマイズしてほしい。それができるようになった時、君たちは単なる「VBSを書く人」から、「インフラを掌握するアーキテクト」へと一歩近づくはずだ。

質問があればいつでも歓迎する。だが、まずはこのコードを走らせ、君たちのサーバーに眠る「隠れた不整合」を暴き出すことから始めてくれ。

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