【特権の要塞を守れ】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に標準搭載され、追加のライブラリなしで特権領域を叩けるこの言語は、保守フェーズにおいては最強の武器だ。
今回提供したコードは、あくまで「監査の目」だ。これを起点に、不正なユーザーを強制削除するのか、管理者にアラートメールを飛ばすのかは、君たちの運用設計次第だ。
「動く」ことは最低条件、「壊れない」ことがプロの条件だ。
さあ、今すぐ自身の管理するサーバーを監査し、その脆弱な牙城を要塞へと変えてこい。幸運を祈る。
