【実務・中級編】【特権グループ自動監査】WinNTプロバイダを用いた Administrators グループメンバーの動的調査と変更検知 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【特権の要塞を守れ】VBScriptで構築するAdministratorsグループの動的監査

現場のインフラエンジニアや自動化担当者諸君。君たちの管理下にある端末で、「いつの間にかローカル管理者権限が増えている」という事態に冷や汗をかいたことはないか?

Active Directory環境下であればGPOで制御できるが、スタンドアロン端末やワークグループ環境では、権限の「漂流」は防ぎにくい。今回は、WinNTプロバイダを駆使し、Administratorsグループを深層から監視する堅牢な監査スクリプトを授ける。

中途半端なコードは、セキュリティの穴そのものだ。プロとして「止まらない」「漏らさない」コードを書くための作法を学べ。

1. なぜ「ADSI (WinNTプロバイダ)」を選択するのか

WMIを使用する手もあるが、ローカルグループのメンバーシップ操作において、WinNTプロバイダはOSの根源的なインターフェースに近い。軽快かつ、COMオブジェクトとしてのライフサイクルがシンプルだ。

ただし、COMオブジェクトの解放(Set obj = Nothing)を怠るな。 VBScriptのメモリ管理はガベージコレクションが甘い。大規模な監査を回す際、オブジェクトの開放漏れはメモリリークを招き、実行環境を腐らせる。

2. 堅牢な監査コード:実装の要諦

以下のコードは、現在の Administrators メンバーを取得し、許可リスト(ホワイトリスト)と比較して不正なIDを検出するプロトタイプだ。

‘ — 特権監査スクリプト: AuditAdminGroup.vbs —
Option Explicit

Dim strComputer, objGroup, objMember, arrAllowed, isAllowed, memberName
strComputer = “.”

‘ 許可リスト: ここに許可するユーザーやグループを定義せよ
arrAllowed = Array(“Administrator”, “Domain Admins”, “SystemAdmin”)

‘ WinNTプロバイダでグループオブジェクトにバインド
Set objGroup = GetObject(“WinNT://” & strComputer & “/Administrators,group”)

WScript.Echo “— 監査開始: ” & Now & ” —”

For Each objMember In objGroup.Members
memberName = objMember.Name
isAllowed = False

‘ ホワイトリスト照合
Dim i
For i = 0 To UBound(arrAllowed)
If LCase(memberName) = LCase(arrAllowed(i)) Then
isAllowed = True
Exit For
End If
Next

‘ 不正なアカウントを発見した場合
If Not isAllowed Then
WScript.Echo “[!] 警告: 不正な権限保持者を検知 -> ” & memberName
‘ ここでログ出力やメール通知の関数を叩く設計にせよ
Else
WScript.Echo “[OK] 正常なメンバー: ” & memberName
End If
Next

‘ オブジェクトの解放:これを忘れるエンジニアは二流だ
Set objMember = Nothing
Set objGroup = Nothing
WScript.Echo “— 監査終了 —”

3. 本番環境へ導入する際の3つの鉄則

コードが動くことはスタートラインに過ぎない。業務自動化エンジニアとして、以下の観点を設計に盛り込め。

① 排他制御とログの整合性

このスクリプトを定期実行(タスクスケジューラ)する場合、出力先は必ず追記型(Append)のログファイルにせよ。`OpenTextFile(path, 8, True)` で開き、最後に必ず `Close` を呼ぶ。書き込み中のロックを避けるため、ログファイル名は日付を冠するなどの工夫が必要だ。

② 実行権限の明確化

このスクリプトは Administrators 権限で実行しなければならない。タスクスケジューラ登録時は「最上位の特権で実行する」にチェックを入れ、実行アカウントのパスワード管理には細心の注意を払え。平文でパスワードをスクリプト内に書くのは論外だ。

③ データベース(CSV)連携の注意点

結果をCSVに出力して集計するなら、ダブルクォーテーションのエスケープを忘れるな。また、CSVをExcelで開くと数値が勝手に変換される罠がある。カンマ区切りでの書き出しにおいて、フィールドを `”` で囲む処理を関数化しておくのが、長く付き合えるコードの条件だ。

最後に:エンジニアの誇りについて

「VBScriptなんて古い」と言う者がいる。だが、OSに標準搭載され、追加のライブラリなしで特権領域を叩けるこの言語は、保守フェーズにおいては最強の武器だ。

今回提供したコードは、あくまで「監査の目」だ。これを起点に、不正なユーザーを強制削除するのか、管理者にアラートメールを飛ばすのかは、君たちの運用設計次第だ。

「動く」ことは最低条件、「壊れない」ことがプロの条件だ。
さあ、今すぐ自身の管理するサーバーを監査し、その脆弱な牙城を要塞へと変えてこい。幸運を祈る。

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