investigating-m365-entra について
メールボックス侵害、アカウント乗っ取り、OAuth悪用などを扱う、M365とEntra IDのインシデント調査ガイドです。監査・サインインログの分析、永続化の確認、タイムライン作成を扱い、ログ保持期間やライセンスによる可視性の制約も考慮します。
主な機能
- 01監査、サインイン、IDログの把握
- 02異常なサインインとMFAの分析
- 03OAuth許可とアプリ資格情報の調査
- 04メールボックスルールと転送の確認
- 05イベントを相関してタイムラインを作成
活用シーン
- 01ビジネスメール詐欺や不正なメールアクセスの調査
- 02不審なOAuth許可と永続化の追跡
- 03Entra IDのサインイン異常やMFA改ざんの分析
- 04封じ込め前のメールボックス証拠保全
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trilwu/ secskills --skill investigating-m365-entraインストール後、Claude Code で/investigating-m365-entraを入力して読み込まれたか確認します。
詳細
M365 および Entra ID の調査
M365/Entra の調査はオンプレミスの DFIR とは異なり、ディスクイメージもメモリダンプもなく、自分で収集できるイベントログもありません。すべて、Microsoft のログストアに対する API クエリから取得します。そのうちいくつかは、必要なデータを保持するために E5 ライセンスまたは高度な監査が必要です。どのログが存在するか、どのログが欠けているか、どれくらいの期間保持されるかを把握することが、調査の半分を占めます。
使用する場面
- ビジネスメール詐欺(BEC)――メールボックスへの不正アクセス、転送、またはなりすまし
- Entra ID アカウントの侵害――不審なサインイン、トークンのリプレイ、パスワードリスト攻撃
- 不審な OAuth 同意の付与――過剰な権限を持つサードパーティアプリ
- メールボックスルールの改ざん――攻撃者との通信を隠す、またはメールを転送する受信トレイルール
- Azure AD のサインイン異常――不可能な移動、レガシー認証、匿名化ネットワーク
- 条件付きアクセスまたは MFA の改ざん――ポリシー変更、MFA 疲労攻撃
使用しない場面
- より広範なインシデント対応の方法論――
responding-to-incidentsを使用してください - Entra ID の攻撃的なテスト――
attacking-entra-idを使用してください - Azure リソース/サブスクリプションの侵害――
investigating-azure-incidentsを使用してください - AWS の侵害――
investigating-aws-incidentsを使用してください - その他のクラウドインフラストラクチャ(GCP、攻撃的なテスト)――
exploiting-cloud-platformsを使用してください - 調査結果から検知ルールを作成する場合――
engineering-detectionsを使用してください
ログの種類と保持期間
何かをクエリする前に、どのデータがあり、どこまで遡れるかを確認してください。 ログの欠落は調査結果の一つであり、確認を省略する理由にはなりません。
| ログソース | 保持期間(既定) | ライセンス要件 | 主な操作 |
|---|---|---|---|
| 統合監査ログ(UAL) | 既定で 180 日、E5 ライセンスユーザーは 1 年 | MailItemsAccessed には E5 が必要 | MailItemsAccessed、New-InboxRule、Set-Mailbox、同意の付与 |
| Entra ID サインインログ | 30 日 | より長く保持するには Log Analytics へのエクスポートが必要 | サインインイベント、CA 評価、MFA の結果 |
| Entra ID 監査ログ | 30 日 | なし | ロールの割り当て、アプリの登録、資格情報の変更 |
| Identity Protection | 30 日 | P2 が必要 | リスクのあるサインイン、リスク検出 |
| Defender for Cloud Apps | 180 日 | MDCA ライセンスが必要 | アクティビティログ、OAuth アプリのインベントリ |
| メールボックス監査ログ | 90 日(既定で有効) | MailItemsAccessed には E5 が必要 | メールアクセス、代理送信、委任操作 |
データの欠落から結論を導く前に、保持期間を正しく確認してください。 2023 年 10 月 17 日以降、Audit(Standard)の既定の保持期間は180 日です。これは、今も多くの古い資料に記載されている 90 日ではありません。この日付より前に生成されたレコードには、従来の 90 日間の期間が適用されます。1 年の保持期間が既定となるのは、E5(または Purview Audit アドオン)のライセンスを持つユーザーに限られ、その場合も Exchange、SharePoint、OneDrive、Entra ID のみが対象です。そのため、E3 テナントでは UAL の保持期間は 180 日で、MailItemsAccessed はなく、製品内で保持期間を延長することもできません。
保持期間はテナント単位ではなく、ユーザーのライセンスごとに決まります。ライセンスが混在するテナントでは、同じクエリでも、E5 の管理対象ユーザーについては 1 年分、隣接する E3 アカウントについては 180 日分の履歴が返される場合があります。空の結果を「アクティビティなし」と判断する前に、調査対象アカウントのライセンスを確認してください。 このデータ欠落を明記してください。保持期間が延長されている場合は、SIEM または Log Analytics を確認してください。
統合監査ログ(UAL)
UAL は最も豊富なデータを提供する単一のソースです。あらゆる調査はここから始まります。
Connect-ExchangeOnline -UserPrincipalName [email protected]
# Basic search -- always constrain by date and user
Search-UnifiedAuditLog -StartDate "2026-07-01" -EndDate "2026-07-20" `
-UserIds [email protected] -ResultSize 5000
# Search specific operations
Search-UnifiedAuditLog -StartDate "2026-07-01" -EndDate "2026-07-20" `
-Operations "New-InboxRule","Set-InboxRule","Set-Mailbox","Add-MailboxPermission" `
-ResultSize 5000
# MailItemsAccessed (E5 only)
Search-UnifiedAuditLog -StartDate "2026-07-01" -EndDate "2026-07-20" `
-Operations MailItemsAccessed -UserIds [email protected] -ResultSize 5000
# Export -- AuditData field is JSON, expand it
Search-UnifiedAuditLog -StartDate "2026-07-01" -EndDate "2026-07-20" `
-UserIds [email protected] -ResultSize 5000 |
Select-Object CreationDate, UserIds, Operations,
@{N='AuditData';E={$_.AuditData | ConvertFrom-Json | ConvertTo-Json -Depth 10}} |
Export-Csv -Path .\ual_export.csv -NoTypeInformation
主要な UAL 操作
| 操作 | 重要性 |
|---|---|
| MailItemsAccessed | Bind = 単一アイテムの読み取り、Sync = 一括ダウンロード。一括同期は BEC による情報流出の兆候です。 |
| New-InboxRule / Set-InboxRule | 返信を隠したり転送したりするルールです。「invoice」、「payment」、「security」などのキーワードを対象にしていないか確認してください。 |
| Set-Mailbox | ForwardingSMTPAddress または ForwardingAddress の変更は、外部への目立たない転送を示します。 |
| Add-MailboxPermission | FullAccess または SendAs の委任は、永続化を示します。 |
| アプリケーションへの同意 | OAuth の許可です。権限は AuditData に含まれています。 |
| サービス プリンシパルの資格情報の追加 | アプリの登録に新しいシークレット/証明書が追加されます。 |
| HardDelete / SoftDelete | 証拠の破壊を示します。攻撃者が送信済みアイテムを削除しています。 |
UAL では、クエリごとの結果は最大 50,000 件です。上限に達した場合は、日付範囲を狭めてください。
Entra ID サインイン分析
サインインログをクエリし、次の点を確認します。
- 不可能な移動 — 実現不可能な時間内に、遠く離れた場所からアクセスしている
- 匿名 IP — Tor の出口ノード、VPN サービス、既知の匿名化サービス
- レガシー認証 — CA でブロックされていない場合、IMAP、POP3、SMTP AUTH は MFA を回避します
- トークンのリプレイ — 異なる送信元 IP から同じ相関 ID が使われている
- 異常なユーザーエージェント — Python requests、または OWA や Graph にアクセスする PowerShell
// Sign-ins from the compromised account
SigninLogs
| where UserPrincipalName == "[email protected]"
| where TimeGenerated > ago(30d)
| project TimeGenerated, AppDisplayName, IPAddress, Location,
ClientAppUsed, ResultType, AuthenticationRequirement, MfaDetail, RiskState
| order by TimeGenerated asc
// Legacy auth sign-ins that bypass MFA
SigninLogs
| where ClientAppUsed in ("IMAP4", "POP3", "SMTP", "Exchange ActiveSync",
"MAPI Over HTTP", "Outlook Anywhere", "Exchange Web Services")
| where ResultType == 0
| summarize count() by UserPrincipalName, ClientAppUsed, IPAddress
MFA 分析
- ResultType 50074 — MFA が必要ですが、完了していません
- ResultType 50076 — MFA が完了しています(攻撃者が認証要素を持っていたか、MFA 疲労攻撃を利用した可能性があります)
- AuthenticationRequirement = singleFactorAuthentication — MFA は必須ではありません(CA の不備)
MfaDetailを確認してください — 繰り返しのプロンプト後にプッシュ通知を承認している場合は、MFA 疲労攻撃を示します
OAuth と同意付与の調査
不正な同意付与は、M365 侵害で最も見落とされやすい永続化手法です。
Connect-MgGraph -Scopes "Application.Read.All","Directory.Read.All"
# Delegated permission grants -- look for Mail.Read, Files.ReadWrite, etc.
Get-MgOauth2PermissionGrant -All | Where-Object {
$_.Scope -match "Mail.Read|Mail.ReadWrite|Files.ReadWrite|User.Read.All"
} | Format-Table ClientId, ConsentType, Scope, PrincipalId
# Application permission assignments
Get-MgServicePrincipal -All | ForEach-Object {
$sp = $_
Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $sp.Id -ErrorAction SilentlyContinue |
Select-Object @{N='AppName';E={$sp.DisplayName}}, @{N='AppId';E={$sp.AppId}},
PrincipalDisplayName, @{N='Created';E={$_.CreatedDateTime}}
}
| 権限 | リスク |
|---|---|
| Mail.Read / Mail.ReadWrite | メールの情報流出です。不明なアプリで確認された場合は疑わしい操作です。 |
| Files.ReadWrite.All | SharePoint/OneDrive への完全なアクセス権です。 |
| Directory.ReadWrite.All | ユーザー、グループ、ロールを変更できます。 |
| full_access_as_app | Exchange のアプリレベルのメールボックスアクセスです。サードパーティに許可することはほぼありません。 |
委任された同意(1 人のユーザーのデータ)と管理者の同意(テナント全体)を区別してください。 悪意のあるアプリに管理者が同意すると、すべてのユーザーが危険にさらされます。
メールボックスルールのフォレンジック
受信トレイルールは、パスワードをリセットしても残ります。必ず確認してください。
# Inbox rules
Get-InboxRule -Mailbox [email protected] |
Select-Object Name, Enabled, MoveToFolder, DeleteMessage, ForwardTo,
RedirectTo, MarkAsRead | Format-List
# Mailbox-level forwarding
Get-Mailbox -Identity [email protected] |
Select-Object ForwardingSMTPAddress, ForwardingAddress, DeliverToMailboxAndForward
# All mailboxes with external forwarding
Get-Mailbox -ResultSize Unlimited |
Where-Object { $_.ForwardingSMTPAddress -ne $null } |
Select-Object UserPrincipalName, ForwardingSMTPAddress
# Transport rules
Get-TransportRule | Where-Object { $_.RedirectMessageTo -or $_.BlindCopyTo } |
Select-Object Name, State, RedirectMessageTo, BlindCopyTo
# Delegate access
Get-MailboxPermission -Identity [email protected] |
Where-Object { $_.User -ne "NT AUTHORITY\SELF" -and -not $_.IsInherited }
危険な兆候:キーワード(「security」、「password」、「MFA」)を対象とするルール、RSS Feeds/Conversation History への削除または移動を行うルール、名前が空白のルール、フリーメールプロバイダーへの転送、最初の不審なサインイン後に作成されたルール。
eDiscovery とコンテンツ検索
Connect-IPPSSession -UserPrincipalName [email protected]
# Preserve mailbox content -- do this early
Set-Mailbox -Identity [email protected] -LitigationHoldEnabled $true
# Search outbound mail from compromised account
New-ComplianceSearch -Name "IR-2026-042 Outbound" `
-ExchangeLocation [email protected] `
-ContentMatchQuery "sent>=2026-07-01 AND sent<=2026-07-20"
Start-ComplianceSearch -Identity "IR-2026-042 Outbound"
保持ポリシーを適用する前に訴訟ホールドを設定してください。そうしないと、攻撃者が証拠を消去できる可能性があります。
Azure AD 監査ログ分析
// Role assignments
AuditLogs
| where OperationName == "Add member to role"
| extend TargetUser = tostring(TargetResources[0].userPrincipalName),
RoleName = tostring(TargetResources[0].modifiedProperties[1].newValue)
| project TimeGenerated, InitiatedBy, TargetUser, RoleName
// Service principal credential changes (persistence)
AuditLogs
| where OperationName in ("Add service principal credentials",
"Update application - Certificates and secrets management")
| project TimeGenerated, InitiatedBy, TargetResources
// Conditional Access policy changes
AuditLogs
| where OperationName has "conditional access"
| project TimeGenerated, OperationName, InitiatedBy, Result
// MFA method changes (attacker registering their own factor)
AuditLogs
| where OperationName in ("User registered security info",
"Admin registered security info", "User deleted security info")
| project TimeGenerated, OperationName, InitiatedBy, TargetResources
アプリケーション管理者またはグローバル管理者の権限を持つ攻撃者は、既存のアプリ登録に資格情報を追加して、MFA に依存しないアクセスを永続化できます。
Get-MgApplication -All | ForEach-Object {
$app = $_
$app.PasswordCredentials + $app.KeyCredentials | Where-Object {
$_.StartDateTime -gt (Get-Date).AddDays(-30)
} | Select-Object @{N='App';E={$app.DisplayName}}, @{N='AppId';E={$app.AppId}},
StartDateTime, EndDateTime
}
タイムラインの作成
主要な 3 つのログソースを相関させます。
Sign-in logs --> When and where the attacker authenticated
Audit logs --> Configuration changes they made
UAL --> Data they accessed or modified
- 最も早い不審なサインインを起点にします
- そのユーザーのサインイン、UAL、監査イベントを前後 7 日間分取得します
- すべてを 1 つの UTC タイムラインに統合します
- サインイン、偵察、永続化(ルール/転送/OAuth)、目的への攻撃というパターンを探します
UTC Timestamp | Source | Event | Detail
2026-07-12 08:41:22 | SignIn | Sign-in from 198.51.x.x | Nigeria, no MFA
2026-07-12 08:42:05 | UAL | MailItemsAccessed (Sync) | 847 items via Graph
2026-07-12 08:43:18 | UAL | New-InboxRule "." | Delete "security alert"
2026-07-12 08:44:01 | UAL | Set-Mailbox | ForwardingSMTPAddress set
2026-07-12 08:45:33 | UAL | Consent to application | Mail.Read, Mail.Send
2026-07-12 09:12:44 | UAL | Send (SendAs) | Invoice redirect to vendor
封じ込め
対象範囲の特定が完了したら、同時に実行してください。部分的な封じ込めは攻撃者に警告することになります。
# Revoke sessions and reset credentials
Revoke-MgUserSignInSession -UserId [email protected]
Update-MgUser -UserId [email protected] -PasswordProfile @{
Password = (New-Guid).Guid + "!Aa1"; ForceChangePasswordNextSignIn = $true }
# Disable account if active compromise is ongoing
Update-MgUser -UserId [email protected] -AccountEnabled:$false
# Remove attacker inbox rules
Get-InboxRule -Mailbox [email protected] |
Where-Object { $_.Name -match "^\.$|^$" -or $_.DeleteMessage -eq $true } |
Remove-InboxRule -Confirm:$false
# Remove forwarding
Set-Mailbox -Identity [email protected] `
-ForwardingSMTPAddress $null -ForwardingAddress $null `
-DeliverToMailboxAndForward $false
# Remove unauthorized delegate access
Get-MailboxPermission -Identity [email protected] |
Where-Object { $_.User -ne "NT AUTHORITY\SELF" -and -not $_.IsInherited } |
ForEach-Object { Remove-MailboxPermission -Identity [email protected] `
-User $_.User -AccessRights $_.AccessRights -Confirm:$false }
# Block malicious OAuth app
$sp = Get-MgServicePrincipal -Filter "appId eq '<malicious-app-id>'"
Update-MgServicePrincipal -ServicePrincipalId $sp.Id -AccountEnabled:$false
Get-MgOauth2PermissionGrant -Filter "clientId eq '$($sp.Id)'" |
Remove-MgOauth2PermissionGrant
セッションの失効だけでは不十分です。トークンが最大 1 時間有効なままの場合があります。即座にロックアウトするには、アカウントを無効にしてください。封じ込め後、転送が残っていないこと、不明な委任がないこと、不明な OAuth の許可がないこと、攻撃者が登録した MFA 方法がないこと、侵害期間中に作成されたサービス プリンシパルの資格情報がないことを確認してください。
棄却すべき誤った判断
- 「パスワードをリセットしたので、アカウントは安全です。」 更新トークン、OAuth グラント、受信トレイルール、転送、代理人アクセスはすべて、パスワードを リセットしても残ります。セッションを失効させ、すべての永続化メカニズムを 監査してください。
- 「E3 しかないので、メールへのアクセスを調査できません。」 MailItemsAccessed は 利用できませんが、サインインログ、UAL 操作、受信トレイルール、転送は 引き続き確認できます。制約を明示し、利用可能な情報を使って調査してください。
- 「サインイン元は VPN なので、おそらくユーザー本人です。」 出口 IP、ユーザー エージェント、タイミングを、確立されたパターンと照合してください。攻撃者も VPN を利用します。
- 「Defender でアラートが発生しなかったので、侵害はありません。」 Defender の 利用には適切なライセンスプランとポリシー設定が必要です。アラートがないことは、 侵害がない証拠ではありません。
- 「OAuth アプリには委任されたアクセス許可しかありません。」 有効な更新トークンを 持つ委任されたアクセス許可があれば、パスワードを再入力せずにアクセスを 永続化できます。
- 「IP をブロックしたので、攻撃者は締め出されました。」 攻撃者は IP を ローテーションします。ネットワーク経路だけでなく、トークンと認証情報を 失効させてください。
- 「ログは 30 日前までしか遡れないので、侵害はその期間内に始まりました。」 それはあなたの可視性の限界であり、攻撃者の活動期間ではありません。この制約を 記録し、SIEM でより長い保持期間のログを確認してください。
参考資料
responding-to-incidents-- より広範なインシデント対応手法と証拠の取り扱いattacking-entra-id-- Entra ID に対する攻撃手法。攻撃者の手法を理解するのに役立ちますexploiting-cloud-platforms-- M365 以外のクラウドインフラストラクチャへの攻撃engineering-detections-- 調査結果に基づく検知ルールの作成hunting-threats-- M365 および Entra ID のテレメトリを対象としたプロアクティブなハンティング