【入門編】【上級者向け】受信メールのヘッダー情報を解析し、なりすましメールの疑いがある場合に隔離フォルダへ移動するセキュリティ自動化 – Outlook VBA解析バイブル

スポンサーリンク
スポンサーリンク

【極限の知見】Outlook VBAで構築する「自律型セキュリティ・エージェント」〜なりすましメールをヘッダー解析で撃退する〜

こんにちは。自動化の深淵へようこそ。

「マクロの記録」を使って、メールを特定のフォルダに移動させる……。そんな初歩的なステップをクリアしたあなたへ、今日は一段上の景色を見せにきました。

今日扱うテーマは、単なる「自動振り分け」ではありません。メールの「DNA」とも言えるヘッダー情報を解析し、巧妙に偽装されたなりすましメールを検知して、隔離(Quarantine)する「自律型セキュリティ・エージェント」の構築です。

これは、プログラミング初学者が「マクロ使い」から「エンジニア」へと脱皮するための、最高の演習になります。準備はいいですか? 一緒に、Outlook VBAの真の力を引き出していきましょう。

1. なぜ「ルール」ではなく「VBA」なのか?

Outlookには標準の「仕分けルール」があります。しかし、攻撃者はそのルールを熟知しています。

「差出人(From)が `ceo@yourcompany.com` なら受信トレイへ」
そんな単純なルールは、攻撃者がヘッダーを偽装した瞬間に無力化されます。

私たちが目指すのは、「見た目の名前」ではなく「通信の足跡」を検証する仕組みです。メールのヘッダーには、そのメールがどこを通り、どのサーバーで認証されたかという、偽装困難なメタデータ(SPFやDKIMなどの情報)が刻まれています。

この「隠れた真実」にアクセスするために、VBAの`PropertyAccessor`という強力な武器が必要になるのです。

2. 核心:メールのDNA「インターネットヘッダー」を暴く

通常のVBA操作では、`MailItem.Subject`(件名)や`MailItem.SenderName`(差出人名)といった、表層的なプロパティしか触れません。

しかし、セキュリティ解析には、メールの生データである「Internet Message Headers」が必要です。これを取得するには、MAPIプロパティという、Outlookの内部的な住所を指定する特殊なコードを使用します。

使う武器:MAPIプロパティタグ

`http://schemas.microsoft.com/mapi/proptag/0x007D001E`

この魔法の文字列を使うことで、私たちはメールの裏側に隠された、すべての通信履歴を手にすることができるのです。

3. 実装:セキュリティ・エージェントのコード

それでは、実際に動くコードを見ていきましょう。
このコードは、新しいメールが届くたびに(`NewMailEx`イベント)、そのヘッダーをスキャンし、`Received-SPF: fail` という文字列を見つけたら、即座に「隔離フォルダ」へ移動させるものです。

※事前にOutlookの受信トレイと同じ階層に「隔離フォルダ」という名前のフォルダを作成しておいてください。

' --- 
' モジュール名: ThisOutlookSession
' 役割: 受信メールのヘッダー解析によるセキュリティ自動化
' ---

Option Explicit

' メールの受信を検知するイベント
Private Sub Application_NewMailEx(ByVal EntryID As String)
    Dim objItem As Object
    Dim objMail As Outlook.MailItem
    Dim strHeaders As String
    Dim objNamespace As Outlook.NameSpace
    Dim objTargetFolder As Outlook.Folder
    Dim objQuarantineFolder As Outlook.Folder
    
    On Error GoTo ErrorHandler

    ' 1. EntryIDからメールオブジェクトを取得
    Set objItem = Application.Session.GetItemFromID(EntryID)
    
    ' 受信したのがメールアイテムでない場合は終了(会議出席依頼などを除外)
    If TypeOf objItem Is Not Outlook.MailItem Then Exit Sub
    Set objMail = objItem

    ' 2. PropertyAccessorを使用して、隠された「インターネットヘッダー」を取得
    ' 0x007D001E は PR_INTERNET_MESSAGE_HEADERS のタグです
    strHeaders = objMail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E")

    ' 3. ヘッダー解析ロジック
    ' ここではシンプルに "Received-SPF: fail" を検索します
    ' 実際の運用では、正規表現(RegExp)を用いてより高度な解析を行うのが理想的です
    If InStr(1, strHeaders, "Received-SPF: fail", vbTextCompare) > 0 Then
        
        Debug.Print "【警告】なりすましの疑いあり: " & objMail.Subject
        
        ' 4. 隔離フォルダへの移動準備
        Set objNamespace = Application.GetNamespace("MAPI")
        ' 受信トレイの直下にある「隔離フォルダ」を取得
        Set objQuarantineFolder = objNamespace.GetDefaultFolder(olFolderInbox).Folders("隔離フォルダ")
        
        ' 5. 隔離実行
        objMail.Move objQuarantineFolder
        
        ' ユーザーへの通知(必要に応じて)
        ' MsgBox "脅威メールを隔離しました: " & objMail.Subject, vbCritical
    End If

CleanUp:
    ' オブジェクトの解放(メモリリークを防ぐエンジニアの嗜み)
    Set objMail = Nothing
    Set objQuarantineFolder = Nothing
    Set objNamespace = Nothing
    Exit Sub

ErrorHandler:
    ' エラーが発生した場合、ログを出力して安全に終了させる
    Debug.Print "Error in NewMailEx: " & Err.Description
    Resume CleanUp
End Sub

4. プロが教える「ここが落とし穴」:3つの鉄則

コードを書いただけで満足してはいけません。実戦投入するには、以下の3点をクリアする必要があります。

① オブジェクトのライフサイクルを管理せよ

コードの最後にある `Set objMail = Nothing`。これは単なるマナーではありません。Outlookは長時間起動し続けるアプリケーションです。適切にオブジェクトを解放(解放)しないと、メモリを食いつぶし、最終的にOutlookがクラッシュする原因になります。「使い終わったら、必ず手放す」。これがエンジニアの鉄則です。

② `NewMailEx` を選ぶ理由

初心者の方は `ItemAdd` イベントを使いがちですが、大量のメールが短時間に届いた場合、`ItemAdd` では処理が追いつかず、メールを見落とすリスクがあります。`NewMailEx` は、メールの `EntryID` を直接渡してくれるため、より高速で確実な処理が可能です。

③ エラーハンドリングは「防衛」である

ネットワークの瞬断や、特殊な形式のメールが届いたとき、コードは必ずどこかで躓きます。`On Error GoTo ErrorHandler` を書かないことは、ブレーキのない車を運転するようなものです。エラーが起きても、システム全体を止めずに「安全に終了する」設計を心がけてください。

5. 次のステップへ:さらなる進化のために

このコードはまだ「プロトタイプ」です。ここからさらにレベルアップしたいなら、以下の課題に挑戦してみてください。

1. 正規表現(RegExp)の導入: `InStr` ではなく、`VBScript.RegExp` を使って、より複雑なパターン(例:DKIM署名の有無など)を解析する。
2. ログ出力: 隔離したメールの情報を、テキストファイルやExcelに自動で記録する。
3. ホワイトリスト機能: 特定の信頼できるドメインからのメールは、SPFが失敗していてもスルーするロジックを追加する。

結びに

いかがでしたか?
単なる「便利ツール」としてのマクロが、少しずつ「知的なエージェント」へと進化していく感覚。これこそが、自動化エンジニアリングの醍醐味です。

最初はエラーの山にぶつかるかもしれません。でも、デバッグ(エラー探し)の過程こそが、あなたの脳を最も成長させてくれます。

ここをクリアすれば、Outlook VBAの基本はバッチリですよ。
さあ、次はあなた自身の手で、最強のガードマンを書き上げてください。応援しています!

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