【テクニカル・上級編】【中級者向け】メール送信時に「添付ファイル名」から機密情報を検知し、送信を中断するセキュリティスキャン機能 – Outlook VBA解析バイブル

スポンサーリンク

【極限の知見】Outlook VBAで実現する、堅牢な送信前セキュリティゲートの実装

現場で戦い続けてきたエンジニア諸君。あなたがたが書くVBAコードは、単なる「自動化」か、それとも「システム」か。

Outlookのメール送信時、ユーザーのヒューマンエラーを検知し、ゲートを閉じる。この単純な要件にこそ、アーキテクトの真価が問われる。今回は、`Application_ItemSend` イベントを軸にした、セキュアかつメモリリークを許さない「送信前スキャン機能」の実装について、その神髄を解き明かす。

—

1. イベントハンドリングの「作法」を再定義する

多くの初学者は `ThisOutlookSession` モジュールに直接コードを書き殴るが、あれはメンテナンス性の観点から見れば悪手だ。クラスモジュールのライフサイクルを意識し、`WithEvents` を用いた明示的なインスタンス管理を行うことこそが、エンタープライズレベルの基礎である。

今回、我々が実装すべきは、添付ファイル名の「正規表現によるフィルタリング」と「イベントの強制的キャンセル」だ。

2. 実装コード:堅牢なセキュリティゲート

以下に、再利用性とパフォーマンスを両立させた実装を示す。

‘ Class Module: SecurityScanner
Option Explicit

Private WithEvents m_App As Outlook.Application

Private Sub Class_Initialize()
Set m_App = Application
End Sub

‘ 送信時イベント:同期的に処理を割り込む
Private Sub m_App_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim mail As MailItem
Dim att As Attachment
Dim forbiddenPattern As String

‘ 型チェックを怠るな。カレンダーアイテムやタスクが流れてきた場合の防御
If Not TypeOf Item Is MailItem Then Exit Sub
Set mail = Item

‘ 監視対象のキーワード(本来は別ファイルやレジストリから読み込むべき)
forbiddenPattern = “秘密|機密|社外秘”

‘ 添付ファイルをスキャン
For Each att In mail.Attachments
If IsMatch(att.FileName, forbiddenPattern) Then
MsgBox “警告: 機密情報を含む添付ファイルが検出されました。” & vbCrLf & _
“対象ファイル: ” & att.FileName, vbCritical, “送信中断”

‘ イベントをキャンセルし、送信を遮断する
Cancel = True
Exit Sub
End If
Next

‘ 明示的なメモリ解放(VBAでは推奨される習慣)
Set mail = Nothing
End Sub

‘ 簡易的なパターンマッチング関数
Private Function IsMatch(ByVal target As String, ByVal pattern As String) As Boolean
Dim p As Variant
For Each p In Split(pattern, “|”)
If target Like p Then
IsMatch = True
Exit Function
End If
Next
End Function

—

3. アーキテクトとして守るべき「3つの鉄則」

① オブジェクト参照の断ち切り

VBAはガベージコレクションが弱い。特にOutlookのオブジェクトモデルは、参照カウントが残っているとプロセスがゾンビ化する。`Set = Nothing` はおまじないではない。オブジェクトのスコープが終了する境界で、確実にリソースを開放せよ。

② Windows APIによる「強制力」の強化

もしユーザーが「送信ボタン」を押した瞬間にプロセスを強制終了させたい場合、VBA単体では限界がある。その際は `User32.dll` の `FindWindow` や `SendMessage` を呼び出し、OSレベルでボタンの有効状態を制御するまで踏み込む必要がある。これが、VBAを「スクリプト」から「制御システム」へと昇華させる境界線だ。

③ パフォーマンスへの配慮

今回のスキャンロジックは同期的に動作する。もし添付ファイルが数GB単位の巨大なファイルや、クラウドストレージ上のリンク(OneDrive添付)である場合、スキャン処理がメール送信のボトルネックになる可能性がある。非同期処理が必要な場合は、VBAからVB.NETで作成したCOMアドインを呼び出し、別スレッドで検証させるのが正攻法だ。

—

4. 現場の君たちへ

今回提示したコードは、あくまで「最小単位のプロトタイプ」に過ぎない。現実の戦場では、正規表現エンジンに `VBScript.RegExp` を使用し、より柔軟なパターンマッチングを実装する必要があるだろう。

また、社内システム連携においては、認証トークンをレジストリではなく、Windowsの「資格情報マネージャー」から取得するように設計せよ。ハードコードされたパスワードほど、セキュリティ上の脆弱性はない。

VBAはレガシーではない。使い手の知性次第で、それは最強のシステム管理ツールへと変貌する。明日からの開発で、単なるコードの記述ではなく、ライフサイクルを制御する「設計」を意識してほしい。

健闘を祈る。

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