2025-12-16
Azure VM 上のサーバーからセキュリティログを収集し、監査や脅威検知に活用したいとお考えではないでしょうか?クラウド上で仮想マシンを運用する場合でも、ログの一元収集と監視はセキュリティ対策上欠かせません。Microsoft Azure には包括的な監視サービスである Azure Monitor が用意されており、これを活用することで Azure 環境のログやメトリックを簡単に収集・分析できます。
(参考)Azure Monitor の概要
特に近年、新しい Azure Monitor エージェント (AMA) と データ収集ルール (Data Collection Rule: DCR) の仕組みが導入され、Azure VM のログ収集がより柔軟かつ強力になりました。
本記事では Azure Monitor のデータ収集ルール (DCR) を使って、Azure VM(Windows Server)からセキュリティイベントログを収集する方法を解説します。具体的には、リモートデスクトップ (RDP) のログオン試行に関するイベント (WindowsのイベントID 4624/4625) を収集し、Log Analytics ワークスペースで分析する手順を実践形式で紹介します。Azure VM の利用を検討している方や、Azure上でのログ収集によるセキュリティ監査を行いたい方の参考になれば幸いです。
Azure Monitor とは、Azure やオンプレミスを含む様々な環境からモニタリングデータを収集・分析し、可視化やアラート発報まで行える統合監視ソリューションです。Azure Monitor を利用すると、クラウド上のリソースやアプリケーションのパフォーマンスや稼働状況を把握し、必要に応じて自動・手動で対応策を講じることができます。具体的には以下のような特徴があります。
要するに、Azure Monitor は Azure 環境の「見える化」と「集中管理」を支える土台です。本記事で扱うログ収集も、Azure Monitor の機能の一部として行われます。
データ収集ルール (Data Collection Rule, DCR) は、Azure Monitor における新しいログ収集設定の単位です。DCR を使うことで「どのデータを収集し、必要に応じてどのように変換し、どこへ送るか」を一元的に定義できます。これは従来のログ収集方法に比べ柔軟で管理しやすいアプローチであり、Azure Monitor エージェント(AMA)と組み合わせて動作します。
DCR の仕組みは ETL(Extract, Transform, Load) パイプラインに似ており、Azure Monitor における統一的なデータ取り込み基盤を活用しますAzure Monitor でのデータ収集ルール (DCR)。具体的に、DCR では次の内容を指定します。
DCR 自体は Azure リソース(※リソースグループ内に作成されるオブジェクト)として管理され、Azure Portalの「Monitor > Data Collection Rules」から一覧・編集できます。DCR を有効化するには、対象とするリソース(例えばVM)に DCR を関連付け (Association) します。Azure VM に AMA がインストールされ接続されると、そのVMは自分に関連付けられたDCRを参照し、収集すべきデータ項目を認識してAzure Monitorへログを送信する仕組みです。
従来、Azure VM のログ収集には Log Analytics エージェント(MMA/OMSエージェント)によるWindowsイベントログ収集やDiagnostic Settingsによるプラットフォームログ転送など複数の方法が存在しました。しかし、DCR/AMA の登場により統一的かつ高機能なログ収集が可能となり、将来的にこれらレガシー方式を置き換える方向です。例えば、旧エージェント(MMA)はAzure Monitor Agent(AMA)+DCRで置き換えられ、Diagnostic Settingsでのカスタムログ収集等も将来DCRに集約される見込みです。
では、DCR を使うことで具体的に何ができるのか、その主なポイントを整理します。
以上のように、DCR は Azure Monitor エージェントとセットで用いることで「何を・どこに・どうやって」を細かく制御できる強力な仕組みです。次章からは、実際の設定手順やLog Analytics連携について詳しく見ていきましょう。
Azure Monitor で収集されたログデータは、通常 Log Analytics ワークスペース に格納されます。Log Analytics はAzure Monitorのログデータをクエリ・分析するための基盤であり、DCRで収集したVMのログも最終的にはワークスペース内のテーブルにレコードとして蓄積されます。たとえば
Event テーブルに格納されます。このテーブルにはSystemやApplication、SecurityといったWindowsイベントログから収集したエントリが保存されます。Syslog テーブルに、パフォーマンスカウンターは Perf テーブルに、IISログは W3CIISLog テーブルに、それぞれ保存されます。Log Analytics 上では、これらのテーブルに対して Kusto クエリ(KQL)を実行することで詳細な分析が可能です。Azure Monitor 上でログを収集した後、Microsoft Sentinel を有効化すれば、Sentinel側の検知ルールや可視化テンプレートも活用できます。また、SentinelにはAMA用の専用コネクタ(「Windows Security Events via AMA」等)が用意されており、これを使うとセキュリティログが Log Analytics 内の SecurityEvent テーブル に格納されます。ただし通常のDCR経由で既に同じSecurityログをEventテーブルに送っている場合、Sentinelコネクタを有効化するとデータが二重に取り込まれる点に注意が必要です。セキュリティ用途でAMAを使う場合は、Azure Monitor (Eventテーブル) で収集する方法かSentinelコネクタ(SecurityEventテーブル)を使う方法か、要件に応じて片方に絞るのが望ましいでしょう。
いずれにせよ、Log Analytics に蓄積されたログはポータル上でクエリを実行して調査したり、ログに基づくアラートルールを作成して自動通知を受けたりすることができます。たとえば、後述するようにRDPの不正ログオンを検知したり、特定イベント発生をトリガーにアラートメールを飛ばすことも容易に実現できます。Azure Monitor と Log Analytics の組み合わせにより、Azure VM 上のログはクラウド上で一元管理・分析できます。
では、実際に Azure Portal 上でデータ収集ルール (DCR) を設定する方法を見てみましょう。ここでは例として Windows Server VM のセキュリティイベントログを収集するケースを想定していますが、Linux VMの場合も流れはほぼ同様です(データソースに「Syslog」を選ぶ等の違いがあります)。



Security!*[System[(EventID=4624 or EventID=4625)]]


DCRを作成しVMに関連付けたことで、Azure Monitor エージェント(AMA)によるログ収集の準備が整いました。Azure VMの場合、DCRにリソースを関連付けると自動的に対象VM上に Azure Monitor エージェント拡張機能がインストールされます。これはAzureポリシーによって裏側で自動実行されるため、ユーザーが手動でVMにエージェントをインストールする必要はありません。特にAzure Portal上でDCRをVMに関連付けた場合はほぼ即座に拡張機能のデプロイが走り、拡張機能名「AzureMonitorWindowsAgent」(Windowsの場合) がVMに追加されます。
※オンプレミスや他クラウドのVMでAzure Arc経由で管理しているケースでは、事前にArc登録とAzure Monitorエージェント拡張のデプロイが必要です。またLinux VMの場合も同様に「AzureMonitorLinuxAgent」拡張が自動インストールされます。Azure VM以外のサーバーについてはAzure Arcのご利用をご検討ください。
エージェントが正しくインストール・起動すると、対象VMは1分ごとにHeartbeat 信号をAzure Monitorに送信します。このHeartbeatは Log Analytics の Heartbeat テーブル で確認でき、エージェント稼働状況の指標となります。DCR適用後はまず Heartbeat が届いているか確認すると良いでしょう。
それでは、具体的に Azure VM 上のセキュリティログ(4624/4625イベント)を収集し、Log Analytics で分析する一連の流れを見てみます。今回は Windows Server 2019 を想定したAzure VMを例とします。
Event | where TimeGenerated > ago(10m) | where Source == "Microsoft-Windows-Security-Auditing" | where EventID in (4624, 4625) | sort by TimeGenerated desc// RDPアクセスをソースIPごとに集計(成功/失敗の回数やユーザー名を分析)
Event | where TimeGenerated > ago(30d) | where Source == "Microsoft-Windows-Security-Auditing"
| where EventID in (4624, 4625) // イベントデータXMLから必要なフィールドを抽出
| parse EventData with * '<Data Name="LogonType">' LogonType:string '</Data>' *
| parse EventData with * '<Data Name="IpAddress">' IpAddress:string '</Data>' *
| parse EventData with * '<Data Name="TargetUserName">' TargetUserName:string '</Data>' *
| parse EventData with * '<Data Name="LogonProcessName">' LogonProcessName:string '</Data>' * // RDP関連のログオン試行に絞り込み
| where ( LogonType == "10" or (LogonType == "3" and (LogonProcessName contains "svchost" or LogonProcessName contains "NtLmSsp")) or (LogonType == "7" and isnotempty(IpAddress)))
| where isnotempty(IpAddress) and IpAddress !in ("-", "::1", "127.0.0.1") // 成功/失敗を示すフラグを付与
| extend AccessResult = case(EventID == 4624, "Success", EventID == 4625, "Failed", "Unknown")
| extend SourceIP = IpAddress // IPアドレス単位で集計
| summarize SuccessCount = countif(AccessResult == "Success"), FailureCount = countif(AccessResult == "Failed"), TotalAttempts = count(), FirstAttempt = min(TimeGenerated), LastAttempt = max(TimeGenerated), UniqueUsers = dcount(TargetUserName), Users = make_set(TargetUserName, 10), LogonTypes = make_set(LogonType) by SourceIP // 見やすく項目選択
| project SourceIP, SuccessCount, FailureCount, TotalAttempts, SuccessRate = round(100.0 * SuccessCount / TotalAttempts, 2), UniqueUsers, Users, LogonTypes, FirstAttempt, LastAttempt
| order by TotalAttempts descかなり長いクエリになりましたが、ポイントを簡単に説明します。
parse 演算子を用いてログオン種別(LogonType)、接続元IP(IpAddress)、対象ユーザー名(TargetUserName)、ログオンプロセス名(LogonProcessName)を抽出しています。それぞれ4624/4625イベントの詳細フィールドです。where 句で LogonType に基づきRDP関連のログオンのみを抽出しています。WindowsではLogonType=10が「リモート対話型(RDPなど)」、LogonType=3が「ネットワーク(NLA経由のRDP含む)」、LogonType=7が「ロック解除(リモートセッション再開)」を意味します。上記クエリではそれらに該当するログだけを残すことで、不要なログオン(例えばコンソールログオン等)を除外しています。また IpAddress フィールドが空やローカルアドレス(::1/127.0.0.1)でないものに限定することで、実際のリモート元IPが存在する記録に絞っています。その上で、EventID 4624を成功(Success)、4625を失敗(Failed) としてフラグを付与し、summarize で 接続元IPアドレスごと に集計しています。各IPからの総ログオン試行回数(TotalAttempts)や成功/失敗の内訳、初回・最終試行日時、延べ利用ユーザー数(UniqueUsers)および実際に使われたユーザー名一覧(Users)などをまとめて算出しています。
以上が、Azure Monitor のDCRを用いた Azure VMログ収集とその分析手順の一例です。今回はWindowsのSecurityログを題材にしましたが、LinuxサーバーについてもSyslogから認証ログを収集したり、カスタムログファイルを収集する設定を行うことで同様の監視を実現できます。
Azure Monitor のデータ収集ルール (DCR) を活用することで、Azure VM のログ収集は非常に柔軟かつ強力になります。従来はエージェントごとやサービスごとに別々だったログ収集設定を、DCRで統一的に管理できるようになりました。特にセキュリティ監査の観点では、必要なログだけを効率よく集めて集中管理し、クラウド上で高度な分析ができる点が大きなメリットです。今回取り上げたRDPログオンの監視は一例に過ぎませんが、同様の手法でAzure VM内の様々なイベント(例: アプリケーションログ、システムログ、カスタムアプリのログなど)を収集・分析できます。Azure MonitorとLog Analyticsを組み合わせれば、オンプレミスで個別にログサーバーを立てる場合と比べてスケーラビリティや可用性の面でも優れ、組織全体のログ管理基盤として活用できるでしょう。
セキュリティ要件が厳しいシステムほど、監視すべきログは増えがちですが、Azure MonitorのDCR機能であれば必要なログを必要なだけ集めて取捨選択し、コストコントロールもしやすいという利点があります。ぜひ Azure 環境の構築に際しては、ログ収集基盤としてAzure MonitorのDCRを活用し、効率的な監視と迅速なインシデント対応につなげてください。
弊社ではAzure構築・導入支援サービスを提供しております。
マイクロソフト出身、 Azure 認定資格を保持するエンジニアが Azure に関するアドバイスや、環境構築などのご支援をいたします。
200を超えるAzureのサービスの中から、どのようなサービスを利用すれば良いのか、どういう組み合わせで利用できるのか、ランニングコストはどれくらいかかるのかなど、様々な角度から生じるお客様の疑問にお答えし、弊社にて Azure 環境の構築や Azure の導入をサポートします。
Azure をより活用し、最適な構成を構築するご支援をいたしますので、ご検討の方はお気軽にお問い合わせください。