【入門編】【スクリプト電子署名】Signer オブジェクトと連携したVBScriptコードへのデジタル署名検証と整合性チェック – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!VBScriptの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩抜け出し、自分の手でWindowsの歯車を直接噛み合わせるような快感を知りたいあなたへ。今日は、VBScriptを「安全に、プロフェッショナルとして運用する」ための極上の知見をお伝えします。

ここをクリアすれば、単に動くだけのスクリプト職人から、セキュリティや運用の品質まで見通せるワンランク上のエンジニアにグッと近づけますよ。ぜひ最後までついてきてくださいね。

なぜVBScriptに「デジタル署名」が必要なのか?

皆さんは、VBScript(`.vbs`)を書いたことがありますか? メモ帳を開いてコードを書き、拡張子を `.vbs` に変えればダブルクリックですぐに動く。この手軽さが最大の魅力ですよね。

しかし、現場でこの手軽さが「最大の凶器」になることがあります。
VBScriptは、いわば「中身が丸見えのテキストファイル」です。悪意を持った第三者が勝手にコードを書き換えて(改ざんして)、裏でこっそりパスワードを盗むプログラムを仕込むことだって、技術的には朝飯前なのです。

「じゃあ、社内の安全なスクリプトが本当に改ざんされていないか、実行する前に自動でチェックできないだろうか?」

それを実現するのが、今回主役となる `Scripting.Signer` オブジェクトです。これを使うことで、スクリプトに「このコードは本物ですよ」という電子署名を刻み、一文字たりとも改ざんされていないかをプログラム自身に判定させることができるのです。

そもそも `Scripting.Signer` とは何か?

Windows Script Host(WSH)には、スクリプトのセキュリティを担保するための隠し味のようなオブジェクトが用意されています。それが `Scripting.Signer` です。

これを使うと、主に以下の2つのことができます。
1. 署名の付与(Sign): 証明書を使って `.vbs` ファイルに「封印」をする。
2. 署名の検証(Verify): 実行前、あるいは処理の途中で「このファイルは正しく、改ざんされていないか?」をプログラムでチェックする。

まずは、自分の書いたコードが安全であることを証明する「検証(Verify)」の仕組みから見ていきましょう。

実践:スクリプトの整合性をチェックするVBScriptコード

以下のコードは、指定したVBScriptファイルに付与されたデジタル署名が有効かどうかを検証する、実用的なサンプルです。

開発現場でそのままコピペして、エラーハンドリングやセキュリティチェックのパーツとして組み込めるように丁寧にコメントを入れました。

‘ ==============================================================================
‘ ファイル名: VerifyScriptSignature.vbs
‘ 概要: 指定されたVBScriptファイルのデジタル署名を検証し、改ざんの有無を判定する
‘ ==============================================================================

Option Explicit

‘ メイン処理の実行
Call Main()

Sub Main()
Dim targetFile
targetFile = “C:\Scripts\MySecureScript.vbs” ‘ 検証したいスクリプトのパス

WScript.Echo “【セキュリティチェック開始】” & vbCrLf & targetFile

If VerifyScript(targetFile) Then
WScript.Echo “→【合格】デジタル署名は有効であり、ファイルは改ざんされていません。”
‘ ここに安全が確認された後の本処理を記述します
Else
WScript.Echo “→【警告】署名が無効か、ファイルが改ざんされている可能性があります!実行を中止します。”
‘ 危険なため、処理を中断
End If
End Sub

‘ ——————————————————————————
‘ 関数名: VerifyScript
‘ 引数: strFilePath (String) – 検証するスクリプトファイルのパス
‘ 戻り値: Boolean – 署名が有効な場合は True、無効な場合は False
‘ ——————————————————————————
Function VerifyScript(ByVal strFilePath)
Dim objSigner, objFSO

‘ FileSystemObjectでファイルの存在確認
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
If Not objFSO.FileExists(strFilePath) Then
WScript.Echo “エラー: 指定されたファイルが存在しません。”
VerifyScript = False
Exit Function
End If

On Error Resume Next

‘ 1. Scripting.Signer オブジェクトの生成
‘ ※Windows標準コンポーネントですが、環境によっては権限や登録状況に注意が必要です
Set objSigner = CreateObject(“Scripting.Signer”)

If Err.Number <> 0 Then
WScript.Echo “エラー: Signerオブジェクトの生成に失敗しました (Error: ” & Hex(Err.Number) & “)”
VerifyScript = False
Exit Function
End If

‘ 2. テキストストリーム(またはファイルオブジェクト)を読み込み、署名を検証
‘ Signer.Verify メソッドは、ファイル内のスクリプトテキストと署名を照合します
‘ ※注意: Verifyメソッドの正確な挙動は環境のCryptoAPI依存や署名方式に左右されます
Dim isValid
‘ スクリプトファイル自体を渡して検証(簡易的なアプローチ)
‘ 実務では、対象ファイルをTextStreamとして渡すか、ファイルパスを直接渡します

‘ ここではWSHの標準的なアプローチとして、ファイルオブジェクトを評価させます
‘ ※注意点として、署名オブジェクト自体が内部で信頼されたルート証明書をチェックします

‘ ※解説: 実際のSigner.Verifyは「テキストデータ」と「署名(シグネチャ)」を分離して検証するか、
‘ あるいは署名付きファイルから自動抽出します。

‘ 簡易検証の実行(ここでは分かりやすくオブジェクトの存在とエラー捕捉をメインにしています)
‘ オブジェクトが正常に動作するかどうかのテストコードを配置

‘ 万が一、署名がない場合や破損している場合はエラーが発生します
objSigner.Verify strFilePath

If Err.Number = 0 Then
isValid = True
Else
‘ デバッグ用にエラー内容を出力したい場合はここを有効にしてください
‘ WScript.Echo “詳細エラー: ” & Err.Description
isValid = False
End If

On Error GoTo 0

Set objSigner = Nothing
Set objFSO = Nothing

VerifyScript = isValid
End Function

ここで初心者がハマりやすい「3つの罠」

VBScriptでセキュリティや証明書周りを扱い始めると、必ずと言っていいほど以下の壁にぶつかります。先輩からのアドバイスとして頭の片隅に置いておいてください。

1. 「証明書がない」エラー(自署名の壁)

`Scripting.Signer` で署名を行ったり検証したりするには、Windowsの証明書ストア(Personalストアなど)にコード署名用のデジタル証明書がインストールされている必要があります。
本番環境であれば企業内のCA(認証局)が発行した証明書を使いますが、テストであれば `PowerShell` の `New-SelfSignedCertificate` コマンドレットなどを使って自己署名証明書(オレオレ証明書)を自作して実験することになります。

2. 64ビット環境と32ビット環境の罠

Windowsは64ビット版が主流ですが、VBScript(`wscript.exe` / `cscript.exe`)は環境によって動作するアーキテクチャが切り替わります。特にCOMコンポーネント(今回で言えば `Scripting.Signer`)を呼び出す際、レジストリの参照先違いで「コンポーネントを作成できません」というエラー(エラー番号 `429`)に悩まされることがあります。
スクリプトを実行する際は、意図した方の `cscript.exe` を明示的に呼び出す癖をつけましょう。

3. 「署名=完全に安全」ではないという誤解

デジタル署名は「誰が書いたか(身元)」と「改ざんされていないか(完全性)」を保証するものであり、「コードの中に含まれている処理が安全であること」を保証するものではありません。
例えば、信頼できる開発者が「全ファイルの削除」という悪意ある(あるいはバグった)コードに署名してしまえば、検証は「合格」になってしまいます。署名はあくまでセキュリティの「第一関門」に過ぎないことを忘れないでください。

まとめ:VBScriptを「大人のツール」へ昇華させる

今回は、VBScriptの基礎から一歩進んで、`Scripting.Signer` を用いたデジタル署名と整合性チェックの概念を解説しました。

  • VBScriptは中身が見えるからこそ、改ざんリスクへの備えが重要
  • `Scripting.Signer` を使えば、プログラム自身で署名の妥当性を検証できる
  • 証明書の準備や環境による挙動の違いに注意する

ここをクリアできれば、単なる「自動化お助けスクリプト」ではなく、企業のセキュリティポリシーに準拠した「堅牢なシステム運用ツール」としてVBScriptを使いこなせるようになります。

焦る必要はありません。まずは手元の環境で小さなスクリプトを動かし、仕組みを体感することから始めてみてくださいね。
ここを乗り越えたあなたなら、もうVBScriptの基本はバッチリです!次のステップへ進みましょう。

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