Azure Activity Logsで削除済みPublic IP証跡を残す方法:露出調査・IR・フォレンジック対策

クラウドの侵害調査で「このグローバルIPは、当時うちのAzure環境に割り当てられていたのか?」を確認できないと、露出範囲の見積もり、インシデント対応、フォレンジックの精度が一気に落ちます。結論から言うと、Azure Public IPは削除後に実IPアドレスをAPIで取り戻せない前提で、削除前からResource IDとIPアドレスの対応表を保存しておく必要があります。Microsoftは2026年4月17日付のTech Community記事で、Azure Activity Logs、Log Analyticsアラート、Azure Automation、永続キャッシュを組み合わせて、削除済みPublic IPの証跡を保持する実装パターンを紹介しました。(TECHCOMMUNITY.MICROSOFT.COM)

目次

Azure Activity Logs / Azure Public IPの最新動向:削除済みPublic IPの対応関係を残す理由

Azure Public IPは、VM、Load Balancer、Application Gateway、Azure Firewall、VPN Gatewayなど、インターネット到達性に関わるリソースで使われます。Microsoft Learnでは、Public IPはAzureリソースへのインバウンド通信や、予測可能なアウトバウンド通信を可能にするものとして説明されています。(Microsoft Learn)

問題は、Public IPリソースを削除した後です。

Azure Activity Logsには、Public IPの作成や削除といったライフサイクル操作が記録されます。しかし、Microsoftが2026年4月17日に公開した記事によると、Microsoft.Network/publicIPAddresses/delete の削除イベントには対象リソースのResource IDは含まれるものの、実際に割り当てられていたIPアドレスは含まれません。さらに削除完了後はPublic IPリソース自体が存在しないため、Resource IDを解決してIPアドレスを取得することもできません。(TECHCOMMUNITY.MICROSOFT.COM)

つまり、削除後にActivity Logsだけを見ても、次のような問いに答えられない可能性があります。

  • このPublic IPはどのサブスクリプション、リソースグループ、ワークロードに紐づいていたのか
  • このIPアドレスは、特定の攻撃通信が観測された時刻に自社管理下だったのか
  • 脆弱なサービスが外部公開されていた期間はいつからいつまでか
  • 脅威インテリジェンスで検知されたIPは、すでに解放済みで別テナントに再利用されていないか

このギャップを埋めるのが、削除前にPublic IPの最終状態を保存する仕組みです。

なぜ削除済みPublic IPの証跡がセキュリティ調査で重要なのか

削除済みPublic IPの対応関係は、単なる資産管理の補助情報ではありません。クラウドセキュリティの現場では、調査結果の正確性を左右する証拠になります。

露出調査では「過去に外部公開されていた対象」を特定する必要がある

脆弱性対応や外部露出レビューでは、現在のAzure Portalに表示されるPublic IP一覧だけでは不十分です。

たとえば、次のようなケースです。

調査シーンPublic IP対応表がない場合の問題残すべき情報
脆弱な管理画面が公開されていた削除済みリソースが一覧に出ず、露出期間を過小評価するIPアドレス、Resource ID、作成・削除時刻、関連リソース
WAFやNSG設定漏れを調べるすでに削除された検証環境を見落とすPublic IP名、リソースグループ、タグ、所有チーム
外部スキャン結果とAzure資産を照合するスキャン時点の所有関係を説明できないスキャン時刻に有効だったIPマッピング
監査で公開範囲を提示する「今は存在しないため不明」という説明になる変更履歴と保持された証跡

特にCI/CD、検証環境、自動スケール、機械学習基盤のように、短時間でリソースが作成・削除される環境では、手動の棚卸しでは追いつきません。Microsoftの記事でも、Azure Machine Learning、CI/CDパイプライン、オートスケール構成のような高頻度に変化するワークロードでは、手動でPublic IPライフサイクルを追跡するのは現実的ではないと説明されています。(TECHCOMMUNITY.MICROSOFT.COM)

インシデント対応では「そのIPは当時、自社のものだったか」が最初の分岐になる

インシデント対応では、IPアドレスの所有関係を誤ると調査全体がずれます。

たとえば、脅威インテリジェンスやSIEMで「あるPublic IPが不審通信元として検知された」とします。このとき確認すべきなのは、現在そのIPが自社環境に存在するかだけではありません。

重要なのは、検知時刻にそのIPが自社のAzureリソースに割り当てられていたかです。

AzureのPublic IPは、削除や解放後に再利用される可能性があります。Microsoftの記事では、削除済みIPを社内所有として記録し続けると、後に別テナントへ割り当てられたIPに対して誤った内部調査を行うリスクがあると述べています。(TECHCOMMUNITY.MICROSOFT.COM)

このリスクは、現場では次のような形で現れます。

判断ミス起こり得る影響
解放済みIPを自社所有と誤認する関係ない通信に対して調査工数を使う
過去に所有していたIPを見落とす本来調べるべき侵害経路を除外してしまう
所有期間を曖昧に扱う顧客・監査人・法務への説明が弱くなる
Resource IDだけを保存する削除後に実IPへ戻せず、証跡として使いにくい

IPアドレスはセキュリティ調査の出発点になりやすい一方で、クラウドでは永続的な所有物とは限りません。だからこそ、IPアドレス、Resource ID、時刻、操作主体をセットで保存することが重要です。

クラウドフォレンジックでは「削除されたもの」を前提に証拠を残す

クラウドフォレンジックで難しいのは、調査対象のリソースが調査開始時点で残っているとは限らないことです。

攻撃者がリソースを削除する場合もあれば、通常の自動化処理で検証環境が消える場合もあります。削除済みPublic IPの対応表がないと、ログ上に残った通信先・通信元IPをAzure上のワークロードに結び付けられません。

Azure Activity Log自体はサブスクリプションレベルのイベントを記録しますが、既定では90日保持であり、より長期の保持や分析には診断設定でLog Analyticsなどへ送信する設計が必要です。(Microsoft Learn)

フォレンジック観点では、少なくとも次の情報を保持対象に含めるべきです。

項目用途
Public IPアドレス外部ログ、脅威インテリジェンス、通信記録との照合
Resource IDAzure上のリソース履歴との紐付け
サブスクリプションID組織・環境単位での責任範囲特定
リソースグループアプリケーションやチーム単位の分類
Public IP名運用チームが認識しやすい識別子
作成・更新・削除イベント時刻所有期間と露出期間の推定
Caller誰が、またはどの自動化が操作したかの確認
Allocation methodStatic/Dynamicの違いによる再利用・変更リスクの評価
関連リソースVM、NIC、Load Balancerなど実ワークロードへの接続

ここでのポイントは、IPアドレス単体ではなく、時点つきの対応関係として保存することです。

Microsoftが示した実装パターンの要点

Microsoftの2026年4月17日付記事では、削除イベントが発生した後にAzure APIからIPアドレスを取り戻すのではなく、Public IPが存在している間にResource IDとIPアドレスの対応を永続キャッシュへ保存しておくという考え方が示されています。実装構成は、Azure Activity Logs、Log Analyticsアラート、Azure Automation Runbook、永続的なResource ID → IPアドレスのマッピングキャッシュです。(TECHCOMMUNITY.MICROSOFT.COM)

全体像は次のとおりです。

構成要素役割実務上のポイント
Azure Activity LogsPublic IPの作成・削除などの操作イベントを検出AdministrativeカテゴリをLog Analyticsへ送る
Log AnalyticsActivity LogをKQLで検索・アラート化Public IPのwrite/delete、NICやLBの関連変更を検出対象にする
Azure Monitor Alert対象イベント発生時にAction Groupを起動評価間隔と検索範囲を短すぎず長すぎず設定する
Action GroupWebhookでRunbookを呼び出すCommon Alert Schemaを使うと後続処理を標準化しやすい
Azure Automation RunbookPublic IP情報を取得し、キャッシュを更新Managed Identityで最小権限にする
永続キャッシュResource IDと最終IPアドレスを保持Automation変数だけでなく、規模に応じて外部ストアも検討する

Microsoftのサンプルでは、既存Public IPを初期取り込みする CacheSeedingRunbook と、ライフサイクルイベントを処理する MainLifecycleRunbook の2種類のRunbookが紹介されています。前者は現在存在するPublic IPを列挙してキャッシュを作り、後者はActivity Logアラートを受けてPublic IP作成・削除イベントを処理します。(TECHCOMMUNITY.MICROSOFT.COM)

実装前に理解すべきAzure Public IP削除時の落とし穴

削除イベントだけ見てもIPアドレスは分からない

Public IP削除時のActivity Logには、対象Public IPリソースのResource IDは残ります。しかし、Microsoftの記事で説明されているとおり、削除イベント自体には割り当て済みの実IPアドレスが含まれません。削除後はリソースが存在しないため、Resource IDを使ってARM APIからIPアドレスを引き直すこともできません。(TECHCOMMUNITY.MICROSOFT.COM)

そのため、削除後の調査で次のような流れを期待している場合は見直しが必要です。

Activity Logで削除イベントを発見
↓
Resource IDを取得
↓
Azure APIでPublic IPリソースを参照
↓
割り当てられていたIPアドレスを取得

この流れは、削除が完了していると成立しない可能性があります。正しい設計は次の形です。

Public IPが存在している間にResource IDとIPアドレスを保存
↓
削除イベントをActivity Logで検知
↓
削除イベントのResource IDをキーにキャッシュを参照
↓
削除済みPublic IPの実IPアドレスを復元的に確認

ここでいう「復元」は、Azureから削除済みリソースを戻すという意味ではありません。事前に保存していた最終既知情報を参照するという意味です。

StaticでもDynamicでも「削除後に証跡が必要」な点は変わらない

Public IPにはStaticとDynamicの割り当てがあります。Microsoft Learnでは、Dynamic Public IPは関連リソースの状態によってアドレスが変わる可能性があり、Static Public IPはPublic IPリソースが削除されるまで解放されないと説明されています。(Microsoft Learn)

ただし、証跡管理の観点では、Staticだから安全とは言い切れません。Microsoft LearnのPublic IP削除手順では、Public IPアドレスは削除後に復旧できないと明記されています。(Microsoft Learn)

整理すると、次のように考えると実務で迷いにくくなります。

種別注意点証跡保持の考え方
Static Public IPリソース削除まではIPが維持されるが、削除後は復旧できない削除前のResource ID → IP対応を必ず保存する
Dynamic Public IP関連リソースの停止・解放などで変更され得る作成時だけでなく更新・関連付け変更も追跡する
Public IP Prefix由来Prefix内で再利用しやすいが、個別IPの利用履歴は別途必要Prefix単位と個別Public IP単位の両方で管理する
一時的な検証用IP削除頻度が高く、手動棚卸しから漏れやすい自動収集を前提にする

Public IPの割り当て方法だけでなく、いつ、どのリソースに、どのIPが割り当てられていたかを履歴として残すことが重要です。

推奨アーキテクチャ:Activity Logsから削除済みPublic IP証跡を残す

ここでは、Microsoftが示した考え方をベースに、実務で導入しやすい構成として整理します。

最小構成

まずは、次の構成を最小構成として考えます。

Azure Activity Logs
  ↓ 診断設定
Log Analytics Workspace
  ↓ KQLアラート
Azure Monitor Alert Rule
  ↓ Action Group / Webhook
Azure Automation Runbook
  ↓ 更新
Resource ID → Public IP の永続キャッシュ

Azure Activity Logは自動的に収集されますが、長期保持やKQLでの継続的な検出を行うには、診断設定でLog Analytics Workspaceなどへ送信する構成が必要です。Microsoft Learnでも、診断設定によってActivity Logをさまざまな宛先へ送信できると説明されています。(Microsoft Learn)

保存先はAutomation変数だけに限定しない

Microsoftの記事では、Automation Accountの変数 PipLastKnownIps を使って、Resource IDからIPアドレスへの対応を保持する例が紹介されています。サンプルRunbookでも、Automation変数からキャッシュを読み込み、Resource IDを正規化して保存・参照する処理が実装されています。(TECHCOMMUNITY.MICROSOFT.COM)

ただし、本番環境では規模や監査要件によって保存先を選ぶべきです。

保存先向いているケース注意点
Azure Automation変数小規模、検証、すばやい導入大量データ、検索性、変更履歴管理には不向き
Log AnalyticsカスタムログSIEM連携、KQL分析、監査検索取り込み形式と保持期間の設計が必要
Azure Table Storage / Cosmos DB高頻度更新、大量Public IP、時系列履歴スキーマ設計とアクセス制御が必要
CMDB / ITSM所有者、アプリ、環境情報と結び付けたいAzureイベントとの同期遅延に注意
SIEMインシデント対応で即座に照合したいノイズ抑制とフィールド正規化が重要

小規模ならAutomation変数で始めても構いません。ただし、エンタープライズ環境では「最終値だけ」では足りないことが多いため、履歴型のストアを検討してください。

おすすめは、最終既知値を高速参照するキャッシュと、監査用の履歴ログを分ける設計です。

高速参照用:Resource ID → 最新IP
監査用  :Resource ID、IP、操作、時刻、Caller、関連リソースを追記保存

この分離により、削除イベント発生時の照合速度と、後日の説明責任を両立できます。

実装手順:削除済みPublic IPの対応表を残す流れ

Activity LogsをLog Analyticsへ送信する

最初に、Azure Activity LogsをLog Analytics Workspaceへ送信します。Microsoftの記事では、Public IPライフサイクルイベントはActivity LogのAdministrativeカテゴリで発行されるため、Azure MonitorのActivity Logから診断設定を追加し、AdministrativeカテゴリをLog Analyticsへ送る流れが示されています。(TECHCOMMUNITY.MICROSOFT.COM)

設定の要点は次のとおりです。

設定項目推奨内容
対象サブスクリプションのActivity Log
カテゴリAdministrative
宛先Log Analytics Workspace
保持期間調査・監査要件に合わせて設計
対象範囲本番だけでなく検証・共有基盤サブスクリプションも含める

Public IPは本番環境だけで使われるとは限りません。検証用サブスクリプションや一時的なPoC環境ほど、外部公開設定が緩くなりがちです。対象範囲を本番に限定しすぎると、実際の露出調査で抜けが出ます。

既存Public IPの初期キャッシュを作る

次に、すでに存在しているPublic IPを棚卸しし、Resource IDとIPアドレスの対応表を作ります。Microsoftのサンプルでは CacheSeedingRunbook がこの役割を担い、現在存在するPublic IPを列挙して PipLastKnownIps に保存する流れになっています。(TECHCOMMUNITY.MICROSOFT.COM)

初期キャッシュに含めたい項目は次のとおりです。

ResourceId
PublicIpAddress
PublicIpName
SubscriptionId
ResourceGroup
Location
AllocationMethod
Sku
AssociatedResource
Tags
CapturedAt

最低限は ResourceIdPublicIpAddress ですが、実務ではこれだけだと所有者やシステム名までたどるのに時間がかかります。タグや関連リソース情報も保存しておくと、インシデント対応時の初動が速くなります。

Public IPの作成・更新・削除イベントを検出する

Log AnalyticsにActivity Logsが入ったら、KQLでPublic IP関連イベントを検出します。MicrosoftのサンプルKQLでは、Public IPのwrite/deleteに加えて、NICのIP構成変更やLoad Balancerの変更も検出対象に含めています。これは、Public IP単体の作成・削除だけでなく、関連付け変更も追跡するためです。(GitHub)

考え方としては、次の操作を監視対象にします。

操作監視理由
Public IP作成新しい外部到達点の発生を検知する
Public IP更新IP、SKU、タグ、DNSラベルなどの変化を追跡する
Public IP削除削除直前・削除後の証跡を確定する
NIC IP構成変更VMへのPublic IP関連付けを把握する
Load Balancer変更フロントエンドIPの変更を把握する
Application Gateway / Firewall関連変更外部公開経路の変更を補足する

本番導入では、Microsoftのサンプルクエリをそのまま使う前に、自社のログ形式、運用対象、関連サービスに合わせて検証してください。特に、Azureサービスの操作ログはリソース種別やAPIバージョン、操作経路によってプロパティの出方が異なる場合があります。

RunbookでIPアドレスを取得し、キャッシュを更新する

Azure Monitor AlertからAction Groupを通じてAzure Automation Runbookを呼び出し、対象Resource IDのPublic IP情報を取得します。Microsoftの MainLifecycleRunbook サンプルでは、ARMからPublic IPのスナップショット取得を試み、削除などで取得できない場合はAutomation変数に保存されたキャッシュへフォールバックする処理が含まれています。(GitHub)

Runbookの処理は、次の順序にすると分かりやすくなります。

ステップ処理内容
1AlertペイロードからResource ID、操作名、時刻、Callerを取り出す
2Resource IDを小文字化・トリムしてキーを正規化する
3Public IPリソースがまだ存在する場合はARM APIで現在値を取得する
4IPアドレスを取得できたらキャッシュを更新する
5削除イベントで現在値が取れない場合はキャッシュを参照する
6結果をJSON、CSV、SIEM向け形式などで出力する
7必要に応じてCMDB、チケット、通知へ連携する

Resource IDの正規化は地味ですが重要です。サブスクリプションIDやリソースグループ名の大文字・小文字、余分な空白でキーがずれると、削除時にキャッシュを引けなくなります。MicrosoftのサンプルRunbookでも、Resource IDを小文字化・トリムしてキャッシュ参照する処理が含まれています。(GitHub)

KQLアラート設計で失敗しやすいポイント

検索範囲と評価間隔が噛み合っていない

アラートの評価間隔が5分なのに検索範囲が5分未満だと、ログ取り込み遅延の影響でイベントを取り逃がす可能性があります。逆に検索範囲を広げすぎると、同じイベントでRunbookが何度も動くことがあります。

最初は次のように設計すると現実的です。

項目初期値の考え方
評価間隔5〜10分程度から検証
検索範囲評価間隔より少し長めに設定
重複排除Resource ID、OperationName、EventTimeで実装
Runbook側の冪等性同じイベントが複数回来ても同じ結果になるようにする

MicrosoftのサンプルKQLでは recent = 10m として直近イベントを検索する例が示されています。実環境では、ログ取り込み遅延、リージョン、サブスクリプション数、アラート頻度に応じて調整してください。(GitHub)

deleteのSucceededだけを見ている

削除完了後にはPublic IPリソースが消えているため、Succeeded のタイミングだけで処理するとIPアドレスをARMから取得できないことがあります。

そのため、削除操作については、開始・受付・成功など複数フェーズを考慮し、できるだけ早い段階でキャッシュ更新またはキャッシュ参照ができるようにします。MicrosoftのサンプルKQLにも、削除フェーズの優先に関するコメントが含まれています。(GitHub)

実務では、次の方針が安全です。

作成・更新イベント:ARMから現在のIPを取得してキャッシュ更新
削除イベント   :ARM取得を試し、失敗したらキャッシュ参照
関連付け変更   :関連リソース情報を更新

Public IPリソース単体だけを見ている

外部公開の実態を把握するには、Public IPそのものだけでなく、どのリソースに関連付いていたかが重要です。

たとえば、同じPublic IPでも、次のようにリスクは変わります。

関連先調査で見るべきポイント
VMのNICSSH/RDP、管理ポート、NSG設定
Load Balancerバックエンドプール、ヘルスプローブ、受信規則
Application Gateway公開FQDN、WAFモード、リスナー
Azure FirewallDNAT規則、アプリケーション規則
NAT Gatewayアウトバウンド通信元としての利用

Public IPの対応表に関連リソースを含めると、「IPがあった」だけでなく「何が外部に出ていたか」まで追いやすくなります。

保存すべきデータモデル例

削除済みPublic IPの証跡を実務で使うなら、最終値だけではなく履歴として保存するのが理想です。次のようなデータモデルを検討してください。

フィールド説明
resourceId/subscriptions/.../publicIPAddresses/pip-prod-01正規化したResource ID
publicIpAddress203.0.113.10割り当てられていたIP
publicIpNamepip-prod-01Public IPリソース名
subscriptionIdxxxxxxxx-xxxx-...サブスクリプション
resourceGrouprg-prod-networkリソースグループ
operationWRITE / DELETE / UPDATE検出した操作
eventTime2026-04-17T10:30:00ZActivity Log上の時刻
capturedAt2026-04-17T10:31:20Zキャッシュ保存時刻
caller[email protected] / spn-...操作主体
allocationMethodStatic / DynamicIP割り当て方式
skuStandardPublic IP SKU
associatedResourceIdNICやLBなど関連リソース
tagsowner=platform所有者・システム情報
sourceActivityLog / Runbook取得元

特に eventTimecapturedAt は分けて保存してください。eventTime はAzureでイベントが発生した時刻、capturedAt は自社の証跡基盤が記録した時刻です。フォレンジックや監査では、この違いが重要になります。

インシデント対応での使い方

削除済みPublic IP対応表は、導入して終わりではありません。インシデント対応手順に組み込むことで価値が出ます。

初動調査の確認項目

不審なIPアドレスが検知されたら、次の順に確認します。

確認項目判断
現在のAzure Public IP一覧に存在するか現在も自社管理下かを確認
削除済みPublic IP対応表に存在するか過去の所有履歴を確認
検知時刻が所有期間内か自社調査対象か、誤検知候補かを分ける
関連リソースは何か影響を受けたワークロードを特定
Callerは誰か正常な自動化か、不審な操作かを確認
NSG・Firewall・WAFログと一致するか通信実態を裏取りする

この対応表があると、「このIPは見覚えがないが、過去に自社が使っていたかもしれない」という曖昧な状態を減らせます。

タイムライン作成に使う

フォレンジックでは、タイムラインを作る際にPublic IPの履歴が役立ちます。

09:10 Public IP作成
09:12 VM NICに関連付け
09:20 外部スキャンで管理ポート検出
09:35 不審ログイン試行
10:05 Public IP削除
10:08 Runbookが削除イベントを検知し、最終IPをキャッシュから出力

このように並べると、攻撃者がリソースを削除したのか、通常のIaCパイプラインが削除したのか、どの期間に外部公開されていたのかを説明しやすくなります。

運用設計:誰が使える証跡にするか

証跡基盤は、保存するだけでは不十分です。Cloud security engineers、incident responders、Azure platform teamsがそれぞれ使える形にする必要があります。

利用者必要な見方提供方法
クラウドセキュリティ担当外部公開資産の履歴、所有者、リスクダッシュボード、定期レポート
インシデント対応担当IPアドレスから過去所有関係を即検索SIEM検索、IR Runbook
Azure基盤チームどの自動化がPublic IPを作成・削除したかActivity Log連携、変更管理
監査・コンプライアンス証跡の保持期間、改ざん耐性、説明可能性エクスポート、長期保存、アクセス制御

重要なのは、IPアドレスをキーにして検索できることです。インシデント対応の入口は、Resource IDではなくIPアドレスであることが多いためです。

セキュリティと権限設計の注意点

Managed Identityは読み取り中心の最小権限にする

Microsoftの記事では、Automation AccountのSystem-assigned Managed Identityを有効化し、Public IPメタデータを取得するためにReader権限を割り当てる構成が紹介されています。(TECHCOMMUNITY.MICROSOFT.COM)

実務では、次の原則で権限を設計します。

対象推奨
Public IP情報の取得Reader相当の読み取り権限
Log Analytics参照必要なWorkspaceへの読み取り権限
キャッシュ更新保存先に対する書き込み権限
サブスクリプション範囲必要最小限。ただし対象漏れに注意
人間のアクセスセキュリティ担当・基盤担当に限定

RunbookがPublic IPを作成・削除できる権限を持つ必要はありません。証跡保持の仕組みに過剰な変更権限を与えると、侵害時の影響が大きくなります。

Webhook URLはシークレットとして扱う

Action GroupからRunbookを呼び出すWebhook URLは、実質的にRunbook起動用の秘密情報です。コードリポジトリ、チケット、Wikiに平文で貼らないようにしてください。

運用上は次を徹底します。

  • Webhook URLをKey Vaultや安全なシークレット管理に格納する
  • 有効期限を設定し、定期的にローテーションする
  • Runbook側で想定外のペイロードを処理しない
  • 実行ログを監視し、不自然な起動回数を検知する

証跡を守る仕組み自体が攻撃経路にならないようにすることが重要です。

よくある設計ミスと対策

よくあるミス何が起きるか対策
削除イベントだけを保存するIPアドレスが分からない作成・更新時にResource ID → IPを保存する
現在のPublic IP一覧だけを棚卸しする削除済み資産を見落とす履歴テーブルを持つ
Resource IDの大文字小文字をそのまま扱うキャッシュ参照に失敗する正規化して保存・検索する
所有者タグを保存しないインシデント時に担当チームが分からないタグ、関連リソース、CMDB情報を結合する
Automation変数だけに大量履歴を詰める検索性・拡張性が不足する履歴はLog AnalyticsやDBへ保存する
保持期間をActivity Log既定に任せる長期調査でログが足りない診断設定と保持ポリシーを設計する
アラートの重複実行を考慮しない同じイベントが何度も記録されるイベントIDやResource IDで冪等化する
検証環境を対象外にする実際の露出源を見落とす全サブスクリプションを分類して対象化する

既存のクラウド資産管理とどうつなぐべきか

削除済みPublic IP対応表は、単独のログとして置いておくより、既存のクラウド資産管理と連携させると効果が高まります。

Defender for CloudやCSPMとの関係

CSPMは現在の設定リスクを見つけるのに強い一方で、削除済みリソースの過去状態をどこまで保持・検索できるかは設計次第です。Public IP証跡は、CSPMの検出結果に「その外部公開がいつ存在したか」を補う役割を持ちます。

たとえば、CSPMで「NSGが広く開いていた」と検出された場合、Public IP履歴と組み合わせることで、外部から到達可能だった期間をより具体的に説明できます。

CMDBとの関係

CMDBにPublic IPの現在値だけを持たせている場合、削除後の追跡に弱くなります。CMDBには、少なくとも次の情報を同期すると実務で使いやすくなります。

  • Public IPアドレス
  • Resource ID
  • 所有チーム
  • アプリケーション名
  • 環境区分
  • 作成・削除時刻
  • 最終確認時刻

特にグローバル企業では、サブスクリプション、リージョン、事業部、管理チームが分かれていることが多いため、IPアドレスから責任範囲へすばやく到達できる設計が必要です。

SIEMとの関係

SIEMには、Public IP対応表をルックアップテーブルとして取り込むと効果的です。

通信ログのsrc_ip / dest_ip
↓
Public IP履歴テーブルと照合
↓
検知時刻に自社所有だったか判定
↓
関連するサブスクリプション・ワークロード・所有者を付与

これにより、アラートの優先度付けがしやすくなります。現在は存在しないPublic IPでも、検知時刻に自社所有だったなら調査対象です。逆に、すでに解放済みで検知時刻に所有していなかったなら、誤検知や外部要因として切り分けられます。

導入チェックリスト

実装に着手する前に、次のチェックリストで準備状況を確認してください。

チェック項目確認内容
対象サブスクリプションを洗い出した本番、検証、共有、サンドボックスを含めたか
Activity LogsをLog Analyticsへ送信しているAdministrativeカテゴリが含まれているか
既存Public IPを初期キャッシュした現在存在するPublic IPを取り込んだか
Public IPの作成・更新・削除を検出できるKQLアラートを検証したか
関連リソース変更も追跡しているNIC、Load Balancerなどを含めたか
Runbookの権限が最小化されているManaged Identityに過剰権限がないか
Resource IDを正規化している大文字小文字や空白差異で失敗しないか
保存先の保持期間を決めた監査・IR要件に合っているか
SIEMまたはCMDBで検索できるIPアドレスから逆引きできるか
削除テストを実施した実際にPublic IP作成→削除でIPが残るか

特に最後の削除テストは必須です。設計上は正しく見えても、アラート遅延、権限不足、Runbookエラー、キャッシュ保存失敗で、実際にはIPアドレスが残っていないことがあります。

まず何から始めるべきか

最初から大規模な証跡基盤を作る必要はありません。まずは、1つのサブスクリプションで次の順に始めるのが現実的です。

1. Activity LogsをLog Analyticsへ送信する
2. 現在存在するPublic IPを一覧化する
3. Resource ID → IPアドレスの初期キャッシュを作る
4. Public IPの作成・削除アラートを設定する
5. Runbookでキャッシュ更新と削除時参照を行う
6. 作成→削除テストで証跡が残ることを確認する
7. SIEM、CMDB、運用手順へ展開する

削除済みPublic IPの証跡は、平時には地味な仕組みです。しかし、侵害調査や外部露出レビューでは「当時そのIPは誰のものだったのか」を答えるための重要な根拠になります。

Azure Activity Logsには削除操作の履歴は残りますが、削除済みPublic IPの実IPアドレスまで後から取得できるとは限りません。だからこそ、Public IPが存在している間にResource IDとIPアドレスの対応を保存し、削除イベント発生時にその対応表を参照できるようにしておくことが重要です。

まずはPublic IPの現在棚卸しとActivity LogsのLog Analytics送信を確認し、次に削除イベントでIPアドレスが残るかを小さく検証してください。その結果をもとに、SIEM連携、CMDB連携、長期保持へ広げるのが、無理のない実装順序です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次