以下の内容はhttps://yuj1osm.hatenablog.com/entry/2025/03/24/183319より取得しました。


Microsoft Entra IDとMicrosoft Graph APIによるログ調査 ①Microsoft Graph API基礎編

Microsoft Entra IDでログ調査を行うときに、ログの見方や解釈に迷うことがあると思います。
そこで、3編にわたって「Microsoft Entra IDとMicrosoft Graph APIによるログ調査」について紹介します。
以下について、知見を共有できればと思います。

  • Microsoft Entra IDでどのようなログが確認できるか
  • ユーザのどのような挙動の時に、どのようなログが確認できるか
  • サインイン、スマートロックアウト、SSPR、Microsoft Entra ID Protectionのログはどのように確認するか
  • Microsoft Graph APIでどのようにログを取得するか

今回の「①Microsoft Graph API基礎編」では、Microsoft Graph APIからログを取得するために必要な準備とログ取得方法を紹介します。

用語説明

これから利用するサービスを理解するために用語の説明をまとめています。
必要に応じてご確認ください。

Microsoft Entra ID

マイクロソフト社が提供する、クラウドのIDおよびアクセス管理サービスです。
多要素認証、シングルサインオン、条件付きアクセスなど多数のセキュリティ機能が搭載されています。

learn.microsoft.com

サインインログ

Entra IDではテナントのリソースへのすべてのサインインが記録され、エラーパターンを分析することでセキュリティ対策に役立てることができます。

learn.microsoft.com

スマートロックアウト

スマートロックアウトは複数回の認証試行が行われた時、悪意のあるユーザと正規のユーザを識別し、正規のユーザに影響が無いように攻撃者のみをブロックする機能です。

learn.microsoft.com

SSPR(セルフサービス パスワード リセット)

SSPR(セルフサービス パスワード リセット)はユーザ自身でパスワードリセットを行うことを可能にし、管理者やヘルプデスクの運用負荷を下げることができます。

learn.microsoft.com

Microsoft Entra ID Protection

Microsoft Entra ID Protectionは、機械学習によるサインインのリスクや通常とは異なるユーザーの行動を特定し、アクセスをブロック、認証情報を要求、アクセスを制限することができます。
Entra IDのライセンス種別により、閲覧できる情報が制限されます。
本機能をフルに活用するには、Microsoft Entra ID P2ライセンスを利用することが推奨されます。

learn.microsoft.com

Microsoft Graph

Microsoft Graphは、Microsoft EntraやMicrosoft 365などのMicrosoftクラウド サービスに蓄積されたデータにアクセスできるサービスです。

learn.microsoft.com

Microsoft Graph API

Microsoft GraphのREST APIを利用し、Microsoft 365の様々なサービスからデータを取得したり、その他のアプリと連携しデータを処理することが可能です。

learn.microsoft.com

事前設定

これからログを発生させるために必要な設定と、ログを取得するためのGraph APIの設定を行います。

ユーザ追加

Microsoft Entra 管理センターにサインインします。
ライセンスは「Microsoft Entra ID P2」です。

テスト用のユーザを作成します。
後の検証に備え、4ユーザ作成します。

スマートロックアウトの設定

「保護」→「認証方法」→「パスワード保護」で、「ロックアウトしきい値」をデフォルトの10から「5」に変更します。

SSPRの設定

SSPRが適用される範囲はグループ単位となるため、SSPR用のグループを作成し、事前に作成した4ユーザを追加します。

「保護」→「パスワードリセット」→「プロパティ」で、「パスワードリセットのセルフサービスが有効」をなしから「選択済み」に変更します。
グループの選択で先ほど作成したSSPR用のグループを指定します。

「認証方法」は1つで、電子メールと携帯電話にします。

Microsoft Graph APIの設定

「アプリケーション」→「アプリの登録」で、新規登録します。

任意の名前を付け、「この組織ディレクトリのみに含まれるアカウント ([テナント名] のみ - シングル テナント)」を選択して登録します。

アプリが登録されました。

「証明書とシークレット」から新しいクライアントシークレットを作成します。

任意の説明を入力し、有効期限はデフォルトの180日にします。
有効期限は要件に合わせてください。

クライアントシークレットが登録されました。

この値はマスクされるので、その前にメモしておいてください。

続いて、「APIのアクセス許可」で、アクセス許可を追加します。

Microsoft APIから「Microsoft Graph」を選択します。

アクセス許可の種類は、「アプリケーションの許可」を選択します。

デフォルトで user.Read が許可されているので、以下4つの許可を追加します。

  • AuditLog.Read.All 監査ログの取得用
  • Directory.Read.All サインインログの取得用
  • IdentityRiskEvent.Read.All Identity Protection リスク検出の取得用
  • IdentityRiskyUser.Read.All Identity Protection 危険なユーザーの取得用

追加したら、「[テナント名]に管理者の同意を与えます」をクリックします。

状態が緑色になれば完了です。

Microsoft Graph APIでサインインログを取得してみる

Graph APIは以下にドキュメントがあるので、APIの仕様を理解してクエリを作成します。

learn.microsoft.com

今回はサインインログを取得してみます。

サインインログを発生させる

ログを発生させるために、Microsoft 365のサインイン画面で何度か失敗して成功してみます。

Entra管理センターでログ確認

Entra管理センターでは以下のようにログが確認できます。

ちなみに、状態が「中断」となっているログは、何らかのアクティビティが発生したことを意味しています。
例えば、コード50140は以下のような「サインインの状態を維持しますか?」というアクティビティが発生したときに記録されます。

Microsoft Graph APIでログ取得

まずはトークンを取得する必要があるので、以下を参考にリクエストを組み立てて、送信します。
なお、今回はWindowsに標準搭載されているコマンドプロンプトを使用しています。

ドキュメント learn.microsoft.com

リクエス

curl -X POST https://login.microsoftonline.com/[テナントID]/oauth2/v2.0/token -H "Host: login.microsoftonline.com" -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=[クライアントID]" -d "scope=https%3A%2F%2Fgraph.microsoft.com/.default" -d "client_secret=[クライアントシークレット値]" -d "grant_type=client_credentials" 

レスポンス

{"token_type":"Bearer","expires_in":3599,"ext_expires_in":3599,"access_token":"[トークン]"}

レスポンスにトークンが含まれているので、トークンをセットしてリクエストを送信します。

ドキュメント learn.microsoft.com

ちなみに、リクエストにクエリパラメータ― $filter を使うと、時間などでフィルターすることができます。 learn.microsoft.com

リクエス

curl -H "Authorization: Bearer [トークン]" https://graph.microsoft.com/v1.0/auditLogs/signIns?$filter=createdDateTime%20ge%202025-03-17T15:00:00Z%20and%20createdDateTime%20lt%202025-03-17T15:10:00Z

レスポンス

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#auditLogs/signIns",
    "value": [
        {
            "id": "xxxxx",
            "createdDateTime": "2025-03-17T15:08:07Z",
            "userDisplayName": "ユーザ01",
            "userPrincipalName": "user01@xxx.onmicrosoft.com",
            "userId": "xxxxx",
            "appId": "xxxxx",
            "appDisplayName": "OfficeHome",
            "ipAddress": "xx.xx.xx.xx",
            "clientAppUsed": "Browser",
            "correlationId": "xxxxx",
            "conditionalAccessStatus": "notApplied",
            "isInteractive": true,
            "riskDetail": "none",
            "riskLevelAggregated": "none",
            "riskLevelDuringSignIn": "none",
            "riskState": "none",
            "riskEventTypes": [],
            "riskEventTypes_v2": [],
            "resourceDisplayName": "OfficeHome",
            "resourceId": "xxxxx",
            "status": {
                "errorCode": 0,
                "failureReason": "Other.",
                "additionalDetails": "MFA requirement satisfied by claim in the token"
            },
            "deviceDetail": {
                "deviceId": "",
                "displayName": "",
                "operatingSystem": "Windows10",
                "browser": "Firefox 136.0",
                "isCompliant": false,
                "isManaged": false,
                "trustType": ""
            },
            "location": {
                "city": "xxx",
                "state": "xxx",
                "countryOrRegion": "JP",
                "geoCoordinates": {
                    "altitude": null,
                    "latitude": xx.xxxx,
                    "longitude": xx.xxxx
                }
            },
            "appliedConditionalAccessPolicies": []
        },
  {
            "id": "xxxxx",
            "createdDateTime": "2025-03-17T15:08:07Z",
            "userDisplayName": "ユーザ01",
            "userPrincipalName": "user01@xxx.onmicrosoft.com",

   (省略)

            "appliedConditionalAccessPolicies": []
        }
    ]
}

ちなみに、Graph APIで取得できるログは1,000件が上限です。

learn.microsoft.com

最大および既定のページ サイズは 1,000 個のオブジェクトであり、既定では、最新のサインインが最初に返されます。 既定の保持期間内に発生したサインイン イベントMicrosoft Entra IDのみ使用できます。

そのため、1,000件以上のログを取得する場合は、ページング処理が必要になります。

learn.microsoft.com

具体的には、ログに以下のようなキー「@odata.nextLink」が含まれていれば値に格納されているRULで次のログを取得し、キー「@odata.nextLink」が無くなるまで繰り返します。

"@odata.nextLink": "https://graph.microsoft.com/v1.0/users?$top=5&$skiptoken=RFNwdAIAAQAAAD8...AAAAAAAA"

また、Graph APIでリアルタイムにログが取得できるとは限りません。
APIによってログが生成される時間が異なり、数分から数時間の遅延が発生することもあります。
そして、必ずしも全てのログが取得できるとも限りません。
以下に、Entra IDのSLAがまとまっているので意識しておくとよいです。

learn.microsoft.com

その他にも、各種ログの保存期間やAPIのレート制限なども意識しておきましょう。

Graph Explorerでログ取得

ちなみに、Graph Explorerを使うとGUIAPIでログ取得ができます。
開発者がAPIの仕様を確認するときに活用できます。

developer.microsoft.com

Graph Explorerにアクセスし、右上のボタンからサインインします。

次に、API Explorerから「signIns」のGETメソッドを選択すると、クエリがセットされます。
Modify permissionsで必要な権限が表示されるので、Consentボタンから承認します。

任意のパラメータを追記して、「Run query」ボタンをクリックしますると、Response previewにレスポンスが表示されます。

まとめ

今回の「①Microsoft Graph API基礎編」では、Microsoft Graph APIからログを取得するために必要な準備とログ取得方法を紹介しました。
サードパーティツールにログを取り込みたい時などに、Graph API経由でログを取得するといった使い方ができます。

次回の「②サインイン&監査編」では、スマートロックアウトやSSPRのログを発生させて、Entra ID管理センターやMicrosoft Graph APIでログを確認していきます。

Microsoft Entra IDとMicrosoft Graph APIによるログ調査」シリーズ全編はこちら

  1. Microsoft Graph API基礎編
  2. サインイン&監査編
  3. Microsoft Entra ID Protection編



以上の内容はhttps://yuj1osm.hatenablog.com/entry/2025/03/24/183319より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14