🔏

Sentinel でユーザーの Microsoft365 利用状況を把握

2025/01/22に公開

はじめに

退職したユーザーやテストユーザーなど、M365 ライセンスを付与しているけれども使用していないユーザーはライセンスを無駄に消費していることになります。これらの棚卸の方法は以下のリンクにある標準のレポートや PowerBI を使う方法 (PowerBI Pro が必要) などいくつかありますが、今回は Sentinel で把握する方法を確認します。
https://learn.microsoft.com/ja-jp/microsoft-365/admin/activity-reports/activity-reports?view=o365-worldwide
https://learn.microsoft.com/ja-jp/microsoft-365/admin/usage-analytics/enable-usage-analytics?view=o365-worldwide

取得したログを分析する

Sentinel では本件に関連するログとして Entra ID のサインインログ (SigninLogs) とM365 の Teams/Exchange Online / SharePoint Online ログが取得可能です。(2025.01 時点)
取得方法の詳細説明は割愛しますが、これらは以下コネクタから取得します。
https://learn.microsoft.com/ja-jp/azure/sentinel/data-connectors/microsoft-entra-id
https://learn.microsoft.com/ja-jp/azure/sentinel/data-connectors/microsoft-365

また Sentinel では、UEBA 機能を有効にすると、IdentityInfo テーブルが作成されます。こちらは、テナント内のアカウントが記録されるテーブルです。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/reference/tables/identityinfo

こちらの一覧に対して、Entra ID のサインインログ、Teams/ExO/SPO ログがあるユーザーを突き合わせ、アクセス有無の一覧を表示するクエリを作成します。

// OfficeActivity テーブルで過去 90 日間に活動が記録されたユーザーの一覧を取得
let OfficeActiveUsers = OfficeActivity
| where TimeGenerated >= ago(90d)
| summarize by UserId;
// SigninLogs テーブルで過去 90 日間にサインイン活動が記録されたユーザーの一覧を取得
let SignInActiveUsers = SigninLogs
| where TimeGenerated >= ago(90d)
| summarize by UserPrincipalName;
// IdentityInfo テーブルを参照し、過去14日間のユーザー情報を収集
IdentityInfo
| where TimeGenerated >= ago(14d)
| where isnotempty(AccountUPN) 
| summarize max(TimeGenerated) by AccountUPN,AccountDisplayName,IsAccountEnabled
// IdentityInfo に OfficeActiveUsers を左外部結合し、Office 活動の有無を付加
| join kind=leftouter (OfficeActiveUsers | project UserId | extend OfficeActivity = "Yes") on $left.AccountUPN == $right.UserId
// IdentityInfo に SignInActiveUsers を左外部結合し、サインイン活動の有無を付加
| join kind=leftouter (SignInActiveUsers | project UserPrincipalName | extend SignInActivity = "Yes") on $left.AccountUPN == $right.UserPrincipalName
// 必要なフィールドを選択し、null の場合には No を設定
| project AccountUPN, AccountDisplayName, IsAccountEnabled, SignInActivity = coalesce(SignInActivity, "No"), OfficeActivity = coalesce(OfficeActivity, "No")

出力結果は以下のイメージです。

注意点

  • ログ量が多いテーブルを用いるため、完了しない可能性があります。その場合は 90 日としている期間を短縮して再実行してみてください。
  • OfficeActivity については、一部管理操作や DLP のログも含まれます。そのため、Yes だとしてもM365 サービスを使用していないケースがあります。
  • OfficeActivity は現在 Teams/ExO/SPO ログになるため、これら以外のサービスのみを使用している場合でも No となります。SigninLogs の結果と合わせ、ライセンスの要否をご判断ください。
Microsoft (有志)

Discussion