yuj1osm's tech blog

クラウド、セキュリティ、AIなど

Microsoft Entra IDとMicrosoft Graph APIによるログ調査 ②サインイン&監査編

3編にわたって「Microsoft Entra IDとMicrosoft Graph APIによるログ調査」について紹介しています。

前回の「①Microsoft Graph API基礎編」では、Microsoft Graph APIからログを取得するために必要な準備とログ取得方法を紹介しました。
今回の「②サインイン&監査編」では、スマートロックアウトやSSPRのログを発生させて、Entra ID管理センターやMicrosoft Graph APIでログを確認していきます。

事前準備

①Microsoft Graph API基礎編」で、各種セキュリティ設定とGraph APIの設定が完了していることが前提です。

今回は以下3ユーザを使用します。

名前 アカウント 用途
ユーザ01 user01@xxx.onmicrosoft.com サインイン
ユーザ02 user02@xxx.onmicrosoft.com スマートロックアウト
ユーザ03 user03@xxx.onmicrosoft.com SSPR

まずは、トークンを取得します。

APIドキュメント 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":"[トークン]"}

access_tokenにTTL1時間のトークンが入っているため、このトークン使って各種ログを取得します。

サインインログ

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

learn.microsoft.com

条件

user01でパスワード認証を実施します。
2回認証失敗したのち成功させます。

結果

Entra管理センター

Entra管理センターでサインインログを確認すると、2回失敗を繰り返したのち成功しています。

各エントリをクリックするとログの詳細を確認できます。

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

Graph API

APIドキュメント

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": "",
                "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": []
        }
    ]
}

スマートロックアウト

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

learn.microsoft.com

条件

閾値を5回に設定し、ユーザ02で5回以上認証失敗したのち成功させます。

ただし、ドキュメント記載の以下の理由により、認証試行を行う際のパスワードは毎回異なるものにします。

スマート ロックアウトでは、直近 3 つの無効なパスワード ハッシュを追跡して、同じパスワードに対するロックアウト カウンターの増分を回避します。 同じ無効なパスワードが複数回入力された場合、この動作によってアカウントがロック アウトされることはありません。

認証失敗すると以下の画面になります。

一方、認証失敗を繰り返し、スマートロックアウト閾値に達すると、エラー内容が変わり、ロックアウトされた旨が表示されます。

ただし、現在の認証試行が悪意のあるユーザによるものと判定されてただけなので、例えばブラウザを変えて認証成功するとサインインできます。

結果

Entra管理センター

複数回の認証失敗ののち成功しているログが確認できます。

ここで注目すべきはエラーコードです。
通常の認証失敗のエラーコードは「50126」に対し、スマートロックアウトが発生したときのエラーコードは「50053」となります。

通常の認証失敗 エラーコード「50126」

スマートロックアウト エラーコード「50053」

前述の通り、同じパスワードで閾値以上の認証失敗をしてもスマートロックアウトにはならない点は注意です。

また、スマートロックアウトは必ずしも設定した閾値ロックアウトされるとは限りません。
Entra IDは複数のデータセンターで同期されており、認証を行うエンドポイントも負荷分散により変化します。
そのため、認証失敗累計の同期が行われる前のエンドポイントで認証を行うことがあるため、閾値ちょうどでロックアウトされないことがあります。
今回は閾値を5回に設定しましたが、何度か試してみると6回や7回でロックアウトされることがありました。

Microsoft Entra データ センター全体のロックアウト状態が同期されます。 ただし、アカウントがロックアウトされるまでに許容されたサインイン試行の失敗の合計数は、構成されたロックアウトしきい値と若干の差異があります。 アカウントがロックアウトされると、すべての Microsoft Entra データ センターのあらゆる場所でロックアウトされます。

Graph API

リクエス

curl -H "Authorization: [トークン]" 'https://graph.microsoft.com/v1.0/auditLogs/signIns?$filter=createdDateTime%20ge%202021-11-22T12:50:00Z%20and%20createdDateTime%20le%202022-11-22T12:55:00Z'

レスポンス

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#auditLogs/signIns",
    "value": [
        {
            "id": "xxxxx",
            "createdDateTime": "2025-03-17T15:42:32Z",
            "userDisplayName": "ユーザ02",
            "userPrincipalName": "user02@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:42:26Z",
            "userDisplayName": "ユーザ02",
            "userPrincipalName": "user02@xxx.onmicrosoft.com",

   (省略)

            "appliedConditionalAccessPolicies": []
        }
    ]
}

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

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

learn.microsoft.com

条件

user03でパスワードリセットを実施します。
パスワードリセットの試行パターンは以下の通りです。

  1. 失敗なく1回でリセット成功
  2. Captcha間違い、電話番号間違い、認証コード間違いを1回ずつ発生させ、リセット成功
  3. 認証コード間違いを複数回繰り返す

パスワードをリセットをするには認証画面で「パスワードを忘れた場合」をクリックします。

1. 失敗なく1回でリセット成功

Captchaを入力します。

電話番号を入力します。

認証コードを入力します。

最後に新しいパスワードを入力してリセット完了です。

2. Captcha間違い、電話番号間違い、認証コード間違いを1回ずつ発生させ、リセット成功

Captchaを意図的に間違えます。

電話番号を意図的に間違えます。

認証コードを意図的に間違えます。

最後に新しいパスワードを入力してリセット完了です。

3. 認証コード間違いを複数回繰り返す

認証コードを3回間違えると以下の画面になり、最初からやり直すように促されます。

最初からやり直し、認証コードで2回間違えると今度は以下の画面になり、24時間自身でパスワードリセットができなくなります。

24時間以内にパスワードリセットを試みると、Captchaの画面でも24時間パスワードリセットできない旨が表示されます。

結果

Entra管理センター

SSPRの挙動は監査ログから確認できます。
2つの赤枠のうち下の赤枠は「1. 失敗なく1回でリセット成功」したログです。
一方、上の赤枠は「2. Captcha間違い、電話番号間違い、認証コード間違いを1回ずつ発生させ、リセット成功」したログです。

両方とも、複数のステップを経てパスワードリセットが成功していることが確認できます。
また、Captcha間違い、電話番号間違い、認証コード間違いといった挙動はログには表れないことが分かります。

続いて、「3. 認証コード間違いを複数回繰り返す」のログを見ると、24時間ロックされた旨のログが確認できます。
このように、SSPRではロックされてはじめて失敗ログが出ます。

Graph API

APIドキュメント learn.microsoft.com

リクエス

curl -k -H "Authorization: Bearer [トークン]" https://graph.microsoft.com/v1.0/auditLogs/directoryAudits?$filter=activityDateTime%20ge%202025-03-17T16:20:00Z%20and%20activityDateTime%20lt%202025-03-17T16:40:05Z

レスポンス

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#auditLogs/directoryAudits",
    "value": [
        {
            "id": "SSPR_xxxxx",
            "category": "UserManagement",
            "correlationId": "xxxxx",
            "result": "failure",
            "resultReason": "User throttle for attempting challenge: UserSMSOtp too many times.",
            "activityDisplayName": "Blocked from self-service password reset",
            "activityDateTime": "2025-03-17T16:40:04.4152716Z",
            "loggedByService": "Self-service Password Management",
            "operationType": "Update",
            "initiatedBy": {
                "app": null,
                "user": {
                    "id": "xxxxx",
                    "displayName": null,
                    "userPrincipalName": "user03@xxx.onmicrosoft.com",
                    "ipAddress": "xx.xx.xx.xx",
                    "userType": null,
                    "homeTenantId": null,
                    "homeTenantName": null
                }
            },
            "targetResources": [
                {
                    "id": "xxxxx",
                    "displayName": "ユーザ03",
                    "type": "User",
                    "userPrincipalName": "user03@xxx.onmicrosoft.com",
                    "groupType": null,
                    "modifiedProperties": []
                }
            ],
            "additionalDetails": []
        },
        {
            "id": "SSPR_xxxxx",
            "category": "UserManagement",
            "correlationId": "xxxxx",
            "result": "failure",
            "resultReason": "User entered too many invalid SMS verification codes and is blocked for 24 hours",
            "activityDisplayName": "Self-service password reset flow activity progress",
            "activityDateTime": "2025-03-17T16:40:04.414272Z",
            "loggedByService": "Self-service Password Management",
            "operationType": "Update",

   (省略)

            "additionalDetails": []
        }
    ]
}

まとめ

今回の「②サインイン&監査編」では、スマートロックアウトやSSPRのログを発生させて、Entra ID管理センターやMicrosoft Graph APIでどのようなログが記録されるのかを確認しました。

ログの発生条件や見方を事前に知っておくことで、より解像度を上げた分析をすることができます。

次回の「③Microsoft Entra ID Protection編」では、意図的にリスクのある挙動を発生させ、Microsoft Entra ID Protectionで検出したログを確認していきます。

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

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