このチュートリアルでは、次の作業を行う方法について説明します。
- Log Analytics ワークスペースを作成する
- Log Analytics ワークスペースとサインイン ログを統合するように診断設定を構成する
- Kusto クエリ言語 (KQL) を使用してクエリを実行する
前提条件
Log Analytics を使用してアクティビティ ログを分析するには、以下のロールと要件が必要です。
Azure Monitor の適切な役割:
- 監視リーダー
- ログアナリティクス リーダー
- モニタリング貢献者
- Log Analytics 共同作成者
Microsoft Entra ID における適切な役割は次のとおりです。
- レポート閲覧者
- セキュリティリーダー
- グローバル閲覧者
- セキュリティ管理者
Log Analytics ワークスペースを作成する
この手順では、最終的にサインイン ログを送信する Log Analytics ワークスペースを作成します。 ワークスペースを作成する前に、 Azure リソース グループが必要です。
最低でもセキュリティ管理者であり、Log Analytics 共同作成者のアクセス許可を持つユーザーとしてAzure portalにサインインします。
Log Analytics ワークスペースに移動します。
作成を選択します。
[ Log Analytics ワークスペースの作成 ] ページで、次の手順を実行します。
サブスクリプションを選択します。
リソース グループを選択します。
ワークスペースに名前を付けます。
地域を選択します。
[ 確認と作成] を選択します。
[ 作成] を選択し、デプロイを待ちます。 新しいワークスペースを表示するには、ページの更新が必要な場合があります。
診断設定を構成する
ID ログ情報を新しいワークスペースに送信するには、診断設定を構成する必要があります。 Azure と Microsoft Entra にはさまざまな診断設定オプションがあるため、次の一連の手順では Microsoft Entra 管理センターに切り替えて、すべてが ID に関連していることを確認しましょう。
少なくともセキュリティ管理者として Microsoft Entra 管理センターにサインインします。
Entra ID>監視と健康>Diagnostic 設定にアクセスします。
[ 診断設定の追加] を選択します。
[ 診断設定 ] ページで、次の手順を実行します。
診断設定の名前を指定します。
[ ログ] で、[ AuditLogs ] と [ SigninLogs] を選択します。
[ 宛先の詳細] で [ Log Analytics に送信] を選択し、新しいログ分析ワークスペースを選択します。
[保存] を選択します。
選択したログが Log Analytics ワークスペースに入力されるまでに最大 15 分かかる場合があります。
Log Analytics でクエリを実行する
ログが Log Analytics ワークスペースにストリーミングされている場合は、 Kusto クエリ言語 (KQL) を使用してクエリを実行できます。 クエリを実行する特権が最も低いロールは、 レポート閲覧者 ロールです
Entra ID>Monitoring & health>Log Analytics に移動します。
[ 検索 ] ボックスにクエリを入力し、[ 実行] を選択します。
Kusto クエリの例
入力データから 10 個のエントリをランダムに取得する:
SigninLogs | take 10
条件付きアクセスが成功したサインインを確認する:
SigninLogs | where ConditionalAccessStatus == "success" | project UserDisplayName, ConditionalAccessStatus
成功の数をカウントする:
SigninLogs | where ConditionalAccessStatus == "success" | project UserDisplayName, ConditionalAccessStatus | count
成功したサインインの数をユーザー別および日別に集計する:
SigninLogs | where ConditionalAccessStatus == "success" | summarize SuccessfulSign-ins = count() by UserDisplayName, bin(TimeGenerated, 1d)
ユーザーが特定の期間に特定の操作を行った回数を表示する:
AuditLogs | where TimeGenerated > ago(30d) | where OperationName contains "Add member to role" | summarize count() by OperationName, Identity
操作名で結果をピボットする:
AuditLogs | where TimeGenerated > ago(30d) | where OperationName contains "Add member to role" | project OperationName, Identity | evaluate pivot(OperationName)
内部結合を使用して監査ログとサインイン ログをマージする:
AuditLogs |where OperationName contains "Add User" |extend UserPrincipalName = tostring(TargetResources[0].userPrincipalName) | |project TimeGenerated, UserPrincipalName |join kind = inner (SigninLogs) on UserPrincipalName |summarize arg_min(TimeGenerated, *) by UserPrincipalName |extend SigninDate = TimeGenerated
クライアント アプリの種類別にサインイン数を表示する:
SigninLogs | summarize count() by ClientAppUsed
日別にサインイン数をカウントする:
SigninLogs | summarize NumberOfEntries=count() by bin(TimeGenerated, 1d)
5 つのエントリをランダムに取得し、表示したい列を結果に投影する:
SigninLogs | take 5 | project ClientAppUsed, Identity, ConditionalAccessStatus, Status, TimeGenerated
降順における最初の 5 つを取得し、表示したい列を投影する:
SigninLogs | take 5 | project ClientAppUsed, Identity, ConditionalAccessStatus, Status, TimeGenerated
値を他の 2 つの列に結合して新しい列を作成する:
SigninLogs | limit 10 | extend RiskUser = strcat(RiskDetail, "-", Identity) | project RiskUser, ClientAppUsed