Important
この記事の一部の情報は、市販される前に大幅に変更される可能性があるプレリリース製品に関するものです。 Microsoft は、ここに記載されている情報に関して、明示または黙示を問わず、一切の保証を行いません。 Project Perception は現在、限定パブリック プレビュー段階です。 制限付きパブリック プレビュー プログラムは、より広範な一般提供の前に、定義されたプレビュー 期間に対して招待のみの小規模な顧客が Perception を利用できることを意味します。
Project Perception の偵察エージェントは、セキュリティ チームとレッド チームオペレーターに、Azure環境の攻撃者視点を提供します。 資産、ID、アクセス許可、ネットワークの公開を関連付けて、リソースを変更することなく、現実的な攻撃パス、構成の問題、露出リスクを特定します。
この記事を使用して、Recon エージェントの機能を理解し、その前提条件とアクセス許可を確認し、セットアップし、セッションを開始し、レポートを解釈します。
主な機能
偵察エージェントは、Azure環境で複数ステップの AI によって調整された偵察を実行します。
- 読み取り専用評価: リソースを変更することなく、証拠に基づくリスク評価を提供します。
- 他のエージェントの入力: 調査エージェントを含む他のエージェントに結果を提供します。
- 環境ベースの分析: Azure環境からのデータのみを分析します。
Note
Recon エージェントは読み取り専用の評価を生成します。 脆弱性の悪用、ペイロードの実行、リソースの変更、検出のデプロイ、攻撃グラフの保持、組織外での運用は行いません。 エージェントは、読み取り専用 API 呼び出しを使用して環境を分析します。 結果はポイントインタイム スナップショットであり、継続的な監視システムに代わることはありません。
Recon エージェントを使用する理由
Microsoft Security露出管理は、インターネットで公開されている資産、重要なリソース、機密性の高い ID から発生した攻撃パスを継続的に識別します。 これらのマークされた資産と ID を監視しますが、これらの条件を満たしていない任意の開始点からの攻撃パスは生成されません。
偵察エージェントは、侵害想定分析で露出管理を補完します。 アナリストは、Azure サブスクリプション内の任意の資産または ID から始めることができます。 資産は、重大またはインターネットに公開されるように指定する必要はありません。また、ID を機密性の高いものとしてマークする必要はありません。 分析では、「攻撃者がこの資産または ID を既に制御している場合、次にどこに行くことができるか」という質問に答えます。
たとえば、フィッシング攻撃は、Defenderで機密性の高い ID としてマークされていないユーザーを侵害する可能性があります。 露出管理では、通常、パスに別のマーク付き資産が含まれていない限り、そのユーザーからの攻撃パスは生成されません。 Recon エージェントは、ユーザーを起点として、攻撃者が次に侵害を広げる可能性のある経路を明らかにできます。 その後、チームは、これらのパスが重要なリソースや機密性の高い ID を含むインシデントにつながる前に、効果的なチョーク ポイントを識別できます。
このより広範な開始点の範囲により、チームはAzure環境全体の攻撃パスを特定し、重要なパスを時間内に優先順位付けして、セキュリティ オペレーション センター (SOC) インシデントの量を減らすことができます。
| 利用シーン | Recon エージェント |
|---|---|
| マークされていない資産と ID からの攻撃パス | 重要またはインターネットに公開されていない資産や機密性の高いものとしてマークされていない ID など、Azure サブスクリプション内の資産または ID から侵害を想定した攻撃パスを生成します。 |
| 姿勢と露出の可視性 | これらのシグナルをコンテキストで解釈し、ID、アクセス許可、資産、ネットワーク露出の組み合わせによって現実的な攻撃パスを作成する方法について説明します。 |
| アラート調査 | アラートまたは検出が、より広範な攻撃者ルートの一部であるかどうか、およびダウンストリーム資産に到達できる可能性があるかどうかを説明します。 |
| 攻撃パス分析 | サブスクリプション、リソース グループ、または重要な資産を対象とするセッション ベースの偵察を実行し、不足しているデータ、失敗した手順、推定パスを理由にすることができます。 |
| 検出範囲 | 攻撃パスの手順を既存の Defender のアラートとハンティング範囲にマップしてから、SOC が可視性を欠いている可能性のある場所を示します。 |
| 優先順位付け | 選択した環境の悪用可能性、爆発半径、ビジネスへの影響を軽減する可能性が最も高いパスと修正に優先順位を付けます。 |
| 修復計画 | 最も多くの攻撃パスを中断する影響の大きい変更の最小セットを識別し、各修正によって排除されるパスを示します。 |
| アナリストの使いやすさ | アナリスト、赤いチーム、利害関係者が簡単に確認できる、プレーンな言語の説明、証拠に基づく推論、攻撃パスの図を作成します。 |
要するに、Microsoft Defender製品は、露出の検出、保護、管理に役立ちます。 偵察エージェントは、攻撃者が特定のAzure環境でその露出を使用する方法と、最も効果的にリスクを軽減するアクションについて説明します。
始める前の準備
Recon エージェントを設定する前に、次の製品とアクセス許可の要件を確認してください。
前提条件
Recon エージェントを使用するには、次のものが必要です。
- Microsoft Entra ID P2
- Microsoft Defender XDR
- Defender CSPM プランでのMicrosoft Defender for Cloud
- Azure サブスクリプション
必要なアクセス許可
| 権限レベル | 実行可能事項 |
|---|---|
| セキュリティ管理者 | エージェントのインストールと構成: エージェント ID とアクセス許可を設定し、エージェントを削除します。 組織内の少なくとも 1 人のユーザーがこのロールを持っている必要があります。 |
| セキュリティリーダー | エージェントを使用する: エージェント セッションの表示と操作、セッションの開始、セッションの詳細の表示。 |
Tip
エージェントのセットアップを他のユーザーに委任するには、 セキュリティ管理者 ロールを割り当てます。 ロールの割り当てが必要な場合は、Microsoft Entra管理者に問い合わせてください。
追加のアクセス許可が必要
偵察エージェントでは、偵察を実行するためにさらに 2 つのアクセス許可セットが必要です。 各アクセス許可セットを付与するユーザーには、次の表の対応するロールが必要です。
| アクセス許可を付与するために必要なロール | Recon エージェントに付与するアクセス許可 |
|---|---|
| 特権ロール管理者 (Microsoft Entra ロール) |
Microsoft Graph API のアクセス許可: - User.Read.All- Organization.Read.All- GroupMember.Read.All- Application.Read.All- DelegatedPermissionGrant.Read.All- Policy.Read.All- RoleManagement.Read.Directory- AuditLog.Read.All |
| Recon エージェントのターゲット環境であるサブスクリプションに対するロールベースのアクセス制御管理者 |
Azure ロールベースのアクセス制御 (RBAC) ロール (サブスクリプション スコープで割り当て): - 閲覧者 - Key Vault 閲覧者 - Log Analytics 閲覧者 - セキュリティ閲覧者 |
Recon エージェントを設定する
このエージェントを設定するには、「エージェントの セットアップ」の手順に従います。
Note
Recon エージェントは、エージェント ユーザー ID ではなくエージェント ID を使用します。 現在の技術的な制限により、エージェント ユーザー ID は Recon エージェントの読み取り専用操作をサポートしていません。
Recon エージェントのエージェント ID を作成したら、次のスクリプトを使用して、「 必要な追加のアクセス許可」に記載されているアクセス許可を割り当てます。 スクリプト パラメーターを次に示します。
Microsoft Graph APIとAzure RBAC のアクセス許可を付与します。
このスクリプトを実行して、Recon エージェントに必要なMicrosoft Graphアプリケーションのアクセス許可とAzure RBAC アクセス許可を付与します。 パラメーターを使用して、Graph、Azure、または両方のアクセス許可を付与できます。
<#
.SYNOPSIS
Assigns the Graph API permissions and Azure RBAC roles required by Recon.
.DESCRIPTION
Assigns the following Graph API application permissions:
- User.Read.All
- Organization.Read.All
- GroupMember.Read.All
- Application.Read.All
- DelegatedPermissionGrant.Read.All
- Policy.Read.All
- RoleManagement.Read.Directory
- AuditLog.Read.All
Assigns the following Azure RBAC roles at subscription scope:
- Reader
- Key Vault Reader
- Log Analytics Reader
- Security Reader
.PARAMETER TenantId
The Tenant Id.
.PARAMETER AgentId
The Entra ID Object ID (principal ID) of the Agent Identity to assign roles to. To get this value,
1. Go to the Microsoft Defender portal at https://security.microsoft.com/ -> Perception -> Agents
2. Search for the Recon Agent and click on it to open the agent details page
3. Copy the value under the "Identity" section
.PARAMETER Permissions
Permission sets to assign: All, Azure, or Graph. Defaults to All.
.PARAMETER SubscriptionId
One or more Azure subscriptions to receive the Recon RBAC assignments.
Values can be comma-delimited, space-delimited, or supplied as an array.
Required when Permissions is All or Azure.
Example: .\ReconAgent-Permissions.ps1 -TenantId <TenandId> -AgentId <AgentId> -Permissions All -SubscriptionId <SubscriptionId>
Example: .\ReconAgent-Permissions.ps1 -TenantId <TenandId> -AgentId <AgentId> -Permissions Azure -SubscriptionId <SubscriptionId1>, <SubscriptionId2>
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[ValidatePattern('^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$')]
[string]$TenantId,
[Parameter(Mandatory = $true)]
[ValidatePattern('^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$')]
[string]$AgentId,
[ValidateSet('All', 'Azure', 'Graph')]
[string]$Permissions = 'All',
[string[]]$SubscriptionId,
[Parameter(ValueFromRemainingArguments = $true, DontShow = $true)]
[string[]]$AdditionalSubscriptionId
)
$ErrorActionPreference = 'Stop'
$subscriptionIds = @(@($SubscriptionId) + @($AdditionalSubscriptionId) |
ForEach-Object { $_ -split '[,\s]+' } |
Where-Object { -not [string]::IsNullOrWhiteSpace($_) } |
ForEach-Object { $_.Trim() } |
Sort-Object -Unique)
if ($Permissions -in @('All', 'Azure') -and $subscriptionIds.Count -eq 0) {
throw '-SubscriptionId requires at least one subscription GUID when -Permissions is All or Azure.'
}
foreach ($id in $subscriptionIds) {
if ($id -notmatch '^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$') {
throw "Invalid subscription ID '$id'. Supply one or more GUIDs separated by commas or spaces."
}
}
function Invoke-AzJson {
param(
[Parameter(Mandatory)]
[string[]]$Arguments
)
$output = & az @Arguments 2>&1
if ($LASTEXITCODE -ne 0) {
throw "az $($Arguments -join ' ') failed: $($output -join [Environment]::NewLine)"
}
if (-not $output) {
return $null
}
return ($output -join [Environment]::NewLine) | ConvertFrom-Json
}
function Test-AzureActionAllowed {
param(
[Parameter(Mandatory)]
[string]$Scope,
[Parameter(Mandatory)]
[string]$Action
)
$permissionsResponse = Invoke-AzJson -Arguments @(
'rest', '--method', 'GET',
'--url', "https://management.azure.com$Scope/providers/Microsoft.Authorization/permissions?api-version=2022-04-01",
'--output', 'json'
)
foreach ($permission in @($permissionsResponse.value)) {
$isAllowed = @($permission.actions | Where-Object {
$Action -like [string]$_
}).Count -gt 0
$isExcluded = @($permission.notActions | Where-Object {
$Action -like [string]$_
}).Count -gt 0
if ($isAllowed -and -not $isExcluded) {
return $true
}
}
return $false
}
function Write-Section {
param([string]$Title)
Write-Host ''
Write-Host $Title -ForegroundColor Cyan
Write-Host ('-' * $Title.Length) -ForegroundColor DarkGray
}
function Write-Step {
param(
[string]$Message,
[ValidateSet('Info', 'OK', 'Warn', 'Err', 'Step')]
[string]$Level = 'Info'
)
$color = switch ($Level) {
'OK' { 'Green' }
'Warn' { 'Yellow' }
'Err' { 'Red' }
'Step' { 'Cyan' }
default { 'Gray' }
}
$prefix = switch ($Level) {
'OK' { '[ OK ]' }
'Warn' { '[WARN]' }
'Err' { '[FAIL]' }
'Step' { '[STEP]' }
default { '[ -- ]' }
}
if ($Level -eq 'Step') {
Write-Host ''
}
Write-Host (
'{0} {1} {2}' -f
(Get-Date -Format 'HH:mm:ss'), $prefix, $Message
) -ForegroundColor $color
}
function Write-ConsoleResults {
param([object[]]$Results)
Write-Section 'Granular Recon permission assignment'
Write-Step `
-Message "Agent: Recon, EntraObjectId: $AgentId" `
-Level Step
foreach ($result in @($Results |
Sort-Object PermissionSet, SubscriptionId, Role)) {
$category = if ($result.PermissionSet -eq 'Graph') {
'Microsoft Graph permission'
}
else {
'Azure RBAC'
}
$value = if ($result.PermissionSet -eq 'Azure') {
"{0} ({1})" -f $result.Role, $result.Scope
}
else {
"Graph $($result.Role)"
}
$assignmentResult = switch ($result.Status) {
'Already assigned' { 'Already existed' }
'Assigned' { 'Added' }
default { $result.Status }
}
$level = if ($result.Status -eq 'Failed') { 'Err' } else { 'OK' }
Write-Step `
-Message "$category`: $value - $assignmentResult" `
-Level $level
if ($result.Status -eq 'Failed' -and
-not [string]::IsNullOrWhiteSpace([string]$result.Details)) {
Write-Host (" Details: {0}" -f $result.Details) `
-ForegroundColor DarkGray
}
}
}
if (-not (Get-Command az -ErrorAction SilentlyContinue)) {
throw 'Azure CLI is required but the az command was not found.'
}
Write-Host ''
Write-Host 'Recon Agent Permission Assignment' -ForegroundColor Cyan
Write-Host 'Assigns required Microsoft Graph and Azure RBAC permissions' `
-ForegroundColor DarkGray
Write-Host "Permission set: $Permissions"
Write-Host "Tenant: $TenantId"
# Ensure Azure CLI is signed in to the requested tenant.
$account = $null
try {
$account = Invoke-AzJson -Arguments @('account', 'show', '--output', 'json')
}
catch {
# No usable cached Azure CLI session.
}
if (-not $account -or [string]$account.tenantId -ne $TenantId) {
& az login --tenant $TenantId --allow-no-subscriptions | Out-Null
if ($LASTEXITCODE -ne 0) {
throw "Azure CLI sign-in to tenant $TenantId failed."
}
}
$agentServicePrincipal = Invoke-AzJson -Arguments @(
'rest', '--method', 'GET',
'--url', "https://graph.microsoft.com/v1.0/servicePrincipals/$AgentId",
'--output', 'json'
)
if ([string]$agentServicePrincipal.id -ne $AgentId) {
throw "Agent service principal $AgentId could not be resolved in tenant $TenantId."
}
$results = @()
if ($Permissions -in @('All', 'Graph')) {
$graphToken = & az account get-access-token `
--tenant $TenantId `
--resource-type ms-graph `
--query accessToken `
--output tsv 2>&1
if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace([string]$graphToken)) {
throw "Unable to acquire a Microsoft Graph token: $($graphToken -join [Environment]::NewLine)"
}
$graphHeaders = @{
Authorization = "Bearer $([string]$graphToken)"
Accept = 'application/json'
}
# Graph API roles (AppRoleId -> Role Name)
$graphRoleIds = @{
'df021288-bdef-4463-88db-98f22de89214' = 'User.Read.All'
'498476ce-e0fe-48b0-b801-37ba7e2685c6' = 'Organization.Read.All'
'98830695-27a2-44f7-8c18-0c3ebc9698f6' = 'GroupMember.Read.All'
'9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30' = 'Application.Read.All'
'81b4724a-58aa-41c1-8a55-84ef97466587' = 'DelegatedPermissionGrant.Read.All'
'246dd0d5-5bd0-4def-940b-0421030a5b68' = 'Policy.Read.All'
'483bed4a-2ad3-4361-a73b-c83ccdbdc53c' = 'RoleManagement.Read.Directory'
'b0afded3-3588-46d8-8b3d-9842eff778da' = 'AuditLog.Read.All'
}
$graphServicePrincipal = Invoke-AzJson -Arguments @(
'ad', 'sp', 'show',
'--id', '00000003-0000-0000-c000-000000000000',
'--output', 'json'
)
$GraphObjectId = [string]$graphServicePrincipal.id
if ([string]::IsNullOrWhiteSpace($GraphObjectId)) {
throw "Microsoft Graph service principal could not be resolved in tenant $TenantId."
}
$existingAssignmentsResponse = Invoke-AzJson -Arguments @(
'rest', '--method', 'GET',
'--url', "https://graph.microsoft.com/v1.0/servicePrincipals/$AgentId/appRoleAssignments",
'--output', 'json'
)
$existingAssignments = @($existingAssignmentsResponse.value)
foreach ($rid in $graphRoleIds.Keys) {
$roleName = $graphRoleIds[$rid]
$existingAssignment = $existingAssignments |
Where-Object {
[string]$_.resourceId -eq $GraphObjectId -and
[string]$_.appRoleId -eq $rid
} |
Select-Object -First 1
if ($existingAssignment) {
$results += [pscustomobject]@{
PermissionSet = 'Graph'
Role = $roleName
Status = 'Already assigned'
Details = ''
}
continue
}
$body = @{
principalId = $AgentId
resourceId = $GraphObjectId
appRoleId = $rid
} | ConvertTo-Json -Compress
try {
Invoke-RestMethod `
-Method Post `
-Uri "https://graph.microsoft.com/v1.0/servicePrincipals/$AgentId/appRoleAssignments" `
-Headers $graphHeaders `
-ContentType 'application/json' `
-Body $body | Out-Null
$results += [pscustomobject]@{
PermissionSet = 'Graph'
Role = $roleName
Status = 'Assigned'
Details = ''
}
}
catch {
$details = if ($_.ErrorDetails.Message) {
$_.ErrorDetails.Message
}
else {
$_.Exception.Message
}
$results += [pscustomobject]@{
PermissionSet = 'Graph'
Role = $roleName
Status = 'Failed'
Details = $details
}
}
}
}
if ($Permissions -in @('All', 'Azure')) {
$azureRoles = @(
'Reader'
'Key Vault Reader'
'Log Analytics Reader'
'Security Reader'
)
foreach ($currentSubscriptionId in $subscriptionIds) {
$subscription = Invoke-AzJson -Arguments @(
'account', 'show',
'--subscription', $currentSubscriptionId,
'--output', 'json'
)
if ([string]$subscription.tenantId -ne $TenantId) {
throw "Subscription $currentSubscriptionId belongs to tenant $($subscription.tenantId), not requested tenant $TenantId."
}
& az account set --subscription $currentSubscriptionId
if ($LASTEXITCODE -ne 0) {
throw "Unable to select Azure subscription $currentSubscriptionId."
}
$scope = "/subscriptions/$currentSubscriptionId"
try {
$canWriteRoleAssignments = Test-AzureActionAllowed `
-Scope $scope `
-Action 'Microsoft.Authorization/roleAssignments/write'
if (-not $canWriteRoleAssignments) {
throw "The signed-in account does not have Microsoft.Authorization/roleAssignments/write at $scope. Assign Owner, User Access Administrator, or Role Based Access Control Administrator at this scope or a parent scope."
}
}
catch {
$results += [pscustomobject]@{
PermissionSet = 'Azure'
SubscriptionId = $currentSubscriptionId
Scope = $scope
Role = 'Role assignment preflight'
Status = 'Failed'
Details = $_.Exception.Message
}
continue
}
foreach ($roleName in $azureRoles) {
try {
$existingRoleAssignments = @(Invoke-AzJson -Arguments @(
'role', 'assignment', 'list',
'--assignee-object-id', $AgentId,
'--role', $roleName,
'--scope', $scope,
'--output', 'json'
))
if ($existingRoleAssignments.Count -gt 0) {
$results += [pscustomobject]@{
PermissionSet = 'Azure'
SubscriptionId = $currentSubscriptionId
Scope = $scope
Role = $roleName
Status = 'Already assigned'
Details = ''
}
continue
}
Invoke-AzJson -Arguments @(
'role', 'assignment', 'create',
'--assignee-object-id', $AgentId,
'--assignee-principal-type', 'ServicePrincipal',
'--role', $roleName,
'--scope', $scope,
'--output', 'json'
) | Out-Null
$results += [pscustomobject]@{
PermissionSet = 'Azure'
SubscriptionId = $currentSubscriptionId
Scope = $scope
Role = $roleName
Status = 'Assigned'
Details = ''
}
}
catch {
$results += [pscustomobject]@{
PermissionSet = 'Azure'
SubscriptionId = $currentSubscriptionId
Scope = $scope
Role = $roleName
Status = 'Failed'
Details = $_.Exception.Message
}
}
}
}
}
Write-ConsoleResults -Results $results
Write-Host
if ($results.Status -contains 'Failed') {
exit 1
}
exit 0
他のユーザーのアクセスを許可する
エージェントへのアクセスは、Microsoft Defenderの既存のセキュリティ ロールによって制御されます。 セキュリティ閲覧者またはセキュリティ管理者ロールを持つユーザーは、エージェントのセットアップ後にエージェント セッションを表示および操作できます。
Recon エージェント セッションを開始する
使用可能なセッション エントリ ポイントの詳細については、「 新しいセッションを開始する」を参照してください。
Recon エージェントは、次のプレイブックに参加します。
| プレイブック | 必須の入力 |
|---|---|
| ID リスクを評価する | Azure サブスクリプションとマネージド ID。 |
| 攻撃パスを特定する | Azure サブスクリプション。 |
| 脅威から保護する | 脅威インテリジェンスに関する記事。 |
ID リスクの評価セッションを開始するには、次の手順に従います。
ナビゲーション ウィンドウで、 Perception>Sessions を選択します。
[ 新しいセッション] を選択します。
[ ID リスクの評価 ] プレイブックを選択します。
[ 追加の入力が必要] パネルが 開きます。 次の 2 つの入力が必要です。
フィールド Description Azure サブスクリプション セッションの対象範囲を指定する Azure サブスクリプションの ID または名前。 各セッションは 1 つのサブスクリプションに制限されます。 管理者は Recon Agent のセットアップ中にこの一覧を事前に構成し、構成済みのサブスクリプションのみを使用できます。 マネージド ID マネージド ID を選択します。
Note
[攻撃パスの識別] プレイブックを設定すると、セッション スコープを定義するためのサブスクリプション ピッカーが表示されます。 ピッカーには、Recon Agent アプリケーションではなく、サインインしているユーザーが使用できるサブスクリプションが一覧表示されます。 プレイブックを開始するには、サインインしているユーザーがサブスクリプション全体への読み取りアクセス権を持つ必要があります。 この制限は、セッションの開始時にのみ適用されます。 セッションが開始されると、偵察エージェントは偵察に独自の ID を使用します。
両方のフィールドに入力し、[ セッションの開始] を選択します。
セッションが開き、 状態が [実行中 ] になります。 エージェントは、タスク リストの下書きを行い、作業を開始すると進行状況を表示します。
セッションの進行状況を監視する
セッションの実行中に、右側のパネルに次の情報が表示されます。
- 概要: セッションの概要と現在の状態が表示されます。
- 進行状況: 完了した手順を追跡します。 たとえば、タスクが完了すると、値が 0/1 から 1/1 に変わります。
- Recon Agent: セッションのアクティブなエージェントを識別します。
- 入力: 指定したターゲット環境とユース ケースが表示されます。
- 出力: これまでに生成されたファイルと、セッションの進行に合った更新を一覧表示します。
レポートを理解する
レポートには、次のセクションが含まれています。
- 主な調査結果: 悪意のあるコンテンツをホストする IP アドレスとその DNS 解決履歴など、最も重要なリスクとインジケーターをサポート証拠と共に要約します。 各発見は、証拠の強度を示すために、確認、可能性、または推論のラベルが付けられます。
- 資産インベントリ テーブル: 検出された資産を、インジケーター、種類、脅威の判定、信頼度、最初の表示の各列で一覧表示します。
- 攻撃パス グラフ: 攻撃者が使用できる現実的なパスと、資産、ID、アクセスの関係を示します。 たとえば、パスによって、組織、特権ユーザーの代理トークン、運用資産が接続される場合があります。 該当する場合、グラフは最も高速で、ステルス性が高く、最も広いルートを識別します。
- MITRE ATT&CK マッピング: 関連する各検索を MITRE ATT&CK 手法にマップします。 このレポートでは、現在の検出がカバーする攻撃対象領域の量を評価できるように、 該当する、 適用できない、または 不十分なデータ として手法が分類されます。
- 検出範囲のギャップ: 既存のDefender検出でカバーされていない攻撃パスを識別します。 カバーされている場合、レポートには関連する Defender のアラートと Kusto Query Language (KQL) のハンティング用クエリが含まれます。
Important
Recon Agent の出力は AI によって生成され、読み取り専用の API アクセスで使用できるデータに基づいています。 修復の計画やリスクの伝達に使用する前に、結果の正確性を確認してください。 レポートには、 "AI によって生成されたコンテンツが正しくない可能性があります。精度を確認してください。
Recon Agent の出力を表示する
セッションでは、Recon Agent の出力が Markdown ファイルとして表示されます。