こんにちは!VBScriptの世界へようこそ。
業務の自動化を進めていくと、避けて通れないのが「ログ出力(処理の記録)」と「セキュリティー(機密情報の保護)」の壁です。
「画面が黒い黒い画面(コマンドプロンプト)で動くツールを作ったはいいけれど、デバッグ用に引数や設定ファイルをそのままログファイルに書き出したら、APIトークンやパスワードが丸見えになってしまった……!」
そんなヒヤッとする事故、現場では本当によく起こります。
今回は、VBScriptとWSH(Windows Script Host)の環境を使いこなし、「ログを出力する瞬間に、自動でパスワードを伏字(``)にするセキュアな設計」を一緒にマスターしていきましょう。ここをクリアすれば、あなたもワンランク上の「安全な自動化エンジニア」の仲間入りです。優しく丁寧に解説していくので、安心してついてきてくださいね!
—
1. なぜログに機密情報が出てしまうのか?
VBScriptでバッチ処理を書くとき、外部から引数を受け取ったり(`WScript.Arguments`)、設定ファイルを読み込んだりすることは日常茶飯事です。
例えば、以下のようなコマンドを叩いたとします。
cscript.exe deploy.vbs user01 SecretPassword123
トラブルシューティングのために、「今どんな引数で動いたか」を親切心でログに残そうとして、こんなコードを書いていませんか?
‘ 【危険なアンチパターン例】
Dim arg
For Each arg In WScript.Arguments
‘ 引数をそのままログに書き出す
WScript.Echo “引数受取: ” & arg
Next
これだと、コンソール画面やログファイルに `SecretPassword123` が平文(暗号化されていない状態)で盛大に記録されてしまいます。ログファイルが共有サーバーに置かれたり、メールで誤送信されたりした日には……想像するだけで恐ろしいですよね。
—
2. 解決策:VBScriptの正規表現(RegExp)でマスクする
この問題をスマートに解決するのが、正規表現(Regular Expression)を用いた動的マスク処理です。
VBScriptには標準で `VBScript.RegExp` という強力なオブジェクトが備わっています。これを使って、「特定のキーワードに続く文字列」や「いかにもパスワードらしい文字列」を検知し、瞬時に “ へ置換してしまいましょう。
全体アーキテクチャのイメージ
[生データ(引数・設定値)]
↓
[セキュア・ロガー(Wrapper関数)] ←★ここで正規表現によるマスクを実行!
↓
[安全なログ出力(画面 / ファイル)] → “password=”
—
3. 実装コード:機密情報を自動マスクするセキュア・ロガー
それでは、現場でそのままコピペして使える実践的なコードを見ていきましょう。
今回は、引数の内容や設定値を安全にログ出力するための専用関数 `SecureLog` を用意しました。
‘ ==============================================================================
‘ ファイル名: SecureLogger.vbs
‘ 概要: 機密情報を自動マスクしてログ出力するセキュア設計のサンプル
‘ ==============================================================================
Option Explicit
‘ メイン処理の実行
Call Main()
Sub Main()
Dim arg
WScript.Echo “=== 処理開始(セキュア・ロガー稼働中) ===”
‘ 1. コマンドライン引数の安全なログ出力テスト
‘ 実行例: cscript.exe SecureLogger.vbs server=192.168.1.1 password=MySecretPass
If WScript.Arguments.Count > 0 Then
For Each arg In WScript.Arguments
Call SecureLog(“引数検知”, arg)
Next
Else
‘ デモ用のダミー引数を渡してテスト
Call SecureLog(“引数検知”, “user=admin”)
Call SecureLog(“引数検知”, “api_token=Bearer abc123xyz789token”)
Call SecureLog(“引数検知”, “password=SuperSecretPassword!99”)
End If
WScript.Echo “=== 処理終了 ===”
End Sub
‘ ——————————————————————————
‘ 関数名: SecureLog
‘ 引数: logTitle (String) – ログのラベル
‘ logValue (String) – 出力したい文字列(機密情報が含まれる可能性あり)
‘ 概要: 正規表現を用いて、パスワードやトークンを自動的に「」に置換する
‘ ——————————————————————————
Sub SecureLog(logTitle, logValue)
Dim regEx
Dim maskedValue
‘ RegExpオブジェクトの生成(VBScript標準)
Set regEx = New RegExp
‘ 【重要】大文字小文字を区別せず、マッチした部分をすべて置換する設定
regEx.IgnoreCase = True
regEx.Global = True
‘ ————————————————————————–
‘ パターン1: 「password」「passwd」「secret」「token」「key」などの
‘ キーワードに続く値(イコールやコロン、スペース区切り)をマスクする正規表現
‘ ————————————————————————–
regEx.Pattern = “(password|passwd|secret|token|key|api[_-]?key)\s[:=]\s([^\s]+)”
‘ 第2引数の “$1=” は、マッチしたキーワード($1)を残して値部分をマスクする置換構文
maskedValue = regEx.Replace(logValue, “$1=”)
‘ ————————————————————————–
‘ パターン2: キーワードがない単体の機密文字列(必要に応じて追加)
‘ 例として、特定のプレフィックスを持つBearerトークンなどを直接叩く場合など
‘ ————————————————————————–
‘ regEx.Pattern = “Bearer\s+[a-zA-Z0-9_\-\.]+”
‘ maskedValue = regEx.Replace(maskedValue, “Bearer “)
‘ 最終的に安全になった文字列を出力
WScript.Echo “[” & logTitle & “] ” & maskedValue
‘ オブジェクトの解放(メモリ管理の基本)
Set regEx = Nothing
End Sub
—
4. コードの深掘りポイント(ここがプロの知見)
初心者のうちは「動けばいいや」となりがちですが、VBScriptを長く安定稼働させるためには、以下のポイントを知っておく必要があります。
① `RegExp` オブジェクトのライフサイクルとメモリ
VBScriptでは、ループ内で何度もオブジェクトを生成・破棄すると、ガベージコレクションの負荷がわずかに高まります。
今回の規模であればループ内生成でも問題ありませんが、数万行のログを一括処理するような巨大なスクリプトを書く場合は、「関数外で一度だけ生成して使い回す(グローバル、あるいはクラス化する)」のが、プログラミングのパフォーマンスを極める上での定石です。
② 正規表現のキャプチャグループ(``)の活用
今回のパターン `(password|passwd|secret…)\s[:=]\s([^\s]+)` では、括弧 `()` を使ってグループを作っています。
- `$1` には、マッチしたキーワード(例: `password`)がそのまま入ります。
- 後ろの値の部分だけを強制的に “ に書き換えることで、「何の項目が隠されたか」というログとしての可読性を損なわずに、セキュリティを担保しています。これがセキュア設計のミソです。
—
5. 陥りがちなエラーとトラブルシューティング
VBScriptで正規表現を使う際によくあるハマりどころを事前にチェックしておきましょう。
- エラー: 「オブジェクトが必要です: ‘New’」
- 原因: `New RegExp` と書くべきところを `CreateObject(“VBScript.RegExp”)` と書き損じている、あるいはスペルミスがある場合に発生します。基本は `New RegExp` でスマートにインスタンス化しましょう。
- 思った通りにマスクされない場合
- 原因: 設定ファイルの記述ゆれ(例: `password = abc` のようにスペースが入っている、全角の `=` が使われているなど)が原因のほとんどです。
- 対策: 正規表現の `\s`(空白文字が0文字以上続く)を挟むことで、スペースのゆれには強くなりますが、全角記号対策として、必要に応じて事前に `Replace` 関数で全角記号を半角に正規化する前処理を入れておくと完璧です。
—
まとめ:セキュアな自動化は「ログ設計」から始まる
今回は、VBScriptにおける機密情報のマスク処理とセキュアなログ設計について解説しました。
1. 生データをそのままログに出力しない(鉄則)
2. `VBScript.RegExp` を用いて、キーワードと値のペアを動的に検知する
3. 可読性を残したまま、値の部分だけを `` に置換する
このひと手間をコードに組み込んでおくだけで、あなたがつくる自動化ツールは「動くだけのスクリプト」から、企業の水準に耐えうる「信頼性の高いプロフェッショナルなツール」へと生まれ変わります。
ここをクリアしたあなたなら、もうVBScriptの基礎はバッチリです!ぜひ日々の業務自動化にこのセキュア設計を取り入れてみてくださいね。それでは、次のステップでお会いしましょう!
