Microsoft Graph アクティビティ ログにアクセスする

Microsoft Graph アクティビティ ログは 、Microsoft Graph サービスがテナントに対して受信および処理するすべての HTTP 要求の監査証跡を提供します。 テナント管理者は、Azure Monitor の診断設定を使用してログ収集を有効にし、ダウンストリームの宛先をセットアップできます。 ログは分析のために Log Analytics に送られます。 それらを Azure Storage にエクスポートして長期保存したり、Azure Event Hubs を使用して外部の SIEM ツールにストリーミングしてアラート、分析、またはアーカイブしたりできます。

基幹業務アプリ、API クライアント、SDK、 Microsoft MCP Server for Enterprise にクエリを実行する AI クライアント、および Outlook、Microsoft Teams、Microsoft 管理ポータルなどの Microsoft アプリからの API 要求のログを取得します。

このサービスは、これらの 国内のクラウド展開で利用できます。

グローバル サービス 米国政府機関 L4 米国政府機関 L5 (DOD) 21Vianet が運営する中国
✅ ✅ ✅ ✅

前提条件

Microsoft Graph アクティビティ ログを使用するには、次の特権が必要です。

  • Microsoft Entra ID P1 または P2 テナント ライセンス。
  • サポートされている Microsoft Entra 管理者ロールを持つ管理者。 セキュリティ管理者 は、診断設定のセットアップでサポートされる唯一の最低特権管理者ロールです。
  • 次のいずれかのログ出力先が設定され、対応するログ出力先のデータを使用するためのアクセス許可を持つ Azure サブスクリプション。
    • ログを Azure Monitor に送信するための Azure Log Analytics ワークスペース
    • キーの一覧表示のアクセス許可を持つ Azure Storage アカウント
    • サードパーティのソリューションと接続するための Azure Event Hubs 名前空間

Microsoft Graph アクティビティ ログで利用可能なデータ

この記事では、Logs Analytics インターフェイスで Microsoft Graph アクティビティ ログで使用できる API 要求に関するデータを示します。

ヒント

Microsoft MCP Server for Enterprise への要求には、/enterprise を含む RequestUri があります。

警告

ディレクトリ オブジェクト属性や、Microsoft Graph によって公開されるその他の監査可能なリソースに、シークレットやその他の機密情報 (パスワード、資格情報、アクセス トークン、更新トークン、接続文字列など) を格納しないでください。 Microsoft Graph アクティビティ ログは、その他の監査ログとサインイン ログと共に、要求 URI を含む API 要求に関する詳細をキャプチャします。 要求で渡されたり、そのようなリソースに格納された機密値は、これらのログに記録でき、テナント管理者や、ログのエクスポート先となるダウンストリームの Log Analytics ワークスペース、Azure Storage アカウント、または SIEM システムが読み取ることができます。 ディレクトリ オブジェクト属性は、シークレットのセキュリティで保護されたストアではありません。代わりに、Azure Key Vault などの専用のシークレット ストアを使用します。

列 種類 説明
AadTenantId string Azure AD テナント ID。
ApiVersion string イベントの API バージョン。
AppId string アプリケーションの識別子。
ATContent string 将来使用するために予約されています。
ATContentH string 将来使用するために予約されています。
ATContentP string 将来使用するために予約されています。
_BilledSize real レコード サイズ (バイト単位)
ClientAuthMethod int クライアントが認証された方法を示します。 パブリック クライアントの場合、値は 0 です。 クライアント ID とクライアント シークレットが使用されている場合、値は 1 です。 クライアント証明書を認証に使用した場合、この値は 2 です。
ClientRequestId string 省略可能。 送信時のクライアント要求識別子。 クライアント要求識別子が送信されない場合、値は操作識別子と同じになります。
ConditionalAccessStatus string 要求に対して Microsoft Graph によって記録された条件付きアクセスの状態。 状態が記録されていない場合は空。
DeviceId string 認証要求が発信されたデバイスの識別子。
DurationMs int 要求の期間 (ミリ秒単位)。
IdentityProvider string トークンのサブジェクトを認証した ID プロバイダー。
IPAddress string 要求が発生したクライアントの IP アドレス。
_IsBillable string データの取り込みを課金対象にするかどうかを指定します。 _IsBillableがfalseの場合Azure アカウントにはインジェストの料金が請求されません
Location string 要求を処理したリージョンの名前。
OperationId string バッチの識別子。 バッチ処理されていない要求の場合、これは要求ごとに一意になります。 バッチ処理された要求の場合、これはバッチ内のすべての要求で同じになります。
RequestId string 要求を表す識別子。
RequestMethod string イベントの HTTP メソッド。
RequestUri string 要求の URI。
ResponseSizeBytes int 応答のサイズ (バイト単位)。
ResponseStatusCode int イベントの HTTP 応答状態コード。
役割 string トークン クレームのロール。
Scopes string トークン クレームのスコープ。
ServicePrincipalId string 要求を行う servicePrincipal の識別子。
SessionId string 認証セッションの一意識別子。
SignInActivityId string サインイン アクティビティを表す識別子。
SourceSystem string イベントが収集されたエージェントの種類。 たとえば、Windows エージェントの OpsManager (直接接続または Operations Manager)、すべての Linux エージェントの Linux、または Azure Diagnostics の Azure などです
TenantId string Log Analytics ワークスペース ID
TimeGenerated 日付型 要求が受信された日時。
TokenIssuedAt 日付型 トークンが発行されたタイムスタンプ。
型 string テーブルの名前
UniqueTokenId string 監査対象の変更の実施に使用される API 呼び出しを表す一意のトークン識別子。
UserAgent string 要求に関連するユーザー エージェント情報。
UserId string 要求を行っているユーザーの識別子。
Wids string このユーザーに割り当てられたテナント全体の役割を示します。

Microsoft Graph アクティビティ ログの一般的なユースケース

  • テナントで同意したアプリケーションおよびその他の API クライアントによって行われたすべてのトランザクションを表示します。
  • 侵害されたユーザー アカウントがテナントで実行するアクティビティを検索します。
  • 検出と動作分析を構築して、Microsoft Graph API の疑わしい使用または異常な使用を特定します。
  • アプリケーション アクセス許可の予期しない、または疑わしい特権割り当てを調査します。
  • 極端な呼び出し量など、クライアント アプリケーションの問題のある動作や予期しない動作を特定します。
  • AI アプリケーションや Microsoft MCP Server for Enterprise からの要求を含む、AI クライアントと Microsoft Graph API の対話を監視します。
  • ユーザーまたはアプリによって行われた Microsoft Graph 要求をサインイン情報と関連付けます。

Microsoft Graph アクティビティ ログを設定する

Stream は、Azure portal の診断設定または Azure Resource Manager API を使用してログを記録します。 詳細については、次の記事を参照してください。

保存先を設定するには、次の記事を参照してください。

コスト計画の見積もり

既に Microsoft Entra ID P1 ライセンスをお持ちの場合、Log Analytics ワークスペース、ストレージ アカウント、またはイベント ハブをセットアップするには Azure サブスクリプションが必要です。 Azure サブスクリプションは無料で取得できますが、Azure リソースを使用するには料金が発生します。

ログに記録されるデータの量と発生するコストは、テナントのサイズと、Microsoft Graph API と対話するテナント内のアプリケーションによって大きく異なる場合があります。 次の表は、価格の計算に役立つログ データ サイズの推定値を示しています。 これらの見積もりは一般的な検討用にのみ使用してください。

テナント内のユーザー ストレージ (1 か月あたり GiB) Event Hubs メッセージ (月あたり) Azure Monitor ログ (1 か月あたり GiB)
1,000 14 62,000 15
100,000 1,000 4,800,000 1,200

各サービスの価格の詳細は次のとおりです。

Log Analytics のコスト削減

ログを Log Analytics ワークスペースに取り込むが、特定の列または行を省略するなど、条件によってフィルター処理されたログにのみ関心がある場合は、Microsoft Graph アクティビティ ログ テーブルにワークスペース変換を適用することで、コストを部分的に削減できます。 ワークスペースの変換の詳細、インジェスト コストへの影響、および Microsoft Graph アクティビティ ログへの変換の適用方法については、「Azure Monitor でのデータ収集変換」を参照してください。

Log Analytics のコストを削減するための別の方法は、機能を減らすことで料金を削減する基本的なログ データ プランに切り替えることです。 詳細については、「 テーブルのログデータプランを Basic または Analytics に設定する」を参照してください。

Azure Monitor ログ クエリの例

Microsoft Graph アクティビティ ログを Log Analytics ワークスペースに送信する場合、Kusto 照会言語 (KQL) を使用してログをクエリできます。 Log Analytics ワークスペースでのクエリの詳細については、「Log Analytics を使用した Microsoft Entra アクティビティ ログの分析」を参照してください。 これらのクエリは、データ探索、アラート ルールの構築、Azure ダッシュボードの構築、または Azure Monitor ログ API またはクエリ SDK を使用したカスタム アプリケーションへの統合に使用できます。

次の Kusto クエリは、承認が原因で失敗したグループ リソースに要求を行っている上位 20 個のエンティティを識別します。

MicrosoftGraphActivityLogs
| where TimeGenerated >= ago(3d)
| where ResponseStatusCode == 401 or ResponseStatusCode == 403 
| where RequestUri contains "/groups"
| summarize UniqueRequests=count_distinct(RequestId) by AppId, ServicePrincipalId, UserId
| sort by UniqueRequests desc
| limit 20

次の Kusto クエリは、潜在的に危険なユーザーによってクエリまたは変更されたリソースを識別します。

MicrosoftGraphActivityLogs
| where TimeGenerated > ago(30d)
| join AADRiskyUsers on $left.UserId == $right.Id
| extend resourcePath = replace_string(replace_string(replace_regex(tostring(parse_url(RequestUri).Path), @'(\/)+','/'),'v1.0/',''),'beta/','')
| summarize RequestCount=dcount(RequestId) by UserId, RiskState, resourcePath, RequestMethod, ResponseStatusCode

次の Kusto クエリを使用すると、Microsoft Graph アクティビティ ログとサインイン ログを関連付けることができます。 Microsoft アプリケーションのアクティビティ ログには、一致するサインイン ログ エントリがすべて含まれているとは限りません。 詳細については、「 サインイン ログの既知の制限」を参照してください。

MicrosoftGraphActivityLogs
| where TimeGenerated > ago(7d)
| join kind=leftouter (union SigninLogs, AADNonInteractiveUserSignInLogs, AADServicePrincipalSignInLogs, AADManagedIdentitySignInLogs, ADFSSignInLogs
    | where TimeGenerated > ago(7d))
    on $left.SignInActivityId == $right.UniqueTokenIdentifier

次の Kusto クエリは、スロットリングされているアプリを識別します。

MicrosoftGraphActivityLogs 
| where TimeGenerated > ago(3d) 
| where ResponseStatusCode == 429 
| extend path = replace_string(replace_string(replace_regex(tostring(parse_url(RequestUri).Path), @'(\/)+','//'),'v1.0/',''),'beta/','') 
| extend UriSegments =  extract_all(@'\/([A-z2]+|\$batch)($|\/|\(|\$)',dynamic([1]),tolower(path)) 
| extend OperationResource = strcat_array(UriSegments,'/')| summarize RateLimitedCount=count() by AppId, OperationResource, RequestMethod 
| sort by RateLimitedCount desc 
| limit 100 

次のクエリでは、時系列グラフをレンダリングできます。

MicrosoftGraphActivityLogs 
| where TimeGenerated  between (ago(3d) .. ago(1h))  
| summarize EventCount = count() by bin(TimeGenerated, 10m) 
| render timechart 
    with ( 
    title="Recent traffic patterns", 
    xtitle="Time", 
    ytitle="Requests", 
    legend=hidden 
    )

制限事項

  • Microsoft Graph アクティビティ ログ機能を使用すると、テナント管理者はリソース テナントのログを収集できます。 この機能では、別のテナントにあるマルチテナント アプリケーションのアクティビティを表示することはできません。
  • Azure Monitor の診断設定を使用して Microsoft Graph アクティビティ ログをフィルター処理することはできません。 ただし、Azure Log Analytics ワークスペースではコストを削減するためのオプションを使用できます。 詳細については、「 ワークスペースの変換」を参照してください。
  • ほとんどのリージョンでは、イベントが利用可能であり、30 分以内に構成先に配信されます。 あまり一般的ではないケースですが、イベントによっては宛先に配信されるまでに最大 2 時間かかることがあります。