【GraphAPI】Microsoft Graph アクティビティ ログ

# はじめに

Microsoft Graph アクティビティ ログを使用すると、Graph API の実行ログを収集することができます。Graph アクティビティ ログの利用方法についてまとめてみました。

# Microsoft Graph アクティビティ ログ とは？

Graph アクティビティ ログを有効にすると、組織内で実行されたすべての Graph API のログを記録することができます。

以下のような利用方法があります。

* Graph API によって行われた操作の監査証跡として使用する
* Graph API の実行数が極端に増加しているなど、疑わしい使用を検知する

::: note
Graph アクティビティ ログには以下のようなアプリケーションによる Graph API の実行ログがすべて含まれます。
* Teams や Outlook といった Microsoft のアプリケーション
* Graph Explorer や Postman、PowerShell などのクライアントアプリケーション
:::

(参考：Microsoft Graph アクティビティ ログにアクセスする)
https://learn.microsoft.com/ja-jp/graph/microsoft-graph-activity-logs-overview

(参考：Microsoft Graph activity logs is now generally available)
https://techcommunity.microsoft.com/blog/microsoft-entra-blog/microsoft-graph-activity-logs-is-now-generally-available/4094535

# 前提条件

Graph アクティビティ ログを有効化するためには、**"Microsoft Entra ID P2"** ライセンスが必要です。

Microsoft Entra ID ライセンスは Azure ポータルより、以下の手順で確認することができます。
1. 検索ボックスに "Entra ID" と入力し、**[Microsoft Entra ID]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/41c40cb7-5135-4bd2-947b-065588caea17.png)
1. **[概要] - [基本情報]** の **[ライセンス]** に有効なライセンスの名前が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/6ba4ebf4-d28f-4e1c-852d-4529bb0da1c1.png)

(参考：Microsoft Entra ライセンス)
https://learn.microsoft.com/ja-jp/entra/fundamentals/licensing#microsoft-entra-licensing-options

# Graph アクティビティ ログの利用方法

Graph アクティビティ ログを利用するためには、以下の手順で Azure ポータルから設定を行います。
1. ログの保存先となる **"Log Analytics ワークスペース"** を作成します
1. **"診断ログ"** を有効化して Log Analytics ワークスペースへ Graph アクティビティ ログが出力されるようにします

## 事前準備

### 1. Log Analytics ワークスペースの作成
1. **[リソースの作成]** 画面で検索ボックスに **"ログ分析"** と入力して検索します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/ff27b4c3-bc59-4e47-ab18-3d6321cddc54.png)
1. **[ログ分析]** のリソースをクリックます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/c262e0fa-412f-4e64-aeeb-694481dd21fc.png)
1. 任意のリソースグループと名前を設定して、**[確認と作成]** ボタンからリソースを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/76efb1a6-7c70-4abf-bc4e-8c996ae05df0.png)

(参考：Log Analytics ワークスペースを作成する)
https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/quick-create-workspace?tabs=azure-portal

### 2. 診断ログの設定
1. 検索ボックスに "Entra ID" と入力し、**[Microsoft Entra ID]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/41c40cb7-5135-4bd2-947b-065588caea17.png)
1. **[監視] - [診断設定]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/1c4d85ce-74a2-47cf-a77b-8db079bdb29e.png)
1. **[+ 診断設定を追加する]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/241bf303-0458-4277-aca1-5f70b2ab78a6.png)
1. **[MicrosoftGraphActivityLogs]** や 各 SignInLogs に✅を入れ、**[Log Analytics ワークスペースへの送信]** に✅を入れて事前準備で作成したリソースを選択します
   **[保存]** ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/8d9c10c5-71a4-484e-a161-0ff8fbc65f22.png)

診断ログの設定が作成されると、Graph Activity ログが Log Analytics ワークスペースへ保存されるようになります。

::: note
SignInLogs や RiskyUsers もログに含めることによって、Graph Activity ログと合わせて分析することができます。
:::

## ログの確認方法

Graph Activity ログは以下の手順で Log Analytics ワークスペースからログを検索することで確認します。[公開情報](https://learn.microsoft.com/ja-jp/graph/microsoft-graph-activity-logs-overview#azure-monitor-logs-query-examples) に Graph アクティビティログの検索例が記載されています。

1. 診断ログで設定した Log Analytics ワークスペースのリソースの画面で **[ログ]** をクリックします
   初めに表示される画面は "×" で閉じます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/db70a287-e99c-4a78-ae6b-8d321f981fd8.png)
1. 次の画面も "×" で閉じます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/2a286885-5507-4e92-93d5-19430c4000ce.png)
1. 右側のプルダウンで **[KQL モード]** を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/bd85abf5-a2a1-4d36-97f4-df5144f7f46d.png)
1. 公開情報のクエリの例を実行してみます
   a. [スロットリング](https://qiita.com/atsmin77/items/2aec1b2a10a4769ebc47#%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6) による制限が発生しているアプリケーションを検索するクエリ
   ```
   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
   ```
   クエリを入力欄に貼り付けて、**[実行]** ボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/152b8475-9a21-4f7e-b0a7-4483de3072bc.png)
   スロットリングが発生しているアプリについて、ID や対象の Graph API の情報が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/b1c74487-ad7e-4c33-ab8e-4f508f6555ee.png)
   b. Graph API の実行回数の時系列グラフを表示するクエリ
   ```
   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 
       )
   ```
   クエリを入力欄に貼り付けて、**[実行]** ボタンを押すと、実行回数についての時系列グラフが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/f068311e-5901-4eba-b6a1-310fc5e7e596.png)